对多个对象使用相同的onmouseover函数

时间:2010-05-15 15:46:00

标签: javascript onmouseover onmousedown

我正在使用JavaScript和PHP创建一个涉及网格的构建游戏。网格中的每个方格都是一个div,具有自己的onmouseover和onmousedown函数:

for(x=0; x < width; x++)
{
    for(y=0; y < height; y++)
    {
        var div = document.createElement("div");
        //...
        div.onmouseclick = function() {blockClick(x, y)}
        div.onmouseover = function() {blockMouseover(x, y)}
        game.appendChild(div);
    }
}

但是,所有的正方形似乎都有最后一个正方形的x和y。我可以理解为什么会发生这种情况 - 它正在指向x和y而不是克隆变量 - 但我怎么能解决它?我甚至试过

for(x=0; x < width; x++)
{
    for(y=0; y < height; y++)
    {
        var div = document.createElement("div");
        var myX = x;
        var myY = y;
        div.onmouseclick = function() {blockClick(myX, myY)}
        div.onmouseover = function() {blockMouseover(myX, myY)}
        game.appendChild(div);
    }
}

具有相同的结果。

我使用的是div.setAttribute("onmouseover", ...),它在Firefox中运行,但不是IE。 谢谢!

2 个答案:

答案 0 :(得分:1)

您需要创建一个闭包以保留xy的值。这应该可以解决问题:

for(var x=0; x < width; x++) {
  for(var y=0; y < height; y++) {
    var div = document.createElement("div");
    (function(x,y){
       div.onmouseclick = function() {blockClick(x, y)}
       div.onmouseover = function() {blockMouseover(x, y)}
    })(x,y);
    game.appendChild(div);
  }
}

更简洁的方法是定义一个函数来创建div,然后在每次迭代时调用它:

var createDiv = function(x,y){
  var div = document.createElement("div");
  div.onmouseclick = function() {blockClick(x, y)};
  div.onmouseover = function() {blockMouseover(x, y)};
  return div;
}

for(var x=0; x < width; x++) {
  for(var y=0; y < height; y++) {
    game.appendChild(createDiv(x,y));
  }
}

答案 1 :(得分:0)

这是因为你实际上是因为周围的闭包而在每个处理程序中共享相同的变量。所以你需要创建这样的本地闭包:

(function(x,y){
    div.onmouseclick = function() {blockClick(x, y)};
    div.onmouseover = function() {blockMouseover(x, y)};
})(x, y);