博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
弯道超车,换一个思路,避免addEventListener为同一个元素重复赋予事件
阅读量:6295 次
发布时间:2019-06-22

本文共 3063 字,大约阅读时间需要 10 分钟。

addEventListener可以给同一个元素赋予多次同一个事件。

执行一次,就多一次事件效果。这不是我想要的。

window.onload = function(){    var box = document.getElementById("box");    box.onclick = function(){        console.log("我是box1");    }    box.onclick = function(){        box.style.fontSize = "18px";        console.log("我是box2");    }}     运行结果:“我是box2”
window.onload = function(){    var box = document.getElementById("box");    box.addEventListener("click",function(){        console.log("我是box1");    })    box.addEventListener("click",function(){        console.log("我是box2");    })}    运行结果:我是box1         我是box2

像touchstart,touchend这种html5事件必须通过addEventListener来实现。

// 长按事件$.fn.longPress = function(fn) {    var timeout = undefined;    var $this = this;    for(var i = 0;i<$this.length;i++){        $this[i].addEventListener('touchstart', function(event) {            timeout = setTimeout(fn, 800);        }, false);        $this[i].addEventListener('touchend', function(event) {            clearTimeout(timeout);        }, false);    }}

当用addEventListener来实现的时候,事件绑定的方法会被执行多次。

后来网上查找,removeEventListener来移除事件。但是貌似没效果。

于是我想到了,为元素加一个属性来标识是否已经有了事件了。如果有的话,就不要再次赋予事件了。

// 长按事件$.fn.longPress = function(fn) {    var timeout = undefined;    var $this = this;    for(var i = 0;i<$this.length;i++){        // 检测是否已经有了事件        if ($this[i].getAttribute("data-longpress")== "1") {            continue;        }        $this[i].setAttribute("data-longpress","1");        $this[i].addEventListener('touchstart', function(event) {            timeout = setTimeout(fn, 800);        }, false);        $this[i].addEventListener('touchend', function(event) {            clearTimeout(timeout);        }, false);    }}

通过元素的属性标识,就可以避免同一个元素,被赋予多次相同的事件了。

进阶,获取事件元素对应的参数

$.fn.longPress = function(fn) {    var timeout = undefined;    var $this = this;    for(var i = 0;i<$this.length;i++){        // 检测是否已经有了事件        if ($this[i].getAttribute("data-longpress")== "1") {            continue;        }        $this[i].setAttribute("data-longpress","1");        $this[i].addEventListener('touchstart', function(e) {            // 这里的e就是执行的元素            var target;            if(!e.target.getAttribute("data-messageId")) {                target = e.target.parentNode;            } else {                target = e.target;            }            var longpressTarget = $api.getStorage('longpressTarget');            if (!longpressTarget) {                longpressTarget = {};            }            longpressTarget.targetId = target.getAttribute("data-targetId");            longpressTarget.senderUserId = target.getAttribute("data-senderUserId");            longpressTarget.messageId = target.getAttribute("data-messageId");            $api.setStorage('longpressTarget',longpressTarget);            timeout = setTimeout(fn, 800);        }, true);        $this[i].addEventListener('touchend', function(e) {            clearTimeout(timeout);        }, true);    }}

这里的e,就是事件执行的元素。获取它,就能得到想要的元素。然后得到相关参数,进行后续操作。这里将参数保存到本地的storage中,便于后续操作。

本文转自TBHacker博客园博客,原文链接:http://www.cnblogs.com/jiqing9006/p/7073195.html如需转载请自行联系原作者

你可能感兴趣的文章
sbt笔记一 hello-sbt
查看>>
常用链接
查看>>
pitfall override private method
查看>>
!important 和 * ----hack
查看>>
聊天界面图文混排
查看>>
控件的拖动
查看>>
svn eclipse unable to load default svn client的解决办法
查看>>
Android.mk 文件语法详解
查看>>
QT liunx 工具下载
查看>>
内核源码树
查看>>
AppScan使用
查看>>
Java NIO框架Netty教程(三) 字符串消息收发(转)
查看>>
Ucenter 会员同步登录通讯原理
查看>>
php--------获取当前时间、时间戳
查看>>
Spring MVC中文文档翻译发布
查看>>
docker centos环境部署tomcat
查看>>
JavaScript 基础(九): 条件 语句
查看>>
Linux系统固定IP配置
查看>>
配置Quartz
查看>>
Linux 线程实现机制分析
查看>>