在Javascript中覆盖链接('a')对象的默认行为

bol*_*iva 21 javascript anchor dom overriding

我不知道我想要完成的任务是否可行.我想覆盖A给定HTML页面的所有锚对象(标记)的默认行为.我知道我可以循环遍历所有A元素并onclick从body元素onload方法动态地添加对它们中的每一个的调用,但我正在寻找更绝对的解决方案.我需要的是为所有A元素分配一个onclick动作,该动作调用一个方法将元素href属性作为参数传递,所以如下:

<a href="http://domain.tld/page.html">
Run Code Online (Sandbox Code Playgroud)

动态变为:

<a href="http://domain.tld/page.html" onclick="someMethodName('http://domain.tld/page.html'); return false;">
Run Code Online (Sandbox Code Playgroud)

就像我说的那样,理想的方法是在文档加载时以某种方式完全覆盖Anchor类.如果不可能,那么我将采用循环遍历所有A元素的方法(我已经知道该怎么做).

CMS*_*CMS 36

如果您不想迭代所有锚元素,则只需使用事件委托,例如:

document.onclick = function (e) {
  e = e ||  window.event;
  var element = e.target || e.srcElement;

  if (element.tagName == 'A') {
    someFunction(element.href);
    return false; // prevent default action and stop event propagation
  }
};
Run Code Online (Sandbox Code Playgroud)

这里查看上面的例子.

  • 该问题明确提到不迭代锚元素. (5认同)
  • @Benji XVI:这种方法的一个优点是,如果在绑定此事件之后以编程方式添加更多锚元素(即:内容加载了Ajax),它将继续适用于那些新锚点. (2认同)
  • CMS:谢谢,你的方法很完美,它简短而且很甜美,就像你在你的一条评论中说的那样,它实现了应用于所有'A'元素的目的,不仅仅是那些在最初渲染时在页面上的元素 - 这样做的目的是允许通过AJAX加载的内容中的新"A"标记继续工作.做得好! (2认同)
  • 当&lt;a&gt;标记内有DOM元素(例如图像,这是很常见的情况)时,此答案不起作用。为了解决这个问题,您必须查看“ e.path”字段,并在祖先中查找“ nodeName ==='A'”。 (2认同)

Chr*_*tow 7

使用jQuery:

$(function() {
    $("a").click(function() {
        return someMethodName($(this).attr('href'));
    });
});

function someMethodName(href)
{
    console.log(href);
    return false;
}
Run Code Online (Sandbox Code Playgroud)


Ben*_*XVI 6

window.onload = function() {
    var anchorElements = document.getElementsByTagName('a');
    for (var i in anchorElements)
        anchorElements[i].onclick = function() {
            alert(this.href);
            return false;
        }
}
Run Code Online (Sandbox Code Playgroud)

这是最简单的方法。包裹在<script type="text/javascript">...</script>文档头中,它将在页面加载时运行。