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 相关文章推荐
IE JS编程需注意的内存释放问题
Jun 23 Javascript
js模拟点击事件实现代码
Nov 06 Javascript
instanceof和typeof运算符的区别详解
Jan 06 Javascript
纯js实现仿QQ邮箱弹出确认框
Apr 29 Javascript
jQuery实现的类似淘宝网站搜索框样式代码分享
Aug 24 Javascript
Sortable.js拖拽排序使用方法解析
Nov 04 Javascript
Vue.js实战之通过监听滚动事件实现动态锚点
Apr 04 Javascript
vue 自定义组件 v-model双向绑定、 父子组件同步通信的多种写法
Nov 27 Javascript
React Component存在的几种形式详解
Nov 06 Javascript
微信小程序实现点击按钮后修改颜色
Dec 05 Javascript
关于ES6尾调用优化的使用
Sep 11 Javascript
OpenLayers3实现地图鹰眼以及地图比例尺的添加
Sep 25 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实现的简易版图片相似度比较
2015/01/07 PHP
PHP批量生成图片缩略图的方法
2015/06/18 PHP
微信 getAccessToken方法详解及实例
2016/11/23 PHP
通过JAVASCRIPT读取ASP设定的COOKIE
2006/11/24 Javascript
jsTree树控件(基于jQuery, 超强悍)[推荐]
2009/09/01 Javascript
中文路径导致unitpngfix.js不正常的解决方法
2013/06/26 Javascript
php显示当前文件所在的文件以及文件夹所有文件以树形展开
2013/12/13 Javascript
JAVA四种基本排序方法实例总结
2015/07/24 Javascript
Bootstrap3.0建站教程(一)之bootstrap表单元素排版
2016/06/01 Javascript
JS实现简单的右下角弹出提示窗口完整实例
2016/06/21 Javascript
Javascript 动态改变imput type属性
2016/11/01 Javascript
用jQuery实现可输入多选下拉组合框实例代码
2017/01/18 Javascript
原生javascript移动端滑动banner效果
2017/03/10 Javascript
vue3.0 CLI - 2.1 -  component 组件入门教程
2018/09/14 Javascript
微信小程序去除左上角返回键的实现方法
2020/03/06 Javascript
[02:44]DOTA2英雄基础教程 魅惑魔女
2014/01/07 DOTA
python33 urllib2使用方法细节讲解
2013/12/03 Python
在Python中使用第三方模块的教程
2015/04/27 Python
Python压缩解压缩zip文件及破解zip文件密码的方法
2015/11/04 Python
Python中的左斜杠、右斜杠(正斜杠和反斜杠)
2016/08/30 Python
Python实现定时备份mysql数据库并把备份数据库邮件发送
2018/03/08 Python
python实现超市扫码仪计费
2018/05/30 Python
kafka-python批量发送数据的实例
2018/12/27 Python
Python实现监控Nginx配置文件的不同并发送邮件报警功能示例
2019/02/26 Python
在django-xadmin中APScheduler的启动初始化实例
2019/11/15 Python
解决jupyter notebook 出现In[*]的问题
2020/04/13 Python
Python并发请求下限制QPS(每秒查询率)的实现代码
2020/06/05 Python
CSS3新增布局之: flex详解
2020/06/18 HTML / CSS
CSS3 实现弹跳的小球动画
2020/10/26 HTML / CSS
Rhone官方网站:男士运动服装、健身服装和高级运动服
2019/05/01 全球购物
产假请假条
2014/04/10 职场文书
党员对照检查材料
2014/09/22 职场文书
2014年路政工作总结
2014/12/10 职场文书
公司员工辞职信范文
2015/05/12 职场文书
初中生活随笔
2015/08/15 职场文书
vue基于Teleport实现Modal组件
2021/05/31 Vue.js