2011-05-16 45 views
1

我有下面的代碼的JavaScript傳遞參數問題

for (var i = 0; i < that.$el.mini.length; i++) { 
      var pag = that.$el.mini[i].pagination; 
      // Mini-Slider Pagination 
      $('li', pag).each(function(j, el) { 
       $(el).click(function() { 
        /* 
        * Toggle Mini-Slide 
        */ 
        that.slider_fn.mini.show(i, j); 
        return false; 
       }); 
      }); 
     } 

所以,基本上,我想要做的就是運行這個功能that.slider_fn.mini.show(i, j);被點擊的元素時。

問題是我想使用變量i,它在循環中更改它的值。點擊該元素後,i將被視爲最新的數字,即that.$el.mini.length

如何讓JavaScript(或函數)記住該特定數字?

回答

4

使用關閉,關閉在i的:

$(el).click((function(i_){ 
    return function() { 
    that.slider_fn.mini.show(i_, j); 
    return false; 
    }; 
})(i)); 

在此之前,你的函數引用變量稱爲i,現在你創建一個新的功能,它引用i_每次迭代,這變量對每個函數都是唯一的,並且在創建函數時引用i的值。

+0

謝謝。我已經知道應該執行與功能相關的事情,但忘記關閉 – 2011-05-16 22:30:14

2

你需要創建一個功能關閉並傳入要堅持作爲參數如下的變量:

for (var i = 0; i < that.$el.mini.length; i++) { 
    var pag = that.$el.mini[i].pagination; 
    $('li', pag).each(function (j, el) { 

     // function closure to persist i, j, and el 
     (function (idx, jdx, elem) { 
      $(elem).click(function() { 
       that.slider_fn.mini.show(idx, jdx); 
       return false; 
      }); 
     } (i, j, el)); 

    }); 
} 
0

這是假設PAG是一個元素,而你正在使用jQuery。

爲(VAR I = 0;我<即$ el.mini.length;我++){

var pag = that.$el.mini[i].pagination; 

// Mini-Slider Pagination 
$('li', pag).each(function(j, el) { 

    $(el).data('page-index', i); // add data to the element being clicked 
    $(el).click(function() { 

     /* 
     * Toggle Mini-Slide 
     */ 
     that.slider_fn.mini.show($(this).data('page-index'), j); 

     return false; 
    }); 
}); 

}

+0

或者您也可以關閉,但我認爲這樣更清潔。 – ansiart 2011-05-16 22:15:37

+0

清潔劑,在哪個視角?數據函數將大量信息添加到HTML頁面。我有很多UL和LI。 – 2011-05-16 22:30:51

+0

由於數據與元素一起存儲,因此不需要在每次要將數據與對象關聯時創建全新的匿名函數閉包。這不會爲元素添加特定的信息,但會存儲一個jQuery對象散列。 – ansiart 2011-05-17 02:19:46

1

給出的閉合答案來解決問題的傳統方式,但如果你不喜歡自我援引匿名函數,你可以考慮使用forEach()

that.$el.mini.forEach(function (element,i){ 
      var pag = element.pagination; 
      // Mini-Slider Pagination 
      $('li', pag).each(function(j, el) { 
       $(el).click(function() { 
        /* 
        * Toggle Mini-Slide 
        */ 
        that.slider_fn.mini.show(i, j); 
        return false; 
       }); 
      }); 
     }) ; 

警告:forEach()未在所有瀏覽器中實現。你可以看到如何填補它,如'兼容性'所述,在https://developer.mozilla.org/en/JavaScript/Reference/global_objects/array/foreach