JQuery передача переменной в функцию - PullRequest
0 голосов
/ 18 февраля 2010

Слушайте, ребята, я делаю простую функцию предварительной загрузки

(function($) {
    $.fn.preload = function(settings) {

    var config = {
        before: function(){ return; },
        end: function(){ return; },
        after: function(a){ return; }
    };

    if (settings) $.extend(config, settings);

    var limit = this.length - 1;
    var counter = 0;

    settings.before();

    is_last_done = function(i){if (i == limit) return true;};

    this.each(function(i, src){
        $("<img>").attr("src", src).load(function(){

            if( a == counter ) settings.after();
            if(is_last_done(i)) settings.end(); // Last is done
            counter++;

        });
    });
    return this;
};
})(jQuery);

и вызываю ее с помощью

    img = ['a.jpg', 'b.jpg', 'b.jpg'];

    a = 1;

    $(img).preload({
        before: function(){ return; },
        end: function(){  },
        after: function(a){
            console.log('first done');
        }
    });

. Проблема в том, что переменная a передается вafter () 'функция не передается.

Внутри плагина я могу получить доступ к переменной с помощью' a ', как в этой строке

if( a == counter ) settings.after();

Доступно, однако,' a 'Что делать, если я хочу назвать переменную к чему-то еще?Как получить доступ к аргументу функции after ()?

Мой код больше не будет работать, если я использую этот код

img = ['a.jpg', 'b.jpg',' b.jpg '];

b = 1;

$(img).preload({
    before: function(){ return; },
    end: function(){  },
    after: function(b){
        console.log('first done');
    }
});

b не получено, есть идеи?

Спасибо

Ответы [ 2 ]

0 голосов
/ 18 февраля 2010

Если я правильно понимаю, вы хотите передать индекс итерации в .after ().

В вашем плагине переменный счетчик используется для отслеживания шага каждой () итерации, в которой вы находитесь. Это не нужно, поскольку первым параметром для каждого является индекс цикла. См. каждый в документации.

Кроме того, функция is_last_done () не требуется, так как переменная предела находится в области действия для анонимной функции, вызываемой each ().

var limit = this.length - 1;

settings.before();

this.each(function(i, src){
    $("<img>").attr("src", src).load(function(){

        if (i == a) settings.after(i);
        if (i == limit) settings.end();

    });
});

Javascript имеет лексическую область видимости, поэтому вам не нужно ничего делать, чтобы функция видела переменные, объявленные во вложенных областях. Это правильно называется замыканием и описано в этой статье Mozilla - Работа с замыканиями .

0 голосов
/ 18 февраля 2010

Переменная доступна в ваших вложенных функциях, поскольку она находится во внешнем замыкании , аргумент вам не нужен, вы можете просто использовать его:

var img = ['a.jpg', 'b.jpg', 'b.jpg'];
var b = 1;

$(img).preload({
    before: function(){ return; },
    end: function(){  },
    after: function(){
        // b is accessible here.
        console.log(b);
    }
});
...