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

為了賬號安全,請及時綁定郵箱和手機立即綁定

為什么for循環中直接使用tr[i]不可以,(詳情見下面代碼)

為什么for循環中直接使用tr[i]不可以

window.onload = function(){
???? // 鼠標移動改變背景,可以通過給每行綁定鼠標移上事件和鼠標移除事件來改變所在行背景色。
??????? var tr = document.getElementsByTagName("tr");
??????? for(var i = 0; i < tr.length; i++)
??????? {
???????????tr[i].onmouseover=function()
??????????? {
??????????????? tr[i].style.backgroundColor = "#f2f2f2";
??????????? }
??????????? tr[i].onmouseout=function()
??????????? {
??????????????? tr[i].style.backgroundColor = "#fff";
??????????? }??????

??? ?? }

}

這是別人的代碼,但我的問題和他有點不一樣,這是別人回答他:

這是由于事件的異步執行造成的。方法一中給每個tr都綁定了onmouseover和onmouseout事件,頁面加載完成后,for循環中的i已經變為了tr.length。而事件此時還沒有被觸發,當用戶移動鼠標觸發事件時,事件函數中的代碼? tr[i].style.backgroundColor = "#f2f2f2";開始執行,而這時i的值已經是tr.length了,tr[i]即tr[tr.length],可tr中最后一個是tr[tr.length-1],而tr[tr.length]這個節點是不存在的。

我的問題是:

就是for循環結束后,每個tr[i]的事件不是已經注冊了嗎?就是tr[0].style.backgroundColor = "#f2f2f2";這樣每個tr[i]事件都注冊了,那這時i怎么變不是應該沒關系了嗎,為什么鼠標移動的時候觸發事件的時候還要在執行tr[i].style.backgroundColor = "#f2f2f2";這個啊,不是應該執行如tr[0].style.backgroundColor = "#f2f2f2";這樣的,執行的是注冊的事件嗎?


正在回答

4 回答

似乎有點明白,似乎不明白。。。我也是那樣寫的,怎么都行不通。。。把方法單獨寫到一個方法就OK,這感覺就像是這語言有點ZZ

0 回復 有任何疑惑可以回復我~

電腦有毒,鑒定完畢


0 回復 有任何疑惑可以回復我~

你得理解不對,每個tr[i]事件確實注冊了,但是只是注冊到?tr[i].onmouseover=function()這一步,具體事件內容還是要等觸發的時候再去獲取

0 回復 有任何疑惑可以回復我~
#1

ゞ蘇戲 〃

為什么會沒有注冊方法體,具體原因給解釋解釋......
2016-11-10 回復 有任何疑惑可以回復我~
#2

慕容7796276 提問者

你是說等到觸發的時候再去獲取,是動態的獲取嗎?比如這個代碼 window.onload=function(){ var tr = document.getElementsByTagName("tr"); for(var i=0;i<1000000;i++){ tr[i].onmouseover=function(){ document.write(i); } } } 要是按照你說的觸發的時候獲取那i應該會非常大的啊,為什么輸出的是3啊?
2016-11-10 回復 有任何疑惑可以回復我~
#3

ゞ蘇戲 〃 回復 慕容7796276 提問者

蠢,over
2016-11-10 回復 有任何疑惑可以回復我~
#4

stone310 回復 慕容7796276 提問者

我不知道你這段代碼是怎么執行出來為3的,能發全嗎??
2016-11-10 回復 有任何疑惑可以回復我~
#5

stone310 回復 ゞ蘇戲 〃

js是單線程,事件觸發后才會將對應的回調放到線程上等待執行,所以,沒事多看看書,電腦有毒這種言論當個笑話說也沒什么意思
2016-11-10 回復 有任何疑惑可以回復我~
#6

慕容7796276 提問者

求回復啊
2016-11-11 回復 有任何疑惑可以回復我~
#7

慕容7796276 提問者 回復 stone310

window.onload = function(){ var tr = document.getElementsByTagName("tr"); for(var i=0;i<1000000;i++){ tr[i].onmouseover=function(){ document.write(i);}}} </script>
2016-11-11 回復 有任何疑惑可以回復我~
#8

慕容7796276 提問者 回復 stone310

<body> <table border="1" width="50%" id="table"> <tr> <th>學號</th> <th>姓名</th> <th>操作</th> </tr> <tr> <td>xh001</td> <td>王小明</td> <td><a href="javascript:;" >刪除</a></td> <!--在刪除按鈕上添加點擊事件 --> </tr>
2016-11-11 回復 有任何疑惑可以回復我~
#9

慕容7796276 提問者 回復 stone310

<tr> <td>xh002</td> <td>劉小芳</td> <td><a href="javascript:;" >刪除</a></td> <!--在刪除按鈕上添加點擊事件 --> </tr> </table> <input type="button" value="添加一行" /> <!--在添加按鈕上添加點擊事件 --> </body>
2016-11-11 回復 有任何疑惑可以回復我~
#10

stone310 回復 慕容7796276 提問者

。。你這頁面就3個<tr>,最多i就是3了,i=4的時候,tr[i].onmouseover已經報錯了好吧
2016-11-11 回復 有任何疑惑可以回復我~
#11

stone310 回復 慕容7796276 提問者

應該說i=2的時候,事件都是被注冊的,i為3的時候,tr[i]不存在,事件注冊時報錯,最終i為3
2016-11-11 回復 有任何疑惑可以回復我~
#12

慕容7796276 提問者 回復 stone310

js要是報錯了是不是就不會運行下去了啊?也就是循環就會停止,而此時i等于3
2016-11-12 回復 有任何疑惑可以回復我~
#13

stone310 回復 慕容7796276 提問者

報錯了之后的代碼就不執行了
2016-11-13 回復 有任何疑惑可以回復我~
查看10條回復

怎么沒人回答我的,跪求解答


0 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

為什么for循環中直接使用tr[i]不可以,(詳情見下面代碼)

我要回答 關注問題
微信客服

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

幫助反饋 APP下載

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

公眾號

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