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中,便于后续操作。

弯道超车,换一个思路,避免addEventListener为同一个元素重复赋予事件的更多相关文章

  1. 换一个思路压缩图片,RGB转YUV

    一般的压缩方案 做移动平台,终究都是要考虑纹理压缩的问题 IOS/PVR平台上一般会选用PVRTC格式,这个格式压缩还是很给力. Android上设备种类很多,支持的格式各有不同.如果平台能支持下载前 ...

  2. Android实训案例(九)——答题系统的思绪,自己设计一个题库的体验,一个思路清晰的答题软件制作过程

    Android实训案例(九)--答题系统的思绪,自己设计一个题库的体验,一个思路清晰的答题软件制作过程 项目也是偷师的,决心研究一下数据库.所以写的还是很详细的,各位看官,耐着性子看完,实现结果不重要 ...

  3. 编写函数求整形数组a中存储的m个不重复的整数的第k大的整数(其中m>=1,1<=k<=m)很简单的一个思路是酱紫的:管他辣么多干啥,上来一把排序然后直接得答案

    /** * @author:(LiberHome) * @date:Created in 2019/2/28 20:38 * @description: * @version:$ *//*编写函数求整 ...

  4. 从C过渡到C++——换一个视角深入数组[真的存在高效吗?](2)

    从C过渡到C++--换一个视角深入数组[真的存在高效吗?](2) C风格高效的数组遍历 在过渡到C++之前我还是想谈一谈如何书写高效的C的代码,这里的高效指的是C代码的高效,也就是在不开启编译器优化下 ...

  5. 从C过渡到C++——换一个视角深入数组[初始化](1)

    从C过渡到C++--换一个视角深入数组[初始化](1) 目录 从C过渡到C++--换一个视角深入数组[初始化](1) 数组的初始化 从C入手 作用域 代码块作用域 文件作用域 原型作用域 函数作用域 ...

  6. Javascript添加事件的addEventListener()及attachEvent()区别分析,事件委托

    Mozilla中: addEventListener的使用方式: target.addEventListener(type, listener, useCapture); target: 文档节点.d ...

  7. 求一个集合S中m个元素的所有排列以及一个数组A的全排列—递归实现版完整代码

    说明,本文全文代码均用dart语言实现. 求一个集合S中m个元素的所有排列情况,并打印,非常适合用递归的思路实现.本文给出了两种实现方法,一种是给定的填充排列数组长度是固定的,一种是可变长度的.两种方 ...

  8. 递归算法之排列组合-求一个集合S的m个元素的组合和所有可能的组合情况

    求一个集合S的m个元素组合的所有情况,并打印出来,非常适合采用递归的思路进行求解.因为集合的公式,本身就是递归推导的: C(n,m) = C(n-1,m-1) + C(n-1,m). 根据该公式,每次 ...

  9. 编写程序输入一个5x5的矩阵,将最大元素与中心元素交换,并按行列对齐输出。

    编写程序输入一个5x5的矩阵,将最大元素与中心元素交换,并按行列对齐输出. 题目描述 编写程序输入一个5x5的矩阵,将最大元素与中心元素交换,并按行列对齐输出. 输入描述 编写程序输入一个5x5的矩阵 ...

随机推荐

  1. codeforces 914 D Bash and a Tough Math Puzzle

    #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #i ...

  2. Python 线程高级篇 threading 模块的使用

    创建一个tread实例,给他传一个函数 #!/usr/bin/python import threading from time import * loops =[4,2] def loop (nlo ...

  3. linux SVN服务器创建版本库

    1.安装svn服务 # yuminstall subversion 2.新建一个目录用于存储SVN所有文件    # mkdir /home/svn 3.在上面创建的文件夹中为项目 project_1 ...

  4. 从A小程序跳转到B小程序

    从A小程序跳转到B小程序: A小程序 wxml: <navigator target="miniProgram" open-type="navigate" ...

  5. 解决Vue引入百度地图JSSDK:BMap is undefined 问题

    百度地图官网文档介绍使用JSSDK时,仅提供了2种引入方式: script引入 异步加载 解决跨域问题,实例调用百度地图 但vue项目中仅某一两个页面需要用到百度地图,所以不想在 index.html ...

  6. 紫书 习题8-5 UVa 177 (找规律)

    参考了https://blog.csdn.net/weizhuwyzc000/article/details/47038989 我一开始看了很久, 拿纸折了很久, 还是折不出题目那样..一脸懵逼 后来 ...

  7. wipefs进程是啥,占用了百分之90多的cpu

    http://www.cnblogs.com/liuchuyu/p/7490338.html

  8. df -h 挂死

    df -h 卡死的情况,那是因为无法统计挂载的目录的大小 一般是因为还挂载了一些外部的目录,如nfs的目录 可以用mount | column -t 命令查看哪些目录 然后umount这些目录, 一般 ...

  9. [TypeScript] Asynchronous Iteration using for-await-of

    The for-await-of syntax is similar to the for-of iteration. The key difference is that it automatica ...

  10. 从fork面试题開始的思考

    一.文章来由 还是按照惯例来说一下文章为什么来的.晚上好基友在网上刷面试题,看到一个有趣的题目,于是開始了研究,就有了这篇文章. 二.进入正题 题目例如以下: #include <stdio.h ...