0

我让他在 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();
        });
    }

我正在尝试将动态创建的补间传递给鼠标悬停事件,但补间始终未定义,因此当触发事件时,我会收到一条错误消息TypeError: 'undefined' is not an object (evaluating 'this.tween.play'),为什么?我怎样才能解决这个问题?

4

1 回答 1

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您的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]
        }
于 2013-09-14T13:43:12.600 回答