时间:2021-05-28
之前也看了很多朋友的文章里有讲这个问题。比如使用一个变量记录执行的间隔时间什么的。感觉每次都要去撸一下,比较累人。本人喜欢搬砖前先选工具。其实解决这个方法很简单。iScroll呢其实是截获了点击浏览器时的touchstart和touchend事件。在touchend的时候使用js去触发元素的onclick事件(_end这个函数)。而在实际操作中,先执行了touchend,然后再执行了一次onclick的相关函数。这样就形成了头疼的一次点击两次触发。这本来就一个不是问题的问题。之所以说这是个问题,是因为这样是我们不得不去看一看iScroll的源代码。解决这个问题的途径就是拒绝第二次执行函数。而我的逻辑也正是如此。我们可以在执行完_end函数中的触发click事件的代码后,移除onclick事件上绑定的函数。然后在定时几百毫秒之后在重新把这个事件添加上去。举个例子:
复制代码 代码如下:
//处理之前
<span onclick="test()">双击测试</span>
//处理之后
<span onclick="void(0)">双击测试</span>
在移除onclick相关函数之后这个第二次就自然不会再触发test函数了。为了下一次还能继续使用我们可以使用setTimeout的方式把onclick的内容还原回去。
改造后的iscroll源代码(约550行~570行的样子,_end函数中):
复制代码 代码如下:
that.doubleTapTimer = setTimeout(function () {
that.doubleTapTimer = null;
// Find the last touched element
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('click', true, true, 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);
/**以下代码为新增代码**/
//找到绑定click事件的元素。
var obj = $(target).attr("onclick") != null ? $(target) : $(target).parents("[onclick]")[0];
if (obj != null) {
var clickContent = $(obj).attr("onclick");
if (clickContent != "void(0)") {
//利用新的属性来存储原有的click函数
$(obj).attr("data-clickbak", $(obj).attr("onclick"));
//改变onclick属性值。
$(obj).attr("onclick", "void(0)");
//防止暴力点击
if (that.hashBox.length>0) {
for (var _i = 0; _i < that.hashBox.length; _i++)
{
if (that.hashBox[_i] == $(obj)) {
that.hashBox.splice(_i, 1);
break;
}
}
}
that.hashBox.push($(obj));
that._clickBack();
}
}//end
}
}, that.options.zoom ? 250 : 0);
_clickBack函数及hashBox代码片段(加在_end函数之前)
复制代码 代码如下:
hashBox: [],
_clickBack: function () {
var that = 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);
}
当然,也可以不修改 iscroll源代码,通过一个公共函数来实现。
以上就是本文所讲述的全部内容了,希望对大家学习使用iscroll滑动控件有所帮助
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
1.onchange事件与onpropertychange事件的区别:onchange事件在内容改变(两次内容有可能相等)且失去焦点时触发;onproperty
什么是better-scrollbetter-scroll是一个移动端滚动的解决方案,它是基于iscroll的重写,它和iscroll的主要区别在这里。bett
什么是better-scrollbetter-scroll是一个移动端滚动的解决方案,它是基于iscroll的重写,它和iscroll的主要区别在这里。bet
起初用js的onkeyup事件,但始终没能触发。该事件不知道别的什么地方监视了,js的事件有传递,也可以阻断,蛮麻烦,情况太多。找了好久,终于找到了一种解决方案
解决iOS设备上链接要点击两次才跳转的问题昨天接到用户反馈,iOS设备上链接要点击两次才跳转,这个问题怎么能忍的下去,解决办法如下:确保你的HTML页面添加了以