2010-01-25 94 views
10

如何拦截文件中的链接点击? 它必须是跨平台的。提前使用javascript拦截所有文件链接点击

// content is a div with innerHTML 
var content = document.getElementById("ControlPanelContent"); 

content.addEventListener("click", ContentClick, false); 

function ContentClick(event) { 

    if(event.href == "http://oldurl") 
    { 
    event.href = "http://newurl"; 
    } 
} 

感谢您的帮助:

我期待这样的事情。

回答

18
for (var ls = document.links, numLinks = ls.length, i=0; i<numLinks; i++){ 
    ls[i].href= "...torture puppies here..."; 
} 

或者,如果你只是想拦截,不改变,添加一个onclick处理程序。这将导航到URL之前被调用:

var handler = function(){ 
    ...torment kittens here... 
} 
for (var ls = document.links, numLinks = ls.length, i=0; i<numLinks; i++){ 
    ls[i].onclick= handler; 
} 

注意document.links也包含AREA元素与href属性 - 不仅仅是A元素。

2

我刚刚发现了它,它可能会帮助一些人。除了拦截之外,如果您想禁止链接加载其他页面或重新加载当前页面。只需将href设置为'#'(如在内部页面引用前缀中)。现在,您可以使用链接在同一页面上调用一个函数。

+2

更新:这是不是最好的方式。使用'href =“javascript:void(0)”'通常会更好,因为它不会强制页面重新加载。 [更多](http://stackoverflow.com/questions/134845/href-attribute-for-javascript-links-or-javascriptvoid0) – worldsayshi 2012-11-05 16:34:57

+1

请注意,这两种方式都会阻止用户在链接上使用右键单击操作(打开在新标签中等) – 2016-12-30 01:01:09

9

如何在使用页面时生成链接?这种情况经常发生在今天更复杂的前端框架中。

正确的解决方案可能是将click事件监听器放在文档上。这是因为元素上的事件传播给他们的父母,并且实际上链接实际上是由最顶层的父母处理的。

这将为所有环节的工作,他们是否加载了页面,或在任何时间点的前端动态生成。

function interceptClickEvent(e) { 
    var href; 
    var target = e.target || e.srcElement; 
    if (target.tagName === 'A') { 
     href = target.getAttribute('href'); 

     //put your logic here... 
     if (true) { 

      //tell the browser not to respond to the link click 
      e.preventDefault(); 
     } 
    } 
} 


//listen for link click events at the document level 
if (document.addEventListener) { 
    document.addEventListener('click', interceptClickEvent); 
} else if (document.attachEvent) { 
    document.attachEvent('onclick', interceptClickEvent); 
}