为什么onclick函数会在onclick上运行,但是当我手动调用时却没有?

时间:2011-01-11 12:30:16

标签: javascript html

这是我的代码

 // 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时,警报会弹出 not

有什么想法吗?


编辑:我只想添加,我已经调试并确认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();
        }

3 个答案:

答案 0 :(得分:1)

这应该按预期工作:

示例:http://www.jsfiddle.net/8RJ5y/

答案 1 :(得分:0)

据我所知,它确实有效:jsfiddle

请注意,如果您使用this执行任何操作,则需要使用apply,而不是仅正常调用该函数:

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

答案 2 :(得分:0)

您正在循环中创建函数。 old_onclick将指向您循环的最后一个元素的click处理程序(因为在执行时,点击处理程序将在循环结束时访问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;
}