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 相关文章推荐
IE6下出现JavaScript未结束的字符串常量错误的解决方法
Nov 21 Javascript
Underscore.js 的模板功能介绍与应用
Dec 24 Javascript
jQuery中add()方法用法实例
Jan 08 Javascript
javascript制作幻灯片(360度全景图片)
Jul 28 Javascript
js仿百度登录页实现拖动窗口效果
Mar 11 Javascript
AngularJS中的拦截器实例详解
Apr 07 Javascript
vue 实现axios拦截、页面跳转和token 验证
Jul 17 Javascript
JavaScript HTML DOM元素 节点操作汇总
Jul 29 Javascript
Vue中import from的来源及省略后缀与加载文件夹问题
Feb 09 Javascript
详细分析vue表单数据的绑定
Jul 20 Javascript
如何在Vue.JS中使用图标组件
Aug 04 Javascript
实现vuex原理的示例
Oct 21 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
Apache设置虚拟WEB
2006/10/09 PHP
js下函数般调用正则的方法附代码
2008/06/22 PHP
php实现在限定区域里自动调整字体大小的类实例
2015/04/02 PHP
PHP实现的oracle分页函数实例
2016/01/25 PHP
抛弃 PHP 代价太高
2016/04/26 PHP
php metaphone()函数的定义和用法
2016/05/15 PHP
利用php-cli和任务计划实现订单同步功能的方法
2017/05/03 PHP
php中目录操作opendir()、readdir()及scandir()用法示例
2019/06/08 PHP
js实现页面打印功能实例代码(附去页眉页脚功能代码)
2009/12/15 Javascript
从零开始学习jQuery (六) jquery中的AJAX使用
2011/02/23 Javascript
js nextSibling属性和previousSibling属性概述及使用注意
2013/02/16 Javascript
addEventListener 的用法示例介绍
2014/05/07 Javascript
js鼠标移动时禁止选中文字
2017/02/19 Javascript
angular directive的简单使用总结
2017/05/24 Javascript
vue router2.0二级路由的简单使用
2017/07/05 Javascript
使用AngularJS对表单提交内容进行验证的操作方法
2017/07/12 Javascript
浅谈JavaScript节流和防抖函数
2020/08/25 Javascript
JavaScript原生数组函数实例汇总
2020/10/14 Javascript
web.py获取上传文件名的正确方法
2014/08/26 Python
理解python正则表达式
2016/01/15 Python
python执行使用shell命令方法分享
2017/11/08 Python
Python数据结构dict常用操作代码实例
2020/03/12 Python
python实现excel公式格式化的示例代码
2020/12/23 Python
HTML+CSS+JavaScript实现图片3D展览的示例代码
2020/10/12 HTML / CSS
Sephora丝芙兰菲律宾官方网站:购买化妆品和护肤品
2017/04/05 全球购物
Casadei卡萨蒂官网:意大利奢侈鞋履品牌
2017/10/28 全球购物
Hush Puppies澳大利亚官网:舒适的男女休闲和正装鞋
2019/08/24 全球购物
门诊挂号室室长岗位职责
2013/11/27 职场文书
医学专业五年以上个人求职信
2013/12/03 职场文书
高三体育教学反思
2014/01/29 职场文书
表演方阵解说词
2014/02/08 职场文书
2015年社区文体活动总结
2015/03/25 职场文书
刑事起诉书范文
2015/05/19 职场文书
适合毕业生创业的项目怎么找?
2019/08/08 职场文书
八年级作文之我的母亲
2019/12/10 职场文书
详解Python中的进程和线程
2021/06/23 Python