繁体   English   中英

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

[英]In jQuery: How to fire a custom deferred event

我有一个这样的插件:

(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助手始终警告旧图像源。 因为它是在A线上 load后调用 但我需要在B线上开火。

怎么解决这个? 有任何想法吗?

谢谢!

你没有把任何延期传递给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();
        });

    }));
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM