亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

這個動態綁定click為什么不正確

這個動態綁定click為什么不正確

函數式編程 2019-04-25 15:15:44
解釋詳細一下
查看完整描述

10 回答

?
慕婉清6462132

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的概念


查看完整回答
反對 回復 2019-05-13
?
蠱毒傳說

TA貢獻1895條經驗 獲得超3個贊

 td0是什么,class還是id?id的話,用 #td0,class用 .td0



查看完整回答
反對 回復 2019-05-13
?
鴻蒙傳說

TA貢獻1865條經驗 獲得超7個贊

閉包沒做好。。用this對象就行了,為當前點擊的a對象,+=this.innerHTML

查看完整回答
反對 回復 2019-05-13
?
胡說叔叔

TA貢獻1804條經驗 獲得超8個贊

事件執行時,for循環早就結束了,這個時候i已經是最大值加1了。
解決方法是可以用閉包把每次循環i的值保存起來。
或者在事件函數內不使用循環變量i,而是用this獲取觸發事件的元素

document.getElementById("td0").innerHTML+=this.innerHTML;


查看完整回答
反對 回復 2019-05-13
?
森欄

TA貢獻1810條經驗 獲得超5個贊

樓主如果改用jquery會簡單很多。
新版本的jquery使用這種寫法
$( "#dataTable tbody tr" ).on( "click", function() {
console.log( $( this ).text() );
});

查看完整回答
反對 回復 2019-05-13
?
智慧大石

TA貢獻1946條經驗 獲得超3個贊

理解 閉包啊,,, 最后運行結果 相當于,只給最后一次循環的元素 綁定上了


查看完整回答
反對 回復 2019-05-13
?
慕蓋茨4494581

TA貢獻1850條經驗 獲得超11個贊

動態元素綁定應該使用 on('click',function(){})的方式動態綁定事件啊


查看完整回答
反對 回復 2019-05-13
?
溫溫醬

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] ,代碼運行成功

查看完整回答
反對 回復 2019-05-13
?
回首憶惘然

TA貢獻1847條經驗 獲得超11個贊

$(".td0").append(d[i].innerHTML)

$(".td0")[0].innerHTML += d[i].innerHTML

查看完整回答
反對 回復 2019-05-13
  • 10 回答
  • 0 關注
  • 1125 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號