2011-11-19 38 views
1

我正在处理一组相当大的数据集,这些数据与页面上的对象相关,一些对象需要链接应用于它们onclick。连接到的链接是数据集的一部分,我为变量linkTarget建立链接的字符串,并像这样应用它。在Javascript中开发独特的动态onclick事件有困难

if (dataTag[i][3]==true){ 

    if(prepend==undefined || prepend=="undefined"){       
     var linkTarget=ResultsJSON["targetUrl"]; 
     ele.onclick = function(){ 
      window.open(linkTarget); 
     }; 
    } else { 
     var linkTarget=prepend+ResultsJSON["targetUrl"]; 
     ele.onclick = function(){ 
      window.open(linkTarget); 
     }; 
    } 

ele指的是用getElementByID拾取的元素。现在我遇到了很多对象,我遇到的问题是每个对象的onclick都是linkTarget的最后一个值。这全部包含在一个函数中,链接目标是一个局部变量,所以我不知道为什么。我一直在使用的东西数组一样

ele.onclick=function(){window.open(linkTarget[linkTarget.length-1]);}; 

甚至

ele.onclick=function(){window.open(linkTarget.valueOf());}; 

具有相同的结果尝试。我现在处于亏损状态,希望得到任何帮助。

+2

我的蜘蛛感觉告诉我你落在了for-loops陷阱的经典闭合。 – hugomg

回答

1

你是在一个循环中—因此,你需要把你的另一功能的东西将要执行的,就像这样:

if(dataTag[i][3]) { 
    if(prepend) { 
     (function(linkTarget) { 
      ele.onclick = function() { 
       window.open(linkTarget); 
      }; 
     })(ResultsJSON.targetUrl); 
    } else { 
     (function(linkTarget) { 
      ele.onclick = function() { 
       window.open(linkTarget); 
      }; 
     })(ResultsJSON.targetUrl); 
    } 

我也做了一些一般的修正。

+0

谢谢你我在这个问题上猛撞我的头 –

3

使用Array.forEach()来迭代您的数据并观察您的问题融化。

dataTag.forEach(function (item) { 
    if (item[3]==true) { 
     var linkTarget = ""; 
     if (prepend==undefined || prepend=="undefined") { 
      linkTarget = prepend; 
     } 
     linkTarget += ResultsJSON.targetUrl; 
     ele.onclick = function() { 
      window.open(linkTarget); 
     }; 
    } 
}); 

在旧的浏览器使用Array.forEach()看到这个compatibility note

+0

你的意思是“......并观看这个问题开始弹出”? :P – hugomg

+0

雅,也许吧。解决方案需要以某种方式调用函数。处理新的环境是不可避免的。至少用'.forEach()'你可以通过第二个参数指定'this'的值。 – gilly3