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 相关文章推荐
js截取字符串的两种方法及区别详解
Nov 05 Javascript
JS动态日期时间的获取方法
Sep 28 Javascript
jQuery简单实现仿京东分类导航层效果
Jun 07 Javascript
Js 获取当前函数参数对象的实现代码
Jun 20 Javascript
JavaScript数据类型学习笔记分享
Sep 01 Javascript
JavaScript正则获取地址栏中参数的方法
Mar 02 Javascript
React-Router如何进行页面权限管理的方法
Dec 06 Javascript
Vue+webpack项目配置便于维护的目录结构教程详解
Oct 14 Javascript
JS多个表单数据提交下的serialize()应用实例分析
Aug 27 Javascript
浅谈小程序globalData的那些事儿
Nov 01 Javascript
微信小程序全选多选效果实现代码解析
Jan 21 Javascript
vue-cli3 热更新配置操作
Sep 18 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
source.php查看源文件
2006/12/09 PHP
PHP生成HTML静态页面实例代码
2008/08/31 PHP
Zend Framework连接Mysql数据库实例分析
2016/03/19 PHP
详解PHP中的序列化、反序列化操作
2017/03/21 PHP
nginx 设置多个站跨域
2021/03/09 Servers
经常用的图片在容器中的水平垂直居中实例
2007/06/10 Javascript
UpdatePanel和Jquery冲突的解决方法
2013/04/01 Javascript
JavaScript分析、压缩工具JavaScript Analyser
2014/12/31 Javascript
用jquery获取自定义的标签属性的值简单实例
2016/09/17 Javascript
微信小程序使用第三方库Underscore.js步骤详解
2016/09/27 Javascript
JavaScript表单验证开发
2016/11/23 Javascript
Javascript中return的使用与闭包详解
2017/01/11 Javascript
AngularJS前端页面操作之用户修改密码功能示例
2017/03/27 Javascript
详解如何在angular2中获取节点
2017/11/23 Javascript
JS实现标签滚动切换效果
2017/12/25 Javascript
JavaScript递归函数解“汉诺塔”算法代码解析
2018/07/05 Javascript
详释JavaScript执行环境与执行栈
2019/04/02 Javascript
JS把字符串格式的时间转换成几秒前、几分钟前、几小时前、几天前等格式
2019/07/10 Javascript
[50:24]VGJ.S vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
python和C语言混合编程实例
2014/06/04 Python
Python爬虫实例爬取网站搞笑段子
2017/11/08 Python
浅谈python 线程池threadpool之实现
2017/11/17 Python
我喜欢你 抖音表白程序python版
2019/04/07 Python
django rest framework vue 实现用户登录详解
2019/07/29 Python
基于Tensorflow批量数据的输入实现方式
2020/02/05 Python
解决pycharm同一目录下无法import其他文件
2020/02/12 Python
python让函数不返回结果的方法
2020/06/22 Python
django数据模型中null和blank的区别说明
2020/09/02 Python
Parfumdreams英国:香水和化妆品
2019/05/10 全球购物
新奥尔良珠宝:Mignon Faget
2020/11/23 全球购物
香港零食网购:上仓胃子
2020/06/08 全球购物
制药工程专业个人求职自荐信
2014/01/25 职场文书
项目施工员岗位职责
2014/03/09 职场文书
篝火晚会策划方案
2014/05/16 职场文书
纪念九一八事变演讲稿1000字
2014/09/14 职场文书
浅谈Golang 切片(slice)扩容机制的原理
2021/06/09 Golang