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