这是我的代码
// 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();
}
答案 0 :(得分:1)
这应该按预期工作:
答案 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;
}