2011-01-11 31 views
0

这是我的代码为什么onclick函数在onclick上运行,但是当我手动调用它时,却不能运行onclick函数?

// Register onclick 
var old_onclick = link.onclick; 

link.onclick = function() { 
    astr_track_action(param); 

    if(typeof(old_onclick) == "function") 
    old_onclick(); 
} 

这是HTML

<a onclick="alert('hello!');" href="http://www.google.com?acme=link&foo=bar">To google!</a> 

当我点击链接,警报弹出。但是当我用我的JS代码覆盖onclick时,弹出而不是

任何想法?


编辑:我只想补充,我已经调试并确认old_onclick()运行,但没有警告信息显示出来。


编辑:这里是循环开始的完整代码。我不明白它是如何相关,但它要求:

for(var i = 0; i < document.links.length; i++) 
{ 
    var link = document.links[i]; 
    var eventlink = link.href.split("acme="); 

    if(eventlink.length > 1) 
    { 
     var param = eventlink[1].split("&")[0]; 
     var newlink = link.href; 

     // Register onclick 
     var old_onclick = link.onclick; 

     link.onclick = function() { 
      astr_track_action(param); 

      if(typeof(old_onclick) == "function") 
       old_onclick(); 
     } 
+0

是'astr_track_action`定义? `param`是在什么地方定义的? `astr_track_action`执行成功了吗?如果您评论此行,会发生什么情况? – 2011-01-11 12:40:12

回答

0

您正在循环中创建函数。 old_onclick将指向您循环的最后一个元素的点击处理程序(因为执行时,循环已完成时,点击处理程序将访问old_onclick)。
你必须通过例如使用立即函数:

var old_onclick = link.onclick; 

link.onclick = (function(old_onclick) { 
    return function() { 
     astr_track_action(param); 

     if(typeof(old_onclick) == "function") 
       old_onclick(); 
     } 
    }; 
}(old_onclick)); 

JavaScript没有块范围,只有函数范围。即

for(...) { 
    var foo = something; 
} 

相同

var foo; 
for(...) { 
    foo = something; 
} 
0

它的工作,只要我可以告诉:jsfiddle

需要注意的是,如果你正在使用this做任何事情,你将需要使用apply,而不是只调用该函数通常为:

if (typeof(old_onclick) == 'function') { 
    old_onclick.apply(this, arguments); 
}