Saya telah membaca banyak artikel tentang masalah ini sebelumnya. Misalnya, gunakan variabel untuk merekam interval eksekusi. Saya merasa harus pergi dan melakukan masturbasi setiap saat, yang cukup melelahkan. Saya suka memilih alat sebelum memindahkan batu bata. Faktanya, solusinya sangat sederhana. IsCroll sebenarnya mencegat acara TouchStart dan Touchend saat mengklik di browser. Saat Touchend, gunakan JS untuk memicu acara OnClick dari elemen (fungsi_end). Dalam operasi yang sebenarnya, Touchend pertama kali dieksekusi, dan kemudian fungsi terkait OnClick dieksekusi lagi. Ini menciptakan sakit kepala memicu dua kali dalam satu klik. Ini bukan masalah. Alasan mengapa ini menjadi masalah adalah karena kita harus melihat kode sumber Iscroll. Cara untuk menyelesaikan masalah ini adalah dengan menolak untuk menjalankan fungsi untuk kedua kalinya. Dan logika saya tepatnya. Setelah menjalankan kode yang memicu acara klik di fungsi _end, kami dapat menghapus fungsi yang terikat pada acara OnClick. Kemudian tambahkan acara ini lagi setelah beberapa ratus milidetik waktu. Misalnya:
Salinan kode adalah sebagai berikut:
// sebelum diproses
<span onClick = "test ()"> Klik dua kali untuk menguji </span>
// Setelah diproses
<span onClick = "void (0)"> Klik dua kali untuk menguji </span>
Setelah menghapus fungsi terkait OnClick, kedua kalinya ini secara alami tidak akan memicu fungsi uji lagi. Untuk terus menggunakannya lain kali, kita dapat menggunakan SetTimeout untuk mengembalikan konten OnClick kembali.
Kode Sumber IsCroll yang dimodifikasi (sekitar 550 baris hingga 570 baris, dalam fungsi _end):
Salinan kode adalah sebagai berikut:
That.DoubleTaptimer = setTimeOut (function () {
that.doubleTaptimer = null;
// Temukan elemen yang disentuh terakhir
target = point.target;
while (target.nodetype! = 1) target = target.parentnode;
if (target.tagname! = 'pilih' && target.tagname! = 'input' && target.tagname! = 'textarea') {
EV = Doc.CreateEvent ('MouseEvents');
EV.InitMouseEvent ('Klik', Benar, Benar, E.View, 1,
point.screenx, point.screeny, point.clientx, point.clienty,
E.Ctrlkey, E.Altkey, E.Shiftkey, E.Metakey,
0, null);
ev._fake = true;
Target.DispatchEvent (EV);
/** Kode berikut adalah kode baru **/
// Temukan elemen yang mengikat acara klik.
var obj = $ (target) .attr ("onClick")! = null? $ (target): $ (target) .parents ("[onClick]") [0];
if (obj! = null) {
var clickcontent = $ (obj) .attr ("ontClick");
if (clickContent! = "void (0)") {
// Gunakan atribut baru untuk menyimpan fungsi klik asli
$ (OBJ) .attr ("Data-Clickbak", $ (OBJ) .attr ("OnClick"));
// Ubah nilai atribut OnClick.
$ (OBJ) .attr ("OnClick", "void (0)");
// Cegah klik kekerasan
if (that.hashbox.length> 0) {
untuk (var _i = 0; _i <that.hashbox.length; _i ++)
{
if (that.hashbox [_i] == $ (obj)) {
that.hashbox.splice (_i, 1);
merusak;
}
}
}
that.hashbox.push ($ (obj));
that._clickback ();
}
}//akhir
}
}, that.options.zoom? 250: 0);
Fungsi _klickback dan cuplikan kode hashbox (ditambahkan sebelum fungsi _end)
Salinan kode adalah sebagai berikut:
Hashbox: [],
/*Kembalikan peristiwa objek yang diklik*/
_clickback: function () {
var itu = ini;
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);
}
Tentu saja, itu juga dapat diimplementasikan melalui fungsi publik tanpa memodifikasi kode sumber isCroll.
Di atas adalah semua tentang artikel ini. Saya harap akan sangat membantu bagi semua orang untuk belajar menggunakan kontrol geser iscroll.