我正在尝试构建一个简单的动画 jQuery 插件。主要思想是获取一个元素并以某种方式在固定的间隔内重复操作它,这将是动画的 fps。
我想通过事件来实现这一点。我不想使用 for() 或 while() 之类的循环,而是想通过触发事件重复某些操作。这背后的想法:我最终希望能够对某些事件调用多个动作,例如在第一个动画完成时启动第二个动画,或者甚至在一个动画序列在某个帧上时启动它。
现在我尝试了以下(非常简化的插件版本):
(function($) {
$.fn.animation = function() {
obj = this;
pause = 1000 / 12; //-> 12fps
function setup(o) {
o.doSomething().trigger('allSetUp');
}
function doStep(o, dt) {
o.doSomething().delay(dt).trigger('stepDone');
}
function sequenceFinished(o) {
o.trigger('startOver');
}
function checkProgress(o) {
o.on({
'allSetup': function(event) {
console.log(event); //check event
doStep(o, pause);
},
'stepDone': function(event) {
console.log(event); //check event
doStep(o, pause);
},
'startOver': function(event) {
console.log(event); //check event
resetAll(o);
}
});
}
function resetAll(o) {
/*<-
reset stuff here
->*/
//then start over again
setup(o);
}
return this.each(function() {
setup(obj);
checkProgress(obj);
});
};
})(jQuery);
然后我这样调用动画:
$(document).ready(function() {
$('#object').animation();
});
然后——什么都没有发生。没有事件被触发。我的问题:为什么?不能在 jQuery 插件中使用这样的事件吗?我是否必须在 $(document).ready() 中“手动”触发它们(我不喜欢,因为这将是完全不同的事情——从插件外部控制动画。相反,我想使用事件在插件内部具有一定程度的“自我控制”)。我觉得我错过了一些关于自定义事件的基本知识(注意:我对此还是很陌生)以及如何使用它们......
感谢您的帮助。
解决方案:
事件处理和触发确实有效,我只需要先调用 checkProgress 函数:
代替
return this.each(function() {
setup(obj);
checkProgress(obj);
});
我不得不这样做:
return this.each(function() {
checkProgress(obj);
setup(obj);
});
所以必须在任何事件被触发之前调用事件监听函数,这当然很有意义......