Re: [問題] jquery中,e.target跟this的差別?
原 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://www.ptt.cc/bbs/Ajax/M.1516849202.A.90B.html
推
01/28 17:04,
6年前
, 1F
01/28 17:04, 1F
討論串 (同標題文章)
完整討論串 (本文為第 2 之 2 篇):
Ajax 近期熱門文章
PTT數位生活區 即時熱門文章