2017-10-16 54 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标记。

在第二个示例中,您只是使用事件处理程序来替换它本身。事实上,在这种情况下,我会高度怀疑用户第一次右键单击该行为将与预期的处理程序取代自身的意图不同,而不是仅仅按照您希望的方式执行。

总而言之,我认为你正在推翻这一点。第一个例子看起来更轻更清晰。

相关问题