Re: [问题] jquery中,e.target跟this的差别?

楼主: eight0 (欸XD)   2018-01-25 10:59:55
原 PO 好像刚学,下面帮你注解一下程式各行在做些什么,并附上 jquery 的文件连结。
原本的程式码︰
$(".delete").click( // 注册 click 事件。click() 函式接受一个 event handler。
// https://api.jquery.com/click/#click-handler
e => // handler 函式会得到一个 eventObject 物件(见前面的连结),也就是
// 这里的 e。
// http://api.jquery.com/category/events/event-object/
$(e.target) // e.target 属性会指向事件发生时,作用的元素。对于 click 事件
// 来说就是被点击的物件。
// http://api.jquery.com/event.target/
.parent() // .parent() 会得到前面 $(e.target) 的父元素。
// http://api.jquery.com/parent/
.fadeOut( // .fadeOut() 函式用于将元素渐变至透明。fadeOut() 函式接受
//
// * duration: 一段时间,指定动画长度。
// * complete: 一个函式,当动画结束时会被执行。
//
// http://api.jquery.com/fadeOut/#fadeOut-duration-complete
150, // duration
e => // complete 函式。这里的 e 会是 undefined,因为 complete 函式不接
// 受任何参数,见前一个连结
$(e.target).remove() // 错误
)
)
改成这样就能正常执行︰
$(".delete").click(e => {
const todoItem = $(e.target).parent(); // 把要用的元素存入一个变量
todoItem
.fadeOut( // 将该元素 fadeOut
150,
() => todoItem.remove() // 动画完成后将该元素 remove
);
});
关于 this
你所修改的程式码中,在 .fadeOut() complete 函式内使用了 this 关键字。
它指向被 fadeOut 的 DOM 元素,相当于前面程式码的 todoItem。
http://api.jquery.com/fadeOut/#callback-function
然而 todoItem 其实是 $(e.target).parent(),换句话说
> 改成fadeOut(150, () => $(e.target).remove())
还是错误的。应该是 $(e.target).parent().remove()
另外补充
* 即使在 event handler 内,eventObject.target 也不一定和 this 相等。
和 this 相当的是 eventObject.currentTarget。
http://api.jquery.com/event.currentTarget/
* 不少人会建议在不了解前避免使用 this 关键字。详细可以参考 MDN︰
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this
(缩︰https://is.gd/bf68PK)
作者: NCKUFatPork (成大肥宅悲歌)   2018-01-28 17:04:00
太感谢你的回答了

Links booklink

Contact Us: admin [ a t ] ucptt.com