在jQuery中:如何触发自定义延迟事件

时间:2013-01-20 06:36:39

标签: javascript jquery jquery-plugins jquery-deferred

我有一个这样的插件:

(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行上启动它。

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

谢谢!

1 个答案:

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

    }));
});