1

我有一个可以动态生成链接的网站。我想看看是否可以添加一个 onclick 事件处理程序来跟踪外部链接。我正在寻找具有 target="new" 的链接(这意味着我们网站的外部)并添加事件处理程序

html代码

 <a target="new" href="http://twitter.com/cnn">CNN</a>

我尝试测试的代码不起作用。让我知道我的代码有什么问题,或者我是否应该将 onclick 事件附加到外部链接?

js代码

var links = document.getElementsByTagName("a");
for (var i=0; <links.length; i++) { 
    if(links[i].target == 'new'){   
        links[i].onclick = function() {
            alert("Added onClick: " + links[i].href);        
        }
    }
}                                               
4

3 回答 3

1

您可以this在 onclick 函数中使用并避免关闭问题

var links = document.getElementsByTagName("a");
for (var i=0; i<links.length; i++) { 
    if(links[i].target == 'new'){   
        links[i].onclick = function(){  
            alert("Added onClick: " + this.href);           
        }
    }
}                                               
于 2012-08-03T23:27:37.333 回答
1

这里的另一个答案是您应该使用什么(使用它),但值得解决 for 循环中的闭包问题。

如果要在 for 循环中创建的闭包中的 for 循环中使用每次迭代都会更改的变量,请定义并调用一个匿名函数,该函数返回一个要绑定(绑定?)到 onclick 事件的函数。

var links = document.getElementsByTagName("a");
for (var i=0; i<links.length; i++) { 
    if(links[i].target == 'new'){   
        links[i].onclick =
            function (obj) {
                return function(event) {
                    alert("Added onClick: " + obj.href);        
                }                   
            }(links[i]);
    }
}

由于匿名函数的参数 (obj) 是按值传递的,因此在 for 循环的后续迭代中不会更改。返回的函数将拥有自己的对象副本。

当您将函数视为可以传递的对象时,Javascript 中的很多东西开始变得有意义。

于 2012-08-03T23:49:01.157 回答
0

你对 jQuery 不利吗?

$("a[target='new']").click(function(){alert($(this).attr("href"));});
于 2012-08-03T23:34:37.527 回答