干草伙计们,我正在制作一个简单的预加载功能
(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');
}
});
问题是传递给'after()'函数的'a'变量没有被传递。
在插件内部,我可以使用'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没有通过任何想法?
由于
答案 0 :(得分: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);
}
});
答案 1 :(得分:0)
如果我理解正确,您希望将迭代索引传递给.after()。
在你的插件中,变量计数器用于跟踪你所在的每个()迭代的哪一步。这是不必要的,因为每个步骤的第一个参数是循环索引。请参阅文档中的each。
此外,函数is_last_done()不需要,因为limit变量在每个()调用的匿名函数的范围内。
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。