1

我有一个这样的插件:

(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助手总是提醒旧图像源。load因为它在Line A上被调用。但我需要在Line B上开火。

如何解决这个问题?有任何想法吗?

谢谢!

4

1 回答 1

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

    }));
});
于 2013-01-20T06:42:40.480 回答