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 中debug方式
Feb 07 Javascript
用js小类库获取浏览器的高度和宽度信息
Jan 15 Javascript
jquery队列queue与原生模仿其实现方法分享
Mar 25 Javascript
js图片翻书效果代码分享
Aug 20 Javascript
浅谈jQuery中的eq()与DOM中element.[]的区别
Oct 28 Javascript
jQuery插件扩展操作入门示例
Jan 16 Javascript
js定时器+简单的动画效果实例
Nov 10 Javascript
jQuery实现鼠标响应式淘宝动画效果示例
Feb 13 jQuery
jQuery事件多次绑定与解绑问题实例分析
Feb 19 jQuery
js中的面向对象之对象常见创建方法详解
Dec 16 Javascript
JS document内容及样式操作完整示例
Jan 14 Javascript
小程序开发之模态框组件封装
Apr 23 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中使用Oracle数据库(4)
2006/10/09 PHP
浅析PHP水印技术
2007/02/14 PHP
几个有用的php字符串过滤,转换函数代码
2012/05/01 PHP
PHP之sprintf函数用法详解
2014/11/12 PHP
基于Swoole实现PHP与websocket聊天室
2016/08/03 PHP
利用PHP将图片转换成base64编码的实现方法
2016/09/13 PHP
PHP实现的简单适配器模式示例
2017/06/22 PHP
PHP实现的mysql主从数据库状态检测功能示例
2017/07/20 PHP
PHP实现的一致性Hash算法详解【分布式算法】
2018/03/31 PHP
解析Javascript中难以理解的11个问题
2013/12/09 Javascript
javascript判断并获取注册表中可信任站点的方法
2015/06/01 Javascript
jquery实现简单的瀑布流布局
2016/12/11 Javascript
jquery easyui dataGrid动态改变排序字段名的方法
2017/03/02 Javascript
vue实现商城购物车功能
2017/11/27 Javascript
Node.js 利用cheerio制作简单的网页爬虫示例
2018/03/01 Javascript
vue中axios解决跨域问题和拦截器的使用方法
2018/03/07 Javascript
基于vue实现可搜索下拉框定制组件
2020/03/26 Javascript
Vue解析剪切板图片并实现发送功能
2020/02/04 Javascript
原生JS实现天气预报
2020/06/16 Javascript
javascript如何使用函数random来实现课堂随机点名方法详解
2020/07/28 Javascript
[01:10:58]KG vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
python对excel文档去重及求和的实例
2018/04/18 Python
Pipenv一键搭建python虚拟环境的方法
2018/05/22 Python
Python split() 函数拆分字符串将字符串转化为列的方法
2019/07/16 Python
Python异步编程之协程任务的调度操作实例分析
2020/02/01 Python
windows下的pycharm安装及其设置中文菜单
2020/04/23 Python
简述 Python 的类和对象
2020/08/21 Python
英国在线潜水商店:Simply Scuba
2019/03/25 全球购物
编写strcpy函数
2014/06/24 面试题
环保倡议书格式范文
2014/05/14 职场文书
诉讼授权委托书范本
2014/10/05 职场文书
国庆放假通知怎么写
2015/07/30 职场文书
护士自荐信范文(2016推荐篇)
2016/01/28 职场文书
创业计划书之熟食店
2019/10/16 职场文书
vue实力踩坑之push当前页无效
2022/04/10 Vue.js
vue/cli 配置动态代理无需重启服务的方法
2022/05/20 Vue.js