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 调试javascript的工具
Apr 29 Javascript
Array, Array Constructor, for in loop, typeof, instanceOf
Sep 13 Javascript
深入理解JavaScript中的传值与传引用
Dec 09 Javascript
关于JavaScript命名空间的一些心得
Jun 07 Javascript
JavaScript中输出标签的方法
Aug 27 Javascript
js实现交换运动效果的方法
Apr 10 Javascript
详谈AngularJs 控制器、数据绑定、作用域
Jul 09 Javascript
Angular通过angular-cli来搭建web前端项目的方法
Jul 27 Javascript
移动端H5页面返回并刷新页面(BFcache)的方法
Nov 06 Javascript
JS实现星星海特效
Dec 24 Javascript
ant design vue导航菜单与路由配置操作
Oct 28 Javascript
微信小程序抽奖组件的使用步骤
Jan 11 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
laravel 5异常错误:FatalErrorException in Handler.php line 38的解决
2017/10/12 PHP
Ajax+PHP实现的删除数据功能示例
2019/02/12 PHP
键盘 keycode的值 javascript时触发事件时很有用的要素
2009/11/02 Javascript
js 关键词高亮(根据ID/tag高亮关键字)案例介绍
2013/01/21 Javascript
jQuery div层的放大与缩小简单实现代码
2013/03/28 Javascript
JS实现很酷的EMAIL地址添加功能实例
2015/02/28 Javascript
jQuery控制cookie过期时间的方法
2015/04/07 Javascript
基于jquery实现导航菜单高亮显示(两种方法)
2015/08/23 Javascript
JavaScript中访问id对象 属性的方式访问属性(实例代码)
2016/10/28 Javascript
jQuery Validate 校验多个相同name的方法
2017/05/18 jQuery
Node.js学习之查询字符串解析querystring详解
2017/09/28 Javascript
微信小程序基于本地缓存实现点赞功能的方法
2017/12/18 Javascript
JS实现的Object数组去重功能示例【数组成员为Object对象】
2019/02/01 Javascript
angula中使用iframe点击后不执行变更检测的问题
2020/05/10 Javascript
python实现巡检系统(solaris)示例
2014/04/02 Python
使用Python制作获取网站目录的图形化程序
2015/05/04 Python
Python利用前序和中序遍历结果重建二叉树的方法
2016/04/27 Python
使用C++扩展Python的功能详解
2018/01/12 Python
Python实现带参数与不带参数的多重继承示例
2018/01/30 Python
python去除拼音声调字母,替换为字母的方法
2018/11/28 Python
Laravel+Dingo/Api 自定义响应的实现
2019/02/17 Python
pytorch方法测试——激活函数(ReLU)详解
2020/01/15 Python
深入浅析Python 命令行模块 Click
2020/03/11 Python
css3 border-radius属性详解
2017/07/05 HTML / CSS
canvas绘制文本内容自动换行的实现代码
2019/01/14 HTML / CSS
德国宠物用品、宠物食品及水族馆网上商店:ZooRoyal
2017/07/09 全球购物
俄罗斯在线服装店:STOLNIK
2021/03/07 全球购物
阿联酋最好的手机、电子产品和家用电器网上商店:Eros Digital Home
2020/08/09 全球购物
医学护理系毕业生求职信
2013/10/01 职场文书
高中生毕业学习总结的自我评价
2013/11/14 职场文书
学校四风对照检查材料
2014/08/28 职场文书
2014年市场部工作总结
2014/11/25 职场文书
新郎婚礼答谢词
2015/01/04 职场文书
迎新晚会主持词开场白
2015/05/28 职场文书
2015年小学远程教育工作总结
2015/07/28 职场文书
幼儿教师远程研修感悟
2015/11/18 职场文书