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 相关文章推荐
javascript手工制作悬浮菜单
Feb 12 Javascript
探寻JavaScript中this指针指向
Apr 23 Javascript
举例讲解jQuery对DOM元素的向上遍历、向下遍历和水平遍历
Jul 07 Javascript
jQuery Dialog 打开时自动聚焦的解决方法(两种方法)
Nov 24 Javascript
canvas学习之API整理笔记(一)
Dec 29 Javascript
webstorm添加vue.js支持的方法教程
Jul 05 Javascript
关于vue.js发布后路径引用的问题解决
Aug 15 Javascript
JS实现百度网盘任意文件强制下载功能
Aug 31 Javascript
vue3.0 CLI - 2.6 - 组件的复用入门教程
Sep 14 Javascript
详解vue 数组和对象渲染问题
Sep 21 Javascript
vue实现二级导航栏效果
Oct 19 Javascript
vue中提示$index is not defined错误的解决方式
Sep 02 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 和 MySQL 基础教程(二)
2006/10/09 PHP
php mssql 时间格式问题
2009/01/13 PHP
浅谈php中urlencode与rawurlencode的区别
2016/09/05 PHP
PHP 微信扫码支付源代码(推荐)
2016/11/03 PHP
php基于ob_start(ob_gzhandler)实现网页压缩功能的方法
2017/02/18 PHP
PHP实现微信公众号验证Token的示例代码
2019/12/16 PHP
JavaScript 题型问答有答案参考
2010/02/17 Javascript
给页面渲染时间加速 干掉Dom Level 0 Event
2012/12/19 Javascript
node.js入门教程
2014/06/01 Javascript
vue深入解析之render function code详解
2017/07/18 Javascript
JS+canvas动态绘制饼图的方法示例
2017/09/12 Javascript
vue-awesome-swiper滑块插件使用方法详解
2017/11/27 Javascript
详解vue-cli3使用
2018/08/14 Javascript
微信小程序实现页面下拉刷新和上拉加载功能详解
2018/12/03 Javascript
微信小程序传值以及获取值方法的详解
2019/04/29 Javascript
微信小程序 Storage更新详解
2019/07/16 Javascript
vue项目中使用eslint+prettier规范与检查代码的方法
2020/01/16 Javascript
js实现微信聊天效果
2020/08/09 Javascript
如何在vue 中引入使用jquery
2020/11/10 jQuery
echarts饼图各个板块之间的空隙如何实现
2020/12/01 Javascript
python如何通过protobuf实现rpc
2016/03/06 Python
python实现给微信公众号发送消息的方法
2017/06/30 Python
python实现读取excel写入mysql的小工具详解
2017/11/20 Python
Python+OpenCv制作证件图片生成器的操作方法
2019/08/21 Python
python实现ftp文件传输系统(案例分析)
2020/03/20 Python
使用python操作lmdb对数据读取的实例
2020/12/11 Python
德国游戏机商店:Konsolenkost
2019/12/08 全球购物
探亲假请假条
2014/04/11 职场文书
公司应聘求职信
2014/06/21 职场文书
十佳标兵事迹材料
2014/08/18 职场文书
党的群众路线教育实践活动组织生活会发言材料
2014/10/17 职场文书
2014司机年终工作总结
2014/12/05 职场文书
个人求职自荐信范文
2015/03/06 职场文书
中学教师读书笔记
2015/07/01 职场文书
几款流行的HTML5 UI框架比较(小结)
2021/04/08 HTML / CSS
Mysql systemctl start mysqld报错的问题解决
2021/06/03 MySQL