Using jQuery $(this) with ES6 Arrow Functions (lexical this binding)
on()
來寫觸發後的操作內容,而如果要取得觸發事件本身的元素,大多會使用this
撈取,在ES5中大多的寫法會變成下面這樣$(document).on("change", "input", function(){
$(this).val(); //輸出觸發事件元素的值
}
$(document).on("change", "input", () => {
$(this).val(); //輸出觸發事件元素的值<--------這裡會報錯
}
.target
來正確取得該元素,通常這個變數會被宣告成e
,也因此ES6的jQuery會改寫成下面這樣<aside> 💡 一般而言,箭頭函式本體沒有自己的 this ,也因此函式內如果使用this,則會指向上一層
</aside>
$(document).on("change", "input", (e)=>{
$(e.target).val(); //輸出觸發事件元素的值<--------可以正常使用了
}
.target
或是.currentTarget
的原因是,就算在ES5時期,jQuery也無法總是在回呼函式中使用this
來取得元素,例如使用bind
將該元素綁定到其他地方時<aside>
💡 留意target和currentTarget
的差異
target
是觸發事件真正啟動事件的元素本體
currentTarget
則是觸發事件所指定監聽的元素
</aside>
i
,如果設定監聽<button type="button" id="XD" class="btn btn-primary">
<i class="fas fa-share mr-2"></i>發布
</button>
i
時,e.target
會回傳i這個元素,e.currentTarget
則會回傳事件真正監聽的id
為XD
的button
這個元素$(document).on('click', 'XD', (e) => {
console.log($(e.target));
console.log($(e.currentTarget));
}