.queue()和.proxy(),jQuery中的动画计时

时间:2011-09-17 16:22:56

标签: jquery-animate jquery

我正在开发一个伪插件(只是jQuery对象上的命名空间初始化器)我在使用.proxy().queue()时遇到了一些麻烦(似乎是围绕最容易被误解的两种方法)

无论如何,我以为我把逻辑排除了;函数$.cb()采用函数映射:

$.cb({
    'show':         function(){ },
    'hide':         function(){ },
    'open':         function(){ },
    'close':        function(){ },
    'beforeUpdate': function(){ },
    'afterUpdate':  function(){ }
});

这些函数()包含应用于$(this)的动画序列,其上下文已通过.proxy()内部更改为相应的元素。它们存储在settings变量中,可用于“插件”的所有方法。

在内部,一些名称空间的事件处理程序,通过.live({ })附加:

// ...
'cb.hide': function(event){
    if(event.isPropagationStopped()){
        return false;
    }
    event.stopPropagation();
    $.proxy(settings.hide, this)();
    $(this).hide();
},
'cb.update': function(event, html){
    if(event.isPropagationStopped()){
        return false;
    }
    event.stopPropagation();
    $.proxy(settings.beforeUpdate, this)();
    $(this).html(html);
    $.proxy(settings.afterUpdate, this)();
},
// ...

无论如何,目的是使用这个“插件”将固有功能带到表中,但实现者可以通过功能映射来选择不同的过渡动画。

问题,是我似乎无法让这些功能正常排队;不同的人优先考虑等等。我曾尝试用.queue()进行嘲弄,但我似乎无法用它做任何事情:

// in cb.update
var $this = $(this);
$(this).queue(function(next){
    $.proxy(settings.beforeUpdate, $this)();
    next();
}).queue(function(next){
    $this.html(html);
    next();
}).queue(function(next){
    $.proxy(settings.afterUpdate, $this)();
}).dequeue();

问题在'cb.update'事件中尤为普遍,因为订单应为:

  • beforeUpdate被调用(动画序列发生并完成
  • 元素的内容通过.html()
  • 更新
  • afterUpdate被调用(动画序列发生并完成

实际发生的是:

  • 元素的内容通过.html()
  • 更新
  • beforeUpdate被调用(动画序列发生并完成
  • afterUpdate被调用(动画序列发生并完成

因此,假设提供的动画分别只是.fadeOut()fadeIn() beforeUpdateafterUpdate,它会更新内容,然后逐渐淡出。

那么,有关此类实施的任何建议吗?如何确保事件/动画的正确排序?在试图实现这样的功能方面,我是否已经走了狂野的愚蠢路线?

0 个答案:

没有答案