لقد قرأت العديد من المقالات حول هذه القضية من قبل. على سبيل المثال ، استخدم متغيرًا لتسجيل فاصل التنفيذ. أشعر أنني يجب أن أذهب والاستمناء في كل مرة ، وهو أمر متعب للغاية. أحب اختيار الأدوات قبل نقل الطوب. في الواقع ، الحل بسيط للغاية. يعترض ISCroll فعليًا الأحداث التي تعمل باللمس والمس عند النقر على المتصفح. عند اللمس ، استخدم JS لتشغيل حدث onclick للعنصر (الدالة _end). في العملية الفعلية ، يتم تنفيذ Touchend لأول مرة ، ثم يتم تنفيذ الوظائف ذات الصلة onClick مرة أخرى. هذا يخلق صداعًا من التشغيل مرتين بنقرة واحدة. هذه ليست مشكلة. السبب في أن هذه المشكلة هي أن علينا أن ننظر إلى الكود المصدري لـ Iscroll. طريقة حل هذه المشكلة هي رفض تنفيذ الوظيفة للمرة الثانية. ومنطقي هو بالضبط الحالة. بعد تنفيذ الكود الذي يؤدي إلى حدوث حدث نقرة في وظيفة _end ، يمكننا إزالة الوظيفة المرتبطة بحدث OnClick. ثم أضف هذا الحدث مرة أخرى بعد بضع مئات من المللي ثانية من الوقت. على سبيل المثال:
نسخة الكود كما يلي:
// قبل المعالجة
<span onClick = "Test ()"> انقر نقرًا مزدوجًا لاختبار </span>
// بعد المعالجة
<span onClick = "void (0)"> انقر نقرًا مزدوجًا للاختبار </span>
بعد إزالة الوظيفة ذات الصلة بالعلم ، لن تؤدي هذه المرة الثانية بشكل طبيعي إلى تشغيل وظيفة الاختبار مرة أخرى. من أجل متابعة استخدامه في المرة القادمة ، يمكننا استخدام SetTimeout لاستعادة محتوى Back Onclick.
رمز مصدر ISCROLL المعدل (حوالي 550 سطر إلى 570 سطرًا ، في وظيفة _end):
نسخة الكود كما يلي:
that.doubletaptimer = setTimeout (function () {
that.doubletaptimer = null ؛
// ابحث عن العنصر الأخير
الهدف = point.target ؛
بينما (target.nodeType! = 1) target = target.parentNode ؛
if (target.tagname! = 'حدد' && target.tagname! = 'input' && target.tagname! = 'textarea') {
ev = doc.createEvent ('mouseevents') ؛
ev.Initmousevent ('click' ، true ، true ، e.view ، 1 ،
point.screenx ، point.screeny ، point.clientx ، point.clienty ،
E.Ctrlkey ، E.Altkey ، E.Shiftkey ، E.Metakey ،
0 ، فارغة) ؛
ev._fake = true ؛
Target.dispatchevent (EV) ؛
/** الرمز التالي هو رمز جديد **/
// ابحث عن العنصر الذي يربط حدث النقر.
var obj = $ (target) .Attr ("onClick")! = null؟ $ (Target): $ (Target) .Parents ("[onClick]") [0] ؛
if (obj! = null) {
var clickContent = $ (OBJ) .ATTR ("onClick") ؛
if (clickContent! = "void (0)") {
// استخدم سمات جديدة لتخزين وظيفة النقر الأصلية
$ (OBJ) .ATTR ("data-clickbak" ، $ (OBJ) .ATTR ("onClick")) ؛
// تغيير قيمة سمة onclick.
$ (OBJ) .ATTR ("onClick" ، "void (0)") ؛
// منع النقرات العنيفة
if (that.hashbox.length> 0) {
لـ (var _i = 0 ؛ _i <that.hashbox.length ؛ _i ++)
{
if (that.hashbox [_i] == $ (obj)) {
that.hashbox.splice (_i ، 1) ؛
استراحة؛
}
}
}
that.hashbox.push ($ (obj)) ؛
that._clickback () ؛
}
}//نهاية
}
} ، that.options.zoom؟ 250: 0) ؛
_ clickback وقص رمز Hashbox (تمت إضافته قبل دالة _end)
نسخة الكود كما يلي:
Hashbox: [] ،
/*استعادة حدث الكائن الذي تم النقر عليه*/
_clickback: function () {
var that = هذا ؛
setTimeout (function () {
if (that.hashbox.length> 0) {
var obj = that.hashbox.pop () ؛
obj.attr ("onClick" ، obj.attr ("data-clickbak")) ؛
if (that.hashbox.length> 0) that._clickback () ؛
}
} ، 500) ؛
}
بالطبع ، يمكن تنفيذها أيضًا من خلال وظيفة عامة دون تعديل رمز مصدر ISCROLL.
ما سبق هو كل شيء عن هذا المقال. آمل أن يكون من المفيد للجميع أن يتعلموا استخدام التحكم المنزلق Iscroll.