標籤:
指定在元素的的事件處理常式中指定<input type="button" value="click me" onclick="alert(this.value)"/>這段代碼可以正確工作,點擊之後會彈出 click me字串;
如果把該代碼改為:<script> function clickMe(){ alert(value);
}
</script><input type="button" value="click Me" onclick="clickMe()"/>沒有任何反應。
如果再修改為在JavaScript代碼中動態指定事件處理函數,如下:<input type="button" value="click Me" id="myBtn"/>
<script> function clickMe(){ alert(this.value); }
var btn = document.getElementById("myBtn");
btn.onclick=clickMe;
</script>那麼點擊按鈕之後,彈出的就是click Me,也就是此時this有效。
原因在於,在html代碼中直接指定的事件響應代碼,瀏覽器會動態建立一個封裝著元素屬性的函數,函數內部還有一個局部變數event,然後再調用在onclick屬性中指定的那段js代碼。如果要類比一下,則類似於如下的代碼:假設有如下元素: <input type="button" id="myMock" value="mock" onclick="clickMe1()" />
那麼當點擊該按鈕的時候,瀏覽器會建立如下這麼一個函數來執行在onclick屬性中指定的JavaScript代碼。<script> function mock() { with (document) { var item = getElementById("myMock"); with (item) { clickMe1(); } } } </script>因為clickMe1不是mock的內建函式,他只是在mock中被調用,所以clickMe1內部直接存取value是無效的。而如果我們在onclick中指定的不是一個執行函數的代碼,而是直接把該函數的代碼放在這裡,也就是: <input type="button" value="mock" id="myMock" onclick="alert(value)" />
那麼響應的mock函數就會變為<script> function mock() { with (document) { var item = getElementById("myMock"); with (item) { alert(value); } } } </script>此時當然可以正確擷取到item的value的值。
來自為知筆記(Wiz)
JavaScript:關於事件處理常式何時可以直接存取元素的屬性