弯道超车,换一个思路,避免addEventListener为同一个元素重复赋予事件

简介:

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如需转载请自行联系原作者

相关文章
|
19天前
|
存储 安全 编译器
C++学习过程中的一些值得注意的小点(1)
C++学习过程中的一些值得注意的小点(1)
|
3月前
7-7 念数字 (15 分)(用数组简化判断过程)
7-7 念数字 (15 分)(用数组简化判断过程)
16 0
|
9月前
重生之我是孔乙己——查找数组缺失元素的几种方法
重生之我是孔乙己——查找数组缺失元素的几种方法
46 0
|
11月前
|
JavaScript 前端开发
jquery 展开收缩改变状态 保姆式教学代码,默认第二项展开
jquery 展开收缩改变状态 保姆式教学代码,默认第二项展开
|
12月前
|
测试技术
字符串a和他许久未见面的同父异母的b(模拟)(思维)
字符串a和他许久未见面的同父异母的b(模拟)(思维)
59 0
竟然有一半的人不知道 for 与 foreach 的区别???
竟然有一半的人不知道 for 与 foreach 的区别???
|
Java Apache
集合的特别要注意地方哈
《系统设计》系列
58 0
|
JavaScript 测试技术
软件测试面试题:如何去定位属性动态变化的元素?
软件测试面试题:如何去定位属性动态变化的元素?
351 0
|
前端开发
前端工作总结267-调节删除顺序删除
前端工作总结267-调节删除顺序删除
75 0
|
前端开发
前端工作总结121-判断对象里面是否有0和1
前端工作总结121-判断对象里面是否有0和1
185 0