我正在开发一个伪插件(只是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()
beforeUpdate
和afterUpdate
,它会更新内容,然后逐渐淡出。
那么,有关此类实施的任何建议吗?如何确保事件/动画的正确排序?在试图实现这样的功能方面,我是否已经走了狂野的愚蠢路线?