Eu já li muitos artigos sobre esse problema antes. Por exemplo, use uma variável para registrar o intervalo de execução. Sinto que tenho que ir e me masturbar sempre, o que é bastante cansativo. Eu gosto de escolher ferramentas antes de mover tijolos. De fato, a solução é muito simples. O ISCROLL realmente intercepta eventos TouchStart e Toukend ao clicar no navegador. Quando o Toukend, use o JS para acionar o evento OnClick do elemento (o function_end). Na operação real, o Touchend é executado pela primeira vez e, em seguida, as funções relacionadas ao OnClick são executadas novamente. Isso cria uma dor de cabeça de acionar duas vezes em um clique. Isso não é um problema. A razão pela qual isso é um problema é que precisamos olhar para o código -fonte do ISCROLL. A maneira de resolver esse problema é se recusar a executar a função pela segunda vez. E minha lógica é exatamente o caso. Depois de executar o código que aciona o evento de clique na função _end, podemos remover a função limitada no evento OnClick. Em seguida, adicione este evento novamente depois de algumas centenas de milissegundos de tempo. Por exemplo:
A cópia do código é a seguinte:
// antes do processamento
<span onclick = "test ()"> clique duas vezes para testar </span>
// após o processamento
<span onclick = "void (0)"> clique duas vezes para testar </span>
Depois de remover a função relacionada ao OnClick, nesta segunda vez não acionará a função de teste novamente. Para continuar usando -o na próxima vez, podemos usar o setTimeout para restaurar o conteúdo do OnClick Back.
O código -fonte ISCROLL modificado (cerca de 550 linhas para 570 linhas, na função _end):
A cópia do código é a seguinte:
that.doubleTaptimer = setTimeout (function () {
that.doubleTapatiMer = null;
// Encontre o ú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 ('clique', 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);
/** O código a seguir é novo código **/
// Encontre o elemento que vincula o evento de clique.
var obj = $ (Target) .attr ("OnClick")! = NULL? $ (Target): $ (Target) .Parents ("[OnClick]") [0];
if (obj! = null) {
var clickContent = $ (obj) .attr ("OnClick");
if (clickcontent! = "void (0)") {
// Use novos atributos para armazenar a função de clique original
$ (obj) .attr ("Data-clickbak", $ (obj) .attr ("OnClick"));
// altere o valor do atributo onclick.
$ (obj) .attr ("OnClick", "void (0)");
// impedem cliques violentos
if (that.hashbox.length> 0) {
para (var _i = 0; _i <that.hashbox.length; _i ++)
{
if (that.hashbox [_i] == $ (obj)) {
that.hashbox.splice (_i, 1);
quebrar;
}
}
}
that.hashbox.push ($ (obj));
that._Clickback ();
}
}//fim
}
}, that.options.zoom? 250: 0);
_Clickback Função e trenó de código de hashbox (adicionado antes da função _END)
A cópia do código é a seguinte:
Hashbox: [],
/*Restaure o evento do objeto clicado*/
_Clickback: function () {
var que = this;
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);
}
Obviamente, ele também pode ser implementado por meio de uma função pública sem modificar o código -fonte do ISCROLL.
O acima é tudo sobre este artigo. Espero que seja útil que todos aprendam a usar o controle deslizante do ISCROLL.