10 回答

TA貢獻1804條經驗 獲得超2個贊
window.onload = function () { var d = document.getElementsByTagName('a'); // 假設現在有5個 a標簽 for (var i = 0; i < d.length; i++) { d[i].onclick = function () { console.log(i) // 由于異步的關系 i 現在是5 , 因為綁定的方法中使用的i for循環之后的i d[i].innerHTML += d[i].innerHTML; } } // 利用閉包 for (var i = 0; i < d.length; i++) { d[i].onclick = (function (i) { return function () { console.log(i) // d[i].innerHTML += d[i].innerHTML; } })(i) } // 將每個i 保存到d[i]中的 index 屬性中, 利用this.index 獲取到 對應的 i for (var i = 0; i < d.length; i++) { d[i].index = i; d[i].onclick = function () { console.log(this.index) d[this.index].innerHTML += d[this.index].innerHTML; } } };
首先 , JavaScript是沒有塊級聲明的概念的, 這樣導致了 for循環中 這個i 是一直使用同一個變量的,而因為我們點擊事件綁定的方法并沒有將當時循環中的 i 保存下來,導致方法用的i 都是for循環之后的i 變量,加入循環了5次, 最終變量 i 已經變為5了, 而此時我們 使用的di 是沒有這個元素的,因此控制臺給我們報錯了, 通過閉包,或者將循環中的i 保存到d[i]本身的屬性里面, 都能解決你的問題, 最后還是得靠你自己去理解閉包 和 this的概念

TA貢獻1804條經驗 獲得超8個贊
事件執行時,for循環早就結束了,這個時候i已經是最大值加1了。
解決方法是可以用閉包把每次循環i的值保存起來。
或者在事件函數內不使用循環變量i,而是用this獲取觸發事件的元素
document.getElementById("td0").innerHTML+=this.innerHTML;

TA貢獻1810條經驗 獲得超5個贊
樓主如果改用jquery會簡單很多。
新版本的jquery使用這種寫法
$( "#dataTable tbody tr" ).on( "click", function() {
console.log( $( this ).text() );
});

TA貢獻1752條經驗 獲得超4個贊
這位施主,你的函數出問題了
問題代碼:
d[i].onclick = function() {
$("td0").innerHTML += d[i].innerHTML
}
第一個 d[i] ,這個 i 是for循環中的參數 i,沒問題
第二個 d[i] ,這個 i 是那個 i ?
我知道你意思,這個d[i],是當前循環到的元素,可是在他并不能傳遞過去。
解決方法:
你使用this關鍵字替代onlcick函數中的 d[i] ,代碼運行成功
添加回答
舉報