作者eight0 (人类)
看板Ajax
标题Re: [问题] jquery中,e.target跟this的差别?
时间Thu Jan 25 10:59:55 2018
原 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)
--
推文部份我有些疑问
→ xdraculax: 用 e 是自我设限,要嘛所有主动呼叫动作都要建成事件, 01/24 07:13
→ xdraculax: 要嘛还要代个假 e,多此一举 01/24 07:13
这里指的是 trigger()?有文件可以参考吗?并且 trigger 的说明是
> The event object is always passed as the first parameter to an event handler.
https://api.jquery.com/trigger/
--
▉▏
▉▏
◢ ▊▎ ◣
◤ ▄▆▄ ◥
◥ ◥ ◤ ◤
▄ ▄
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.225.59.3
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Ajax/M.1516849202.A.90B.html
1F:推 NCKUFatPork: 太感谢你的回答了 01/28 17:04