Проблема с передачей аргументов в JavaScript - PullRequest
1 голос
/ 17 мая 2011

У меня следующий код

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 ]

4 голосов
/ 17 мая 2011

Используйте закрытие, чтобы закрыть значение из i:

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

Ранее ваша функция обращалась к переменной с именем i, теперь на каждой итерации вы создаете новую функцию, которая ссылается на i_, и эта переменная уникальна для каждой функции и ссылается на значение i, когда функция был создан.

2 голосов
/ 17 мая 2011

Вам необходимо создать функцию закрытия и передать переменные, которые вы хотите сохранить в качестве аргументов, следующим образом:

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));

    });
}
1 голос
/ 17 мая 2011

Полученные ответы являются традиционным способом решения вашей проблемы, но если вы не заботитесь о самозванных анонимных функциях, вы можете рассмотреть возможность использования 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

0 голосов
/ 17 мая 2011

Предполагается, что pag является элементом, и вы используете jquery.

для (var i = 0; i

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;
    });
});

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...