1

这似乎与此处发现的类似问题,但恐怕我不理解所提供的解决方案。 HTML5 中的多个放置事件

我正在尝试使用 Ext JS 库从一个拖动源设置多个放置目标。当我为 notifyEnter 定义闭包时,它似乎总是使用变量“i”来发出警报(出于调试目的,我已将其更改为警报)。来自Java背景,我的直觉是通过在循环中定义一个最终变量并在定义闭包之前分配我想要的 i 或 playerLocationPanel 来解决这个问题,但这似乎不是一个有效的解决方案.

这是我 8-10 年来第一次涉足 Javascript,非常感谢您的帮助。

/****
* Setup Drop Targets
***/
var playerPanelDropTargets = new Array();
var dropTargetEls = new Array();
for(var i=0;i<=5; i++){
    dropTargetEls[i] = playerLocationPanels[i].body.dom;

    playerPanelDropTargets[i] = Ext.create('Ext.dd.DropTarget', dropTargetEls[i], {
        ddGroup: 'GridExample',
        notifyEnter: function(ddSource, e, date){
            // The problem here is that it always calls, specifically playerLocationPanels[i]
            // and i is always going to be 1 more than the top of the loop.
            //playerLocationPanels[i].body.stopAnimation();
            //playerLocationPanels[i].body.highlight();
            alert(i);

        }
    });
}
4

1 回答 1

0

您需要采用与您引用的那个问题中提到的相同的基本方法:您的“notifyEnter”函数需要在一个单独的函数中创建,您将“i”传递给该函数,并返回处理函数。像这样的东西:

playerPanelDropTargets[i] = Ext.create('Ext.dd.DropTarget', dropTargetEls[i], {
    ddGroup: 'GridExample',
    notifyEnter: makeHandler(i)
});

// ...

function makeHandler(i) {
  return function(ddSource, e, date){
        alert(i);
        // etc.
    };
}

通过调用另一个函数来创建处理函数,您可以确保每个处理函数都有自己的“i”值副本。

于 2013-02-15T23:40:34.830 回答