2010-01-25 111 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); 
}