今天在前端技術羣中看到有位初學朋友問了個問題,我貼一下代碼:
js:html
var pList = document.getElementsByTagName("p"); for(var i=0;i<pList.length;i++){ pList[i].onclick=function(){ alert(pList[i].innerHTML); } } }
html:前端
<div> <p>1</p> <p>2</p> <p>3</p> <p>4</p> <p>5</p> </div>
他的想法是點擊每個P標籤的時候獲取到點擊的p標籤的html,代碼看着沒什麼問題,可實際報錯了~
這個問題估計大部分人一開始都遇到過,爲何這條語句很差使呢?
我的理解,頁面初始化的時候i就已經從0走到了4,當你點擊P的時候,此時i已經變成了5,而pList[5]並不存在,因此會報undefined的錯誤,改法有兩種:
第一種把pList[i]改爲this,當p標籤被點擊時this直接表明p進行獲取html。
第二種就是:閉包
var pList = document.getElementsByTagName("p"); for(var i=0;i<pList.length;i++){ (function(e){ pList[e].onclick=function(){ alert(pList[e].innerHTML); } })(i) }
在點擊事件外加入當即執行函數,把i當作變量傳遞進點擊事件,這樣也可獲取到每次點擊的索引。
這個若是深入點說,就涉及到js裏相當重要的閉包環節了~
點擊事件在循環內部,然而還想調用人家的變量,就像你在別人家看着人家主人在跑步,你還想用跑步機,那麼你要麼等人家跑完了,你用着人家「跑完」的跑步機(文中的i=5),要麼你就讓主人給你同時在旁邊安裝一個如出一轍的跑步機,大家一塊兒(當即執行函數)
粗略的寫完了,嘿嘿,歡迎一塊兒探討問題指正錯誤,高手能夠跳過,寫出來也是爲了作個筆記,溫故而知新~函數