我有他在Kinetic.js中的代码:
function pacmanMove(x, y , duration, bate, color) {
var tween = new Kinetic.Tween({
node: group,
duration: duration,
x: x,
y: y,
onFinish: function() {
changeColor(color);
window[bate].remove();
}
});
return tween;
}
var eat = [];
for(var i = 0; i < linkItemsLen; i++) {
eat.push(pacmanMove(linkItems[i][2], 65, 1, linkItems[i][0], linkItems[i][4]));
window[linkItems[i][0]].on('mouseover', function() {
this.tween = eat[i];
this.tween.play();
});
}
我正在尝试将动态创建的补间传递给mouseover事件,但补间始终未定义,因此当事件被触发时,我收到错误消息TypeError: 'undefined' is not an object (evaluating 'this.tween.play')
为什么?我该如何解决这个问题?
答案 0 :(得分:1)
尝试使用 闭包 来捕获当前i
并使用var
代替创建私有变量。
for(var i = 0; i < linkItemsLen; i++) {
eat.push(pacmanMove(linkItems[i][2], 65, 1, linkItems[i][0], linkItems[i][4]));
window[linkItems[i][0]].on('mouseover', (function(index) { //create closure to capture current index.
return function(){
//Use var instead
var tween = eat[index];
tween.play();
}
})(i));
}
因为您在循环中附加了事件处理程序,所以在循环结束时,i
等于linkItemsLen
数组=&gt;之外的eat
eat[i]
返回undefined
。您的所有事件处理程序都会丢失当前的i
。
使用相同的技术,您还可以将补间直接传递给函数:
for(var i = 0; i < linkItemsLen; i++) {
eat.push(pacmanMove(linkItems[i][2], 65, 1, linkItems[i][0], linkItems[i][4]));
window[linkItems[i][0]].on('mouseover', (function(tween) { //create closure to capture current eat[i].
return function(){
tween.play();
}
})(eat[i]));//Pass the current eat[i]
}