iScroll中事件点击触发两次解决方案


Posted in Javascript onMarch 11, 2015

之前也看了很多朋友的文章里有讲这个问题。比如使用一个变量记录执行的间隔时间什么的。感觉每次都要去撸一下,比较累人。本人喜欢搬砖前先选工具。其实解决这个方法很简单。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滑动控件有所帮助

Javascript 相关文章推荐
仿猪八戒网左下角的文字滚动效果
Oct 28 Javascript
实现只能输入数字的input不用replace方法
Sep 12 Javascript
详解Bootstrap四种图片样式
Jan 04 Javascript
jQuery遍历DOM节点操作之filter()方法详解
Apr 14 Javascript
JavaScript弹窗基础篇
Apr 27 Javascript
jQuery插件zTree实现的基本树与节点获取操作示例
Mar 08 Javascript
jQuery中用on绑定事件时需注意的事项
Mar 19 Javascript
原生JS+Canvas实现五子棋游戏实例
Jun 19 Javascript
javascript设计模式 ? 职责链模式原理与用法实例分析
Apr 16 Javascript
公众号SVG动画交互实战代码
May 31 Javascript
Vue 监听元素前后变化值实例
Jul 29 Javascript
Ant design vue table 单击行选中 勾选checkbox教程
Oct 24 Javascript
node-webkit打包成exe文件被360误报木马的解决方法
Mar 11 #Javascript
javascript结合Canvas 实现简易的圆形时钟
Mar 11 #Javascript
解决node-webkit 不支持html5播放mp4视频的方法
Mar 11 #Javascript
javascript与css3动画结合使用小结
Mar 11 #Javascript
jquery实现textarea 高度自适应
Mar 11 #Javascript
jQuery简单实现禁用右键菜单
Mar 10 #Javascript
jQuery判断数组是否包含了指定的元素
Mar 10 #Javascript
You might like
由php if 想到的些问题
2008/03/22 PHP
PHP的运行机制与原理(底层)
2015/11/16 PHP
Yii遍历行下每列数据的方法
2016/10/17 PHP
PHP的cookie与session原理及用法详解
2019/09/27 PHP
指定js可访问其它域名的cookie的方法
2007/09/18 Javascript
最佳6款用于移动网站开发的jQuery 图片滑块插件小结
2012/07/20 Javascript
js 3秒后跳转页面的实现代码
2014/03/10 Javascript
jQuery中ajax的get()方法用法实例
2014/12/26 Javascript
JavaScript中使用Callback控制流程介绍
2015/03/16 Javascript
javascript实现表格增删改操作实例详解
2015/05/15 Javascript
javascript获取select标签选中的值
2016/06/04 Javascript
利用Vue.js+Node.js+MongoDB实现一个博客系统(附源码)
2017/04/24 Javascript
AngularJs 常用的过滤器
2017/05/15 Javascript
老生常谈JavaScript面向对象基础与this指向问题
2017/10/16 Javascript
微信小程序跨页面数据传递事件响应实现过程解析
2019/12/19 Javascript
JS中this的4种绑定规则详解
2020/02/04 Javascript
多页vue应用的单页面打包方法(内含打包模式的应用)
2020/06/11 Javascript
Element中Slider滑块的具体使用
2020/07/29 Javascript
JavaScript常用工具函数汇总(浏览器环境)
2020/09/17 Javascript
vue+springboot+element+vue-resource实现文件上传教程
2020/10/21 Javascript
Python实现PS滤镜的万花筒效果示例
2018/01/23 Python
Python实现XML文件解析的示例代码
2018/02/05 Python
利用python将pdf输出为txt的实例讲解
2018/04/23 Python
python将秒数转化为时间格式的实例
2018/09/16 Python
Django学习之文件上传与下载
2019/10/06 Python
ubuntu 18.04 安装opencv3.4.5的教程(图解)
2019/11/04 Python
pycharm-professional-2020.1下载与激活的教程
2020/09/21 Python
配置管理计划的主要内容有哪些
2014/06/20 面试题
J2EE面试题
2016/03/14 面试题
laravel使用redis队列实例讲解
2021/03/23 PHP
社团成立邀请函
2014/01/08 职场文书
生产部厂长职位说明书
2014/03/03 职场文书
幼儿园辞职书
2015/02/26 职场文书
收入证明怎么写
2015/06/12 职场文书
大学生村官工作心得体会
2016/01/23 职场文书
win server2012 r2服务器共享文件夹如何设置
2022/06/21 Servers