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实现打开本地文件或文件夹
Mar 09 Javascript
jquery 事件执行检测代码
Dec 09 Javascript
基于Jquery实现的一个图片滚动切换
Jun 21 Javascript
文件编码导致jquery失效的解决方法
Jun 26 Javascript
jquery实现html页面 div 假分页有原理有代码
Sep 06 Javascript
详解js中构造流程图的核心技术JsPlumb(2)
Dec 08 Javascript
Jquery组件easyUi实现选项卡切换示例
Aug 23 Javascript
详解webpack分包及异步加载套路
Jun 29 Javascript
Vue中父组件向子组件通信的方法
Jul 11 Javascript
解决Jstree 选中父节点时被禁用的子节点也会选中的问题
Dec 27 Javascript
node.js中fs文件系统目录操作与文件信息操作
Feb 24 Javascript
layui自定义插件citySelect实现省市区三级联动选择
Jul 26 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会话(Session)实现用户登陆功能
2013/06/29 PHP
php基于base64解码图片与加密图片还原实例
2014/11/03 PHP
php中文繁体和简体相互转换的方法
2015/03/21 PHP
PHP实现的解汉诺塔问题算法示例
2018/08/06 PHP
PHP连接SQL server数据库测试脚本运行实例
2020/08/24 PHP
常见的5个PHP编码小陋习以及优化实例讲解
2021/02/27 PHP
使用jquery为table动态添加行的实现代码
2011/03/30 Javascript
Javascript获取HTML静态页面参数传递值示例
2013/08/18 Javascript
js弹窗返回值详解(window.open方式)
2014/01/11 Javascript
在JS中解析HTML字符串示例代码
2014/04/16 Javascript
javascript 寻找错误方法整理
2014/06/15 Javascript
jquery比较简洁的软键盘特效实现方法
2015/03/19 Javascript
javascript设计模式之module(模块)模式
2016/08/19 Javascript
纯js和css完成贪吃蛇小游戏demo
2016/09/01 Javascript
基于JavaScript实现Tab选项卡切换效果
2016/11/24 Javascript
实例解析angularjs的filter过滤器
2016/12/14 Javascript
JS简单实现表格排序功能示例
2016/12/20 Javascript
jQuery实现的回车触发按钮事件功能示例
2018/03/25 jQuery
微信小程序中使用ECharts 异步加载数据实现图表功能
2018/07/13 Javascript
vue异步axios获取的数据渲染到页面的方法
2018/08/09 Javascript
在Python中利用Into包整洁地进行数据迁移的教程
2015/03/30 Python
在Python的web框架中中编写日志列表的教程
2015/04/30 Python
python函数形参用法实例分析
2015/08/04 Python
Django在win10下的安装并创建工程
2017/11/20 Python
钉钉群自定义机器人消息Python封装的实例
2019/02/20 Python
详解Selenium+PhantomJS+python简单实现爬虫的功能
2019/07/14 Python
python打印9宫格、25宫格等奇数格 满足横竖斜相加和相等
2019/07/19 Python
html5教程实现Photoshop渐变色效果
2013/12/04 HTML / CSS
学生个人的自我评价分享
2013/11/05 职场文书
人事专员的岗位职责
2014/03/01 职场文书
资助贫困学生倡议书
2014/05/16 职场文书
构建和谐校园倡议书
2015/01/19 职场文书
军训结束新闻稿
2015/07/17 职场文书
青年干部培训班学习心得体会
2016/01/06 职场文书
Python批量解压&压缩文件夹的示例代码
2022/04/04 Python
SQL Server中的逻辑函数介绍
2022/05/25 SQL Server