2010-02-18 73 views
0

海伊家伙,我正在做一个简单的预载功能jQuery的传递变量的函数

(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()'函数没有被传递。

插件我可以用“一个”访问变量,喜欢上了这行

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不通过,有什么想法吗?

感谢

回答

0

如果我没有理解正确地,您想要将迭代索引传递给.after()。

在你的插件,可变计数器用于跟踪哪些你在各()迭代的步骤,这是不必要的,因为每一个的第一个参数是循环索引。请参阅文档中的each

此外,不需要功能is_last_done()作为限制变量是在范围为()由每个被称为匿名函数。

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文章 - Working with Closures中进行了描述。

+0

我想要的是能够将int传递到after()函数,并在我的插件中调用它,而不管它的名称如何。 – dotty 2010-02-18 15:29:02

0

变量是你的嵌套函数访问,因为它生活在外部closure,你并不需要的参数,你可以简单地使用它:

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

我想要的是能够将一个int传递给after()函数,并在我的插件中调用它,而不管它叫什么。 – dotty 2010-02-18 15:27:30