这更多的是一个问题,涉及我的解决方案之一为什么工作,而另一个不是。我对JS相当陌生,仅仅学习了几个月,虽然我掌握了大部分基础知识,但我觉得我缺乏最佳实践的知识。对象方法中的Javascript回调
我正在为信息图表顶部创建一个动画英雄图像,并且使用JS创建了两列火车,它们从左到右移动,另一个从右到左移动。我创建了下面的代码,它的工作:
$(document).ready(function() {
var anim = {
train1: $(".train-one"),
train2: $(".train-two"),
moveLeft: function(percent, duration) {
anim.train1.animate({left: percent}, duration, "linear")
},
moveRight: function(percent, duration) {
anim.train2.animate({right: percent}, duration, "linear")
},
leftTrain: function() {
anim.moveLeft("33%", 1000, anim.moveLeft)
anim.moveLeft("66%", 2000, anim.moveLeft)
anim.moveLeft("100%", 1000, anim.moveLeft)
anim.moveLeft("-100px", 1)
},
rightTrain: function() {
anim.moveRight("40%", 1000, anim.moveRight)
anim.moveRight("60%", 2000, anim.moveRight)
anim.moveRight("100%", 1000, anim.moveRight)
anim.moveRight("-100px", 1)
},
};
anim.leftTrain();
anim.rightTrain();
setInterval(anim.leftTrain, 5000);
setInterval(anim.rightTrain, 6000);
});
什么我不知道是为什么,当我预计它下面没有工作,我创建了一个单独的方法来重置列车一旦所有的回调已经完成:
resetLeftTrain: function(test) {
anim.train1.css("left", "-100px ");
},
leftTrain: function() {
anim.moveLeft("33%", 1000, anim.moveLeft)
anim.moveLeft("66%", 2000, anim.moveLeft)
anim.moveLeft("100%", 1000, anim.resetLeftTrain)
anim.resetLeftTrain()
},
对不起,如果答案真的很明显,我不习惯在普通的JS回调。请随意给任何其他结构指针等,真的很感激!
干杯。
编辑:我解决了问题,由于下面的答案,现在的代码工作完美如下:
$(document).ready(function() {
var anim = {
train1: $(".train-one"),
train2: $(".train-two"),
moveLeft: function(percent, duration, callback) {
this.train1.animate({left: percent}, duration, "linear", callback)
},
moveRight: function(percent, duration, callback) {
this.train2.animate({right: percent}, duration, "linear", callback)
},
resetLeftTrain: function() {
this.train1.css("left", "-100px");
},
resetRightTrain: function() {
this.train1.css("right", "-100px");
},
leftTrain: function() {
var self = this;
this.moveLeft("33%", 1000, function() {
self.moveLeft("66%", 2000, function(){
self.moveLeft("100%", 1000, function(){
self.resetLeftTrain();
});
});
});
},
rightTrain: function() {
var self = this;
this.moveRight("40%", 1000, function() {
self.moveRight("60%", 2000, function(){
self.moveRight("100%", 1000, function(){
self.resetRightTrain();;
});
});
});
},
};
anim.leftTrain();
anim.rightTrain();
setInterval($.proxy(anim.leftTrain, anim), 5000);
setInterval($.proxy(anim.rightTrain, anim), 6000);
});
下一次,我会考虑使用jQuery .promise()方法,以避免过多的丑陋缩进。
感谢所有帮助,希望这个问题,它的答案是别人
NB:通过名称_on那个object_中的方法来引用一个对象(您的'anim')通常是一个_really bad idea_。它打破封装。 – Alnitak 2014-09-19 11:08:10
此外,你的班级应该只有(恕我直言)处理_列车,用不同的方法向左或向右移动。那么这个类将会有两个单独的实例。 – Alnitak 2014-09-19 11:09:29
感谢Alnitak,从本身的方法中引用对象的正确方法是什么? – user3586963 2014-09-19 11:42:50