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