2017-10-16 67 views
0

我正在創建一個「在此選項卡中打開鏈接」上下文菜單項,應該在右鍵單擊給定網頁上的任何鏈接時出現。我目前的代碼的最後一塊添加屬性的每一個環節:僅根據需要設置contextmenu屬性會更好嗎?

for (let node of document.getElementsByTagName("a")) { 
    node.setAttribute("contextmenu", menu.id); 
} 

它發生,我認爲我可以在屬性只添加到那些真正右鍵單擊的鏈接,就像這樣:

for (let node of document.getElementsByTagName("a")) { 
    node.oncontextmenu = function() { 
     node.setAttribute("contextmenu", menu.id); 
    }; 
} 

以某種方式做它有什麼好處嗎?

+1

考慮事件代表團:將一個* contextmenu *監聽器放在所有鏈接的父代,然後檢查事件來自哪裏並從那裏去。如果你沒有很多鏈接,它真的很重要嗎?哦,並不是所有的A元素都是鏈接,有些可能是錨點。文檔中的所有鏈接都由* document.links *集合給出,所以'for(鏈接document.links)...'。 ;-)至少用於'document.links'的 – RobG

+0

+1。 @陰影可能是正確的,我正在推翻這一點,但我仍然好奇:你認爲什麼是「多」鏈接?看起來我在一些頁面上可能有多達300個。 – practik

+0

@RobG,你說的對,事件代表團就是要走的路。我相應地重寫了整個事情,它效果更好。如果可以的話,我會選擇您的評論作爲答案 - 想將其發佈爲一個,這樣我就可以? – practik

回答

0

每RobG的建議之上,設置在機身的屬性比任何我之間選擇的替代品更好 - 本質上,這一點:

document.body.addEventListener("contextmenu", menuOn); 

其次是這樣的:

function menuOn() { 
    if (document.activeElement.href !== undefined) { 
     document.body.setAttribute("contextmenu", menu.id); 
    } else { 
     document.body.removeAttribute("contextmenu"); 
    } 
} 
1

在這兩個示例中,您都將事件處理程序添加到每個a標記。

在第二個示例中,您只是使用事件處理程序來替換它本身。事實上,在這種情況下,我會高度懷疑用戶第一次右鍵單擊該行爲將與預期的處理程序取代自身的意圖不同,而不是僅僅按照您希望的方式執行。

總而言之,我認爲你正在推翻這一點。第一個例子看起來更輕更清晰。

相關問題