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 语法基础 想学习js的朋友可以看看
Dec 16 Javascript
js实现按一下删除键删除整个单词附demo
Sep 05 Javascript
深入理解javascript变量声明
Nov 20 Javascript
详解Bootstrap按钮
Jan 04 Javascript
一个简单不报错的summernote 图片上传案例
Jul 11 Javascript
详解angular 中的自定义指令之详解API
Jun 20 Javascript
详谈js对url进行编码和解码(三种方式的区别)
Aug 16 Javascript
JS实现的按钮点击颜色切换功能示例
Oct 19 Javascript
axios全局请求参数设置,请求及返回拦截器的方法
Mar 05 Javascript
vue项目打包之后背景样式丢失的解决方案
Jan 17 Javascript
详解javascript函数写法大全
Mar 25 Javascript
js 对象使用的小技巧实例分析
Nov 08 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/07/01 PHP
php版银联支付接口开发简明教程
2016/10/14 PHP
深入讲解PHP的对象注入(Object Injection)
2017/03/01 PHP
jcarousellite.js 基于Jquery的图片无缝滚动插件
2010/12/30 Javascript
nodejs的10个性能优化技巧
2014/07/15 NodeJs
加随机数引入脚本不让浏览器读取缓存
2014/09/04 Javascript
jquery简单图片切换显示效果实现方法
2015/01/14 Javascript
JavaScript判断一个字符串是否包含指定子字符串的方法
2015/03/18 Javascript
不依赖Flash和任何JS库实现文本复制与剪切附源码下载
2015/10/09 Javascript
Javascript实现通过选择周数显示开始日和结束日的实现代码
2016/05/30 Javascript
jQuery扩展实现text提示还能输入多少字节的方法
2016/11/28 Javascript
JS中如何实现点击a标签返回页面顶部的问题
2017/01/19 Javascript
Node.js如何响应Ajax的POST请求并且保存为JSON文件详解
2017/03/10 Javascript
AngularJS路由Ui-router模块用法示例
2017/05/29 Javascript
jQuery自动或手动图片切换效果
2017/10/11 jQuery
浅谈如何使用 webpack 优化资源
2017/10/20 Javascript
JS实现同一DOM元素上onClick事件与onDblClick事件并存的解决方法
2018/06/07 Javascript
JavaScript实现五子棋游戏的方法详解
2019/07/08 Javascript
微信小程序image图片加载完成监听
2019/08/31 Javascript
vue 使用vant插件做tabs切换和无限加载功能的实现
2020/11/04 Javascript
零基础写python爬虫之爬虫框架Scrapy安装配置
2014/11/06 Python
Python实现处理管道的方法
2015/06/04 Python
在arcgis使用python脚本进行字段计算时是如何解决中文问题的
2015/10/18 Python
Python实现的径向基(RBF)神经网络示例
2018/02/06 Python
使用apiDoc实现python接口文档编写
2019/11/19 Python
在pycharm中创建django项目的示例代码
2020/05/28 Python
详解基于Facecognition+Opencv快速搭建人脸识别及跟踪应用
2021/01/21 Python
印度低票价航空公司:GoAir
2017/10/11 全球购物
三陽商会官方网站:Sanyo iStore
2019/05/15 全球购物
大学自我鉴定
2013/12/20 职场文书
经贸韩语专业大学生职业规划
2014/02/14 职场文书
写求职信有哪些注意事项
2014/05/08 职场文书
党在我心中的演讲稿
2014/09/13 职场文书
2015年高二班主任工作总结
2015/05/25 职场文书
如何设计高效合理的MySQL查询语句
2021/05/26 MySQL
原生Javascript+HTML5一步步实现拖拽排序
2021/06/12 Javascript