关于js中事件重复绑定的问题

JavaScript021

关于js中事件重复绑定的问题,第1张

在写一个项目,有一个触发编辑按钮才会出现编辑板块,然后编辑板块中有点击添加的事件。当保存编辑,编辑板块消失。再次点击编辑,再点击添加,会触发多次,生成多个模块。

经过多次反复痛苦的调试,发现是在点击编辑后调用的函数中绑定了添加的事件,当再次点击编辑时,会重复绑定,所以会出现触发多次的bug。

解决方法就是在绑定之前先解绑。

这样就可以解决了。jquery中还有很多类似的处理,比如说运行一个动画前先将之前的动画stop()掉。

不过在解绑事件时最好将具体的元素写入,因为在事件委托时,不写明具体,解绑会将所有事件解绑

上述例子只会触发alert(3),因为点击btn1时,解绑了所有在body上的click事件,只会调用在最后绑定的alert(3)。

应该写成

js判断添加多个标签js怎么样获取多个标签内容-百度经验

1、创建一个test.html文件。

2、在文件内,使用ul、li标签创建一个测试的列表,同时创建一个button按钮,用于触发执行js函数。

3、在js标签内,

百度经验2020-01-12

其他人还搜了

js标签中点击事件失效

js 判断回车键

js判断是否是chrome

js判断数组中是否包含某一项

js添加标签绑定多个事件

js判断对象是否为空

js if判断多个条件_JS条件判断小技巧(一)weixin_39540271的博客-CSDN博客

文章标签:js if判断多个条件 js map用法 js table多层嵌套 js 数组追加 js三元表达式 经常code review,我发现JS newbie很容易写出一堆冗长的代码。今天就列几个比较常见的“解决之道”,看看...

CSDN技术社区2020-12-03

js 动态添加标签绑定多个事件-鸡蛋是方的-博客园

1:此方法为以aa开头的input标签绑定了事件;2:此方法:绑定多个事件,多个事件用空格分开,例子绑定了点击和输入时事件;3:如果调用第三方插件方法...

博客园2020-04-09

请问怎么用js判断循环里面li标签?百度知道

回答:2

代码: menu{width:100%text-align:center} menu li{display:inline-blockbackground:#cccpadding:15px 20px} current{color:#f3c} a href="#">menu</a></li>menu1 menu2 menu3 var lilenght=$(".menu li").length获取li个数 console.log(lilenght) if...

百度知道2020-11-20

js多重判断多个条件的方法-web教程网

我们编写js代码时经常遇到复杂逻辑判断的情况,通常大家可以用if/else或者switch来实现多个条件判断,但这样会有个问题,随着逻辑复杂度的增加,代码中的if/else/switch会变得越来越臃肿,...

web教程网

js 怎么获取a标签被点击的链接,有多个a标签-ZOL问答

5条回答:【推荐答案】添加onclick事件,获取href属性就知道具体的url地址了!DOCTYPEhtmlhtmlbodyscriptfunctionaclick(self){alert(self.href)}/scriptahref=ddd

中关村在线

JS添加标签-程序员大本营

我开始使用的是appendChild函数,结果发现appendChild只能添加指定标签,像我这样需要加一大堆标签和标签属性操作起来就略显麻烦。于是我转而使用append函数,最开始我是这样写的:结果效果如下...

www.pianshen.com

如何使用js添加html标签_Keeling1720的博客-CSDN博客_js 插入html

1.使用 getElementById 获取想要写的标签的父标签对象(body除外,当然body也可以获取,当时没必要,因为他可以通过document.body直接调用)

2.使用 createElement 创建标签对象

CSDN技术社区

js怎么把几个li标签按顺序添加进一个div中?Charles_Tian的博客-CSDN博客

1.js怎么把几个li标签按顺序添加进一个div中?这种问题一般出现在前端请求数据之后,后端以数组的形式返回给前端,然后前端对这些数组进行处理。(1)首先是对后端返回的数据进行拆分,分别得到...

CSDN技术社区2017-12-10

js判断html是否存在指定标签,JavaScript检测字符串中是否 含有html标签实现方法_monte3card的博客-CSDN博客

JavaScript检测字符串中是否 含有html标签实现方法发布时间:2017-11-07 14:11来源:互联网当前栏目:web技术类这篇文章主要介绍了JavaScript检测字符串中是否含有html标签实现方法,本文直接给...

CSDN技术社区2021-06-16

相关搜索

js判断

js添加标签

js判断循环中的li标签

js判断数组

js判断字符串长度

js判断滚动条

js判断大小写

js 判断下拉框

js判断复选框是否选中

js添加html

js事件是为了实现用户交互,比如当用户鼠标点击或者键盘输入时,浏览器会监听截获并且通知js做出反馈执行相应的函数,实现交互。

js的事件类型有很多,我们先来大概总结一下常用的JS事件

click点击事件、mousedown鼠标按下事件、mousemove鼠标移动事件、mouseup鼠标抬起事件

contextmenu右键出菜单事件、mouseenter/mouseover鼠标进入事件、mouserleave/mouseout鼠标离开事件

可通过事件对象的button属性来区分是左键\滚轮\右键,分别对应值 0 / 1 / 2

DOM3规定:click事件只能监听左键;只能通过mousedown和mouseup来判断鼠标键

keydown某键被按下时、keyup被松开时、keypress按下并且松开时

触发顺序:先 keydown,然后keypress,最后keyup

keydown和keypress的区别:

input:文本变化时触发

change:聚焦或失去焦点时判断状态是否改变,发生改变是触发change事件

focus:聚焦时触发

blur:失去焦点时触发

利用focus和blur可模拟placeholder

scroll:滚动条滚动时

load:页面加载完触发

abort:图像的加载失败

dblclick:双击事件

error:当加载图像和文档时发生错误

resize:窗口或者框架被重新调整大小

select:文本被选中时

reset:点击重置按钮时

submit:点击提交按钮时

接着看如何给DOM元素绑定事件处理函数

兼容性很好

但是根据js的特点,这种赋值的方式肯定会被后面的值覆盖。因此这种方式绑定事件处理函数规则是:同一个元素同一个事件只能绑定一个处理函数。等同于第一种写在行间。

IE8及以下不兼容

通过addEventListener绑定的方式,同个元素的同一个事件可以绑定多个处理函数,不会被覆盖。

attachEvent跟addEventListener 基本一致,也是同一个元素的同一个事件可以绑定多个处理函数,不会被覆盖。不同的是attachEvent可以绑定的函数是可以重复的,即即使绑定同一个函数都不会不覆盖。

以上几种事件绑定方式里面的this指向有点区别:

也比较好理解,IE独有的特殊一点指向window,其他都指向dom元素本身

封装一个兼容性的方法,用于绑定事件:

有的时候我们希望解除事件处理函数,那怎么办呢?

其实解除事件处理函数也对应有办法方法:

1. ele.onxxx = false / ' ' / null

2. ele.removeEventListener(type,fnName,false)

3. ele.attachEvent('on' + type,fnName)

值得注意的是:若干绑定的事件处理函数是匿名函数,则无法解除绑定!

不知道有没有发现,在上面绑定事件处理函数的时候,处理函数有个参数e或者叫event,其实是一个事件对象

事件对象就是处理函数里面的一个参数,说白了就是浏览器打包好的一个对象自动传入到处理函数的第一个参数中。

为了兼容IE一般这么写: e = e || window.event

事件对象会有个属性target,这个target叫事件源对象,记录可事件具体在谁身上触发的那个源头

同样IE上事件源对象是e.srcElement,谷歌两个都有

所以为了兼容IE一般获取事件源对象是这么来写:

当浏览器发展到第四代时(IE4及Netscape4),浏览器开发团队遇到了一个很有意思的问题:页面的哪一部分会拥有某个特定的事件?想象画在一张纸上的一组同心圆。如果把手指放在圆心上,那么手指指向的不是一个圆,而是纸上的所有圆

两家公司的浏览器开发团队在看待浏览器事件方面还是一致的。如果单击了某个按钮,他们都认为单击事件不仅仅发生在按钮上,甚至也单击了整个页面

但有意思的是,IE和Netscape开发团队居然提出了差不多是完全相反的事件流的概念。IE的事件流是事件冒泡流,而Netscape的事件流是事件捕获流。事件冒泡和事件捕获称为两种事件处理模型

IE的事件流叫做事件冒泡(event bubbling), 事件冒泡是结构上(非视觉上)嵌套的函数存在事件冒泡功能,即同一事件自子元素冒泡向父元素(自底向上)

[注意]所有现代浏览器都支持事件冒泡

但在具体实现在还是有一些差别。IE9、Firefox、Chrome、Safari将事件一直冒泡到window对象

而事件捕获的思想是不太具体的节点应该更早接收到事件,而最具体的节点应该最后接收到事件。事件捕获的用意在于在事件到达预定目标之前就捕获它

即事件捕获是指: 结构上(非视觉上)嵌套的元素存在事件捕获功能,即同一事件自父元素冒泡向子元素(自顶向下)

注意IE上没有事件捕获,Chrome和新版本的Firefox等都实现了

一个dom元素的一个事件类型绑定的一个处理函数只能存在一种事件模型,要么事件冒泡要么事件捕获。正常的通过addEventListener(type,fn,false)绑定事件时,最后一个参数默认是false表示的是,事件冒泡模型。如果改成true,立即变成事件捕获模型

如果一个dom元素的一个事件类型绑定了两个处理函数,两个函数的事件处理模型一个是事件冒泡一个是事件捕获,触发顺序是先捕获,后冒泡。

focus、blur、change、submit、reset、select等事件类型不冒泡

可以 利用事件冒泡和事件源对象可以叫事件委托给父元素

利用事件冒泡和事件源对象进行处理

优点:

性能好,不需要循环所有元素一个个绑定事件

灵活,当有其他新的子元素时,不需要重新绑定事件。

有的时候,我们不希望有冒泡功能,那我们怎么取消事件冒泡呢?

封装一个都好使的取消冒泡函数

有的时候我们需要阻止一些浏览器默认的事件

比如:表单提交、a链接跳转、右键菜单等

有几种方式:

参考资料:

DOM事件流的三个阶段

深入理解DOM事件机制系列第一篇——事件流

JS事件汇总

JS事件模型

事件1(上)

事件1(下)

DOM级别与DOM事件

DOM事件机制解惑

事件模型

JavaScript 事件委托详解

JavaScript 事件的学与记:stopPropagation 和 stopImmediatePropagation

event.target和event.currentTarget的区别

js怎么区分出点击的是鼠标左键还是右键?