我有一个这样的插件:
(function($){
$.fn.extend({
myplugin: function () {
var jobs = [];
this.each(function(){
jobs.push($(this).one(
'load',
function(){
// Line A: "Load" fires here
// Replace image source
$(this).attr('src','new_url');
// Line B: Everything is done, fire now!
}));
});
// Callback
$.when.apply(null,jobs).then(function(){
alert($(this).attr('src'));
});
return this;
}
});
})(jQuery);
when
帮助程序始终警告旧图像源。因为它是在{strong> A行之后load
之后调用的。但我需要在 B行上启动它。
如何解决这个问题?有什么想法吗?
谢谢!
答案 0 :(得分:4)
您没有将任何延期传递给when
。所有你传递的都是一个jQuery对象数组。
为集合中的每个项目创建一个新的deferred
,然后在事件监听器中resolve
:
(function($){
$.fn.myplugin = function () {
var deferreds = [];
this.each(function() {
var deferred = $.Deferred();
deferreds.push(deferred);
$(this).one('load', function() {
this.src = 'new_url';
deferred.resolve();
});
});
$.when.apply($, deferreds).then(function() {
alert('All sources have been changed.');
});
return this;
};
})(jQuery);
为了更简洁,您可以将函数传递给延迟构造函数:
this.each(function (i, element) {
deferreds.push( $.Deferred(function (deferred) {
$(element).one('load', function() {
this.src = 'new_url';
deferred.resolve();
});
}));
});