昨天遇到一個問題,關於事件函數的傳參問題,現在我抽象出來代碼如下:
HTML:
<div>0</div>
<div>0</div>
<div>0</div>
<div>0</div>
現在我想用for循環給每個div加個單擊事件,單擊一下,彈出是第幾個div即for循環裏面的i的值,JS代碼應該如下:window.οnlοad=function(){
var div=document.getElementsByTagName('div');
for(var i=0;i<div.length;i++){
div.item(i).οnclick=function(){
alert(i);
}}
}
以上代碼運行之後,發現單擊的時候,每一個彈出的都是4。
這是爲什麼呢?原因很簡單,在for語句進行循環的時候,並沒有把在循環時候的i的值賦給
<pre name="code" class="javascript">alert(i);
而是在循環的過程中,沒有執行到內部,所以等到循環結束,i的值變成了4,最後單擊的時候彈窗都是4.那麼該怎麼解決這個問題呢?
或許很容易想到一個辦法——傳參!執行以下代碼!
window.οnlοad=function(){
var div=document.getElementsByTagName('div');
for(var i=0;i<div.length;i++){
div.item(i).οnclick=function(i){
alert(i);
}}
}
運行之後,單擊0,彈窗出現 [object MouseEvent] 提示是個鼠標事件對象,是因爲在事件函數中,默認參數即是這個事件參數,那麼我想實現上述想法,有沒有其他的方法。既然無法傳參,但是又必須通過外部的值來引用進來。目前我只想到一個辦法,那就是我這樣來寫代碼:window.οnlοad=function(){
var div=document.getElementsByTagName('div');
for(var i=0;i<div.length;i++){
div.item(i).id=i+'aaaaaa';//通過給其定一個屬性的值來引用。
div.item(i).οnclick=function(i){
alert(this.id.substring(0,1));
}}
}
再運行,點擊之後,分別彈出0123.OK大功告成!