【问题标题】:jQuery looping a function after a .promise()jQuery 在 .promise() 之后循环一个函数
【发布时间】:2016-10-19 08:12:45
【问题描述】:

一旦promise 是.done(),我就会尝试循环一个函数。我似乎错过了什么。这里有什么建议吗?

我希望它在函数中运行,当最后一个动画完成后,再做一次。

我这里包含了所有的 JS,包括支持功能。

(function($) {
  $.fn.shuffle = function() {
    // credits: http://bost.ocks.org/mike/shuffle/
    var m = this.length, t, i;

    while (m) {
      i = Math.floor(Math.random() * m--);

      t = this[m];
      this[m] = this[i];
      this[i] = t;
    }

    return this;
  };
}(jQuery));

jQuery.noConflict();

jQuery(document).ready(function($) {

    $.fn.queueAddClass = function(className) {
        this.queue('fx', function(next) {
            $(this).addClass(className);
            next();
        });
        return this;
    };

    $.fn.animateGrid = function() {
        $('.grid').shuffle().each(function(index) {
            $(this).delay(100 * index).queueAddClass('zoom-down');
            $('div', this).delay(100 * index).animate({opacity:0.85}, 100);
        });
        $('.grid').promise().done( function(){
            $('.grid').animate({opacity:0}, 2000);
            $('#mosaic').animateGrid();
        });
    }

    $('#mosaic').animateGrid();

});

【问题讨论】:

  • xy 问题。简而言之,错误的工作工具。 google.com/…
  • 究竟是什么不起作用?
  • 顺便说一句,shuffle 函数太可怕了。 jQuery 集合中的元素应始终按 DOM 树顺序排列。
  • @Bergi 问题是它没有循环。我希望整个函数 animateGrid 在完成后循环。另外,我不确定您对 DOM 树顺序的含义。关键是要打乱顺序,使它们随机出现。
  • 我的意思是 jQuery 集合总是按照元素在 DOM 树中出现的顺序排列。不确定某些 jQuery 方法是否依赖于该不变量。你的 shuffle 函数打破了这一点。

标签: javascript jquery function promise


【解决方案1】:

您只是将动画添加到.grid 中的divs,而不是.grid 元素本身,因此当您在这些元素上调用.promise 时,它不会有任何队列等待。所以宁可使用

$.fn.animateGrid = function() {
    var self = this;
    this.find('.grid').shuffle().each(function(index) {
        $(this).delay(100 * index).queueAddClass('zoom-down');
        $('div', this).delay(100 * index).animate({opacity:0.85}, 100);
    });
    this.find('.grid div').promise().done( function(){
        $('.grid').animate({opacity:0}, 2000);
        self.animateGrid();
    });
}

【讨论】:

  • .grid 元素正在添加动画。为什么选择器工作的时候还需要find()?
  • @DaveMerwin 哦,对了,我错过了网格元素也是动画的。我使用了this.find,否则将函数作为 jQuery 插件是没有意义的 :-)
  • 好的。我显然做错了什么。最后的 self.animatedGrid() 不起作用。我的期望是,一旦承诺完成并且网格上的动画运行,它应该重新启动该功能。不对吗?
  • 是的,它应该是这样工作的。承诺会解决吗?当您将console.log() 行放在那里时,您会得到输出吗?控制台有错误吗?
  • 如果我在 self.animateGrid 之后放置一个 console.log (),我可以看到该语句被添加到控制台并递增。但动画功能不会重新运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-07
  • 2023-04-03
  • 1970-01-01
  • 2012-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多