一楼的评论说反了,event.target是给哪个元素绑定事件,是不变的。this则是当前触发事件的元素。
所以event.target是ul ,this是li
所以event.target是ul ,this是li
2017-08-21
事件委托原理:
事件委托就是利用事件冒泡原理实现的!
事件冒泡:就是事件从最深节点开始,然后逐步向上传播事件;
例:页面上有一个节点树,div > ul > li > a
比如给最里面的a 加一个click 事件,那么事件就会一层一层的往外执行,执行顺序 a > li > ul > div, 有这样一个机制,当我们给最外层的div 添加点击事件,那么里面的ul , li , a 做点击事件的时候,都会冒泡到最外层的div上,所以都会触发,这就是事件委托,委托他们父集代为执行事件
事件委托就是利用事件冒泡原理实现的!
事件冒泡:就是事件从最深节点开始,然后逐步向上传播事件;
例:页面上有一个节点树,div > ul > li > a
比如给最里面的a 加一个click 事件,那么事件就会一层一层的往外执行,执行顺序 a > li > ul > div, 有这样一个机制,当我们给最外层的div 添加点击事件,那么里面的ul , li , a 做点击事件的时候,都会冒泡到最外层的div上,所以都会触发,这就是事件委托,委托他们父集代为执行事件
2017-08-21
为什么要用事件委托?事件委托有什么好处?
一般来说,dom是需要有事件处理程序的,我们会直接给他事件处理程序就好了,那么如果是很多dom元素需要添加事件处理呢?
比如 100个li,每个li 都有相同的click点击事件,可能我们会有for循环的方法,来遍历所有li,然后为每个li添加绑定事件。
这么做毫无疑问对性能有很大的影响;
在js中,访问dom次数越多,引起浏览器重绘与重排的次数也就越多,就会延长整个页面的交互就绪时间
如果采用事件委托,就会将所有的操作放到js程序里面,与dom的操作就只交互一次,这样减少了dom交互次数,性能就会提升;
一般来说,dom是需要有事件处理程序的,我们会直接给他事件处理程序就好了,那么如果是很多dom元素需要添加事件处理呢?
比如 100个li,每个li 都有相同的click点击事件,可能我们会有for循环的方法,来遍历所有li,然后为每个li添加绑定事件。
这么做毫无疑问对性能有很大的影响;
在js中,访问dom次数越多,引起浏览器重绘与重排的次数也就越多,就会延长整个页面的交互就绪时间
如果采用事件委托,就会将所有的操作放到js程序里面,与dom的操作就只交互一次,这样减少了dom交互次数,性能就会提升;
2017-08-21
借鉴其他大牛的一个例子:收快递例子
有三个同事预计会在周一收到快递。为签收快递,有两种办法:一是三个人在公司门口等快递;二是委托给前台MM代为签收。现实当中,我们大都采用委托的方案(公司也不会容忍那么多员工站在门口就为了等快递)。前台MM收到快递后,她会判断收件人是谁,然后按照收件人的要求签收,甚至代为付款。这种方案还有一个优势,那就是即使公司里来了新员工(不管多少),前台MM也会在收到寄给新员工的快递后核实并代为签收。
两层意思:
1.现在委托前台的同事是可以签收的,即程序中的现有的dom节点是有事件的;
2.新员工也是可以被前台mm代为签收的,即程序中新添加的dom节点也是有事件的;
有三个同事预计会在周一收到快递。为签收快递,有两种办法:一是三个人在公司门口等快递;二是委托给前台MM代为签收。现实当中,我们大都采用委托的方案(公司也不会容忍那么多员工站在门口就为了等快递)。前台MM收到快递后,她会判断收件人是谁,然后按照收件人的要求签收,甚至代为付款。这种方案还有一个优势,那就是即使公司里来了新员工(不管多少),前台MM也会在收到寄给新员工的快递后核实并代为签收。
两层意思:
1.现在委托前台的同事是可以签收的,即程序中的现有的dom节点是有事件的;
2.新员工也是可以被前台mm代为签收的,即程序中新添加的dom节点也是有事件的;
2017-08-21
你们可以把e.target换成$(this)看看 结果输出的的是underfined说明function中的this是指绑定触发的对象ul event 是实际触发事件的元素
2017-08-17
老师讲的不错 $('elem').on('click','elem2',function(){}) 给元素elem绑定点击事件 原本该事件应该由elem去触发 现在由于第二层seletor的作用下委托elem2去做
2017-08-17
最赞回答 / 慕村8732623
这句话应该跟 function update(first,last,bottonName)结合起来看,调用了update函数。这里的first.text(bottonName)就是$("span:first").text(bottonName),改变了第一个span里面的文本,同理 last.text(n + 1)也改变了第二个span里面的文本。补充一下parseInt(last.text(), 10);是为了将第二个span里的字符转换为十进制整数。
2017-08-16
已采纳回答 / 黄永泰
第一大段代码$("button:first").click(function(event,bottonName)你只要点击按钮1就会触发点击事件.click(function(event,bottonName)由于一开始的bottonName这个参数是不存在的所以bottonName=bottonName|| 'first';这个语句的返回值是'first' 然后再调用update这个函数 update($("span:first"),$("span:last"),‘first’); 解释完第一段代...
2017-08-16
focusin focusout mouseover mouseout是冒泡事件 focus blur mouseenter mouseleave是不冒泡事件
2017-08-16
http://www.w3school.com.cn/tiy/t.asp?f=jquery_event_mouseenter_mouseover我在这个网站验证过了 父元素的mouseover并不会使得子元素的mouseover触发 只有子元素mouseover触发时才会向上冒泡 并不知道是不是我的理解错误还是教程的错误
2017-08-16