2

是我的代码(简化):意外事件覆盖

function FillTable (oProfile_data) { 

    var oTable = document.getElementById ("table"); 

    for (var key in oProfile_data) { 

     var oRow = oTable.insertRow (oTable.rows.length); 
     var oCell = oRow.insertCell (0); 

     var oLink = document.createElement ("a"); 
      oLink.href = "javascript:void(0)"; 
      oLink.innerHTML = "Visit Homepage"; 

      oLink.addEventListener ("click", 
      function() { 
       var win = window.open (oProfile_data [key]["url"], "_blank"); 
       win.focus(); 
      }, false); 

     oCell.appendChild (oLink); 
    } 
} 

的问题是,每行都有一个链接到同一个文件,我想不通为什么!

我的临时解决办法是:

oLink.href = "javascript:void(0); var win = window.open (\"" + oProfile_data [key]["url"] + "\", \"_blank\"); win.focus();"; 

工作正常。 我认为这是一个事件压倒一切的问题,但我可能是错的。

任何帮助将非常感谢!

回答

1

这是一个问题,可以通过了解关闭来解决。您的匿名函数(绑定到点击事件)不会被调用,直到用户点击链接,当该行被执行:

var win = window.open (oProfile_data [key]["url"], "_blank"); 

key值将被FillTable功能被封闭。因此,它将保留函数结束时的值(即循环中保存的最后一个值)。

您必须为循环的每次迭代创建一个新的闭包。喜欢的东西:

oLink.addEventListener ("click", 
(function (k) { 
    return function() { 
     var win = window.open (oProfile_data [k]["url"], "_blank"); 
     win.focus(); 
    } 
} 
)(key), false); 

上面,我们创建一个函数,返回打开你的窗函数。然后,我们将key的值传递给该函数,从而创建一个新的闭包。

+0

非常感谢 – Molotov