He leído muchos artículos sobre este tema antes. Por ejemplo, use una variable para registrar el intervalo de ejecución. Siento que tengo que ir y masturbarme cada vez, lo cual es bastante agotador. Me gusta elegir herramientas antes de mover ladrillos. De hecho, la solución es muy simple. Iscroll en realidad intercepta eventos TouchStart y Touchend al hacer clic en el navegador. Cuando Touchend, use JS para activar el evento OnClick del elemento (la función_end). En la operación real, Touchend se ejecuta primero, y luego las funciones relacionadas con OnClick se ejecutan nuevamente. Esto crea un dolor de cabeza de activación dos veces en un solo clic. Esto no es un problema. La razón por la cual esto es un problema es que tenemos que mirar el código fuente de ISCROLL. La forma de resolver este problema es negarse a ejecutar la función por segunda vez. Y mi lógica es exactamente el caso. Después de ejecutar el código que desencadena el evento de clic en la función _END, podemos eliminar la función límite en el evento OnClick. Luego agregue este evento nuevamente después de unos cientos de milisegundos de tiempo. Por ejemplo:
La copia del código es la siguiente:
// Antes de procesar
<span onClick = "test ()"> Haga doble clic para probar </span>
// Después del procesamiento
<span onClick = "void (0)"> Haga doble clic para probar </span>
Después de eliminar la función relacionada con OnClick, esta segunda vez, naturalmente, no activará la función de prueba nuevamente. Para continuar usándolo la próxima vez, podemos usar SetTimeout para restaurar el contenido de OnClick Back.
El código fuente de IScroll modificado (aproximadamente 550 líneas a 570 líneas, en la función _END):
La copia del código es la siguiente:
that.DoubletapTimer = setTimeOut (function () {
que.doubletaptimer = null;
// Encuentra el último elemento tocado
Target = Point.Target;
while (Target.nodeType! = 1) Target = Target.ParentNode;
if (target.tagname! = 'select' && target.tagname! = 'input' && target.tagname! = 'textarea') {
ev = doc.createEvent ('MouseEvents');
ev.initMouseEvent ('Haga clic', True, True, E.View, 1,
Point.ScreenX, Point.Screeny, Point.clientx, Point.clienty,
E.CtrlKey, E.Altkey, E.ShiftKey, E.Metakey,
0, nulo);
ev._fake = true;
Target.dispatchEvent (EV);
/** El siguiente código es nuevo código **/
// Encuentra el elemento que une el evento de clic.
var obj = $ (Target) .Attr ("OnClick")! = NULL? $ (Target): $ (Target) .Parents ("[OnClick]") [0];
if (obj! = null) {
var clickContent = $ (obj) .Attr ("onClick");
if (clickContent! = "void (0)") {
// Use nuevos atributos para almacenar la función de clic original
$ (obj) .Attr ("Data-clickbak", $ (obj) .attr ("onclick"));
// Cambiar el valor del atributo OnClick.
$ (obj) .attr ("onclick", "nulo (0)");
// evitar clics violentos
if (that.hashbox.length> 0) {
para (var _i = 0; _i <que.hashbox.length; _i ++)
{
if (that.hashbox [_i] == $ (obj)) {
que.hashbox.splice (_i, 1);
romper;
}
}
}
that.hashbox.push ($ (obj));
que._clickback ();
}
}//fin
}
}, que.options.zoom? 250: 0);
_Clickback Función y fragmento de código Hashbox (agregado antes de la función _END)
La copia del código es la siguiente:
Hashbox: [],
/*Restaurar el evento del objeto hecho clic*/
_Clickback: function () {
var que = esto;
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);
}
Por supuesto, también se puede implementar a través de una función pública sin modificar el código fuente de ISCROLL.
Lo anterior se trata de este artículo. Espero que sea útil para todos aprender a usar el control deslizante ISCROLL.