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 相关文章推荐
分享一个自己写的table表格排序js插件(高效简洁)
Oct 29 Javascript
jQuery源码解读之removeAttr()方法分析
Feb 20 Javascript
使用jquery插件qrcode生成二维码
Oct 22 Javascript
Node.js+Express配置入门教程详解
May 19 Javascript
Bootstrap表单布局样式源代码
Jul 04 Javascript
详解JS中的attribute属性
Apr 25 Javascript
vue滚动轴插件better-scroll使用详解
Oct 17 Javascript
vuejs实现递归树型菜单组件
Jan 13 Javascript
详谈vue+webpack解决css引用图片打包后找不到资源文件的问题
Mar 06 Javascript
jQuery选择器选中最后一个元素,倒数第二个元素操作示例
Dec 10 jQuery
vue设置导航栏、侧边栏为公共页面的例子
Nov 01 Javascript
vue中实现拖动调整左右两侧div的宽度的示例代码
Jul 22 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
Laravel执行migrate命令提示:No such file or directory的解决方法
2016/03/16 PHP
laravel中命名路由的使用方法
2017/02/24 PHP
对laravel的session获取与存取方法详解
2019/10/08 PHP
tp5 实现列表数据根据状态排序
2019/10/18 PHP
javascript 循环读取JSON数据的代码
2010/07/17 Javascript
IFrame跨域高度自适应实现代码
2012/08/16 Javascript
javascript简单实现滑动菜单效果的方法
2015/07/27 Javascript
JavaScript中的定时器之Item23的合理使用
2015/10/30 Javascript
vue.js实例todoList项目
2017/07/07 Javascript
JS实现匀加速与匀减速运动的方法示例
2017/09/04 Javascript
vue全局组件与局部组件使用方法详解
2018/03/29 Javascript
js实现购物车功能
2018/06/12 Javascript
浅谈JavaScript 代码整洁之道
2018/10/23 Javascript
vue通信方式EventBus的实现代码详解
2019/06/10 Javascript
详解webpack引用jquery(第三方模块)的三种办法
2019/08/21 jQuery
uni-app使用countdown插件实现倒计时
2020/11/01 Javascript
[03:56]还原FTP电影首映式 DOTA2群星拼出遗迹世界
2014/03/26 DOTA
跟老齐学Python之玩转字符串(2)更新篇
2014/09/28 Python
使用Python脚本和ADB命令实现卸载App
2017/02/10 Python
python爬虫入门教程--正则表达式完全指南(五)
2017/05/25 Python
python dataframe 输出结果整行显示的方法
2018/06/14 Python
可能是最全面的 Python 字符串拼接总结【收藏】
2018/07/09 Python
如何在python中实现随机选择
2019/11/02 Python
PyCharm 2019.3发布增加了新功能一览
2019/12/08 Python
如何将json数据转换为python数据
2020/09/04 Python
简单聊聊H5的pushState与replaceState的用法
2018/04/03 HTML / CSS
美国最大点评网站:Yelp
2018/02/14 全球购物
Groupon比利时官方网站:特卖和网上购物高达-70%
2019/08/09 全球购物
什么是ESB?请介绍一下ESB?
2015/05/27 面试题
数据员岗位职责
2013/11/19 职场文书
幼儿园师德师风学习材料
2014/05/29 职场文书
学校总务处领导干部个人对照检查材料思想汇报
2014/10/06 职场文书
运动会通讯稿50字
2015/07/20 职场文书
学习杨善洲同志先进事迹心得体会
2016/01/23 职场文书
python本地文件服务器实例教程
2021/05/02 Python
Android Studio实现简易进制转换计算器
2022/05/20 Java/Android