Javascript 仅根据需要设置contextmenu属性是否更好?

Javascript 仅根据需要设置contextmenu属性是否更好?,javascript,performance,Javascript,Performance,我正在创建一个“在此选项卡中打开链接”上下文菜单项,当右键单击给定网页上的任何链接时,该项应出现。我当前代码的最后一块将属性添加到每个链接: for (let node of document.getElementsByTagName("a")) { node.setAttribute("contextmenu", menu.id); } 我突然想到,我只能将该属性添加到那些实际右键单击的链接中,如下所示: for (let node of document.getElementsBy

我正在创建一个“在此选项卡中打开链接”上下文菜单项,当右键单击给定网页上的任何链接时,该项应出现。我当前代码的最后一块将属性添加到每个链接:

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);
    };
}

这样做有什么好处吗?

在您的两个示例中,您都将事件处理程序添加到每个
标记中

在第二个示例中,使用事件处理程序只是将其自身替换为真实的事件处理程序。事实上,在这个场景中,我高度怀疑用户第一次右键单击时的行为将与意图不同,因为它将使用预期的处理程序替换自身,而不仅仅是执行您希望它执行的操作


简言之,我认为你想得太多了。第一个例子似乎更轻、更清晰。

根据RobG的上述建议,在身体上设置属性比我选择的两个选项中的任何一个都好——本质上,这是:

document.body.addEventListener("contextmenu", menuOn);
其次是:

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

考虑事件委派:在所有链接的父节点上放置一个单上下文菜单侦听器,然后检查事件是从哪里来的,然后从那里走。如果你没有很多链接,这真的很重要吗?哦,并不是所有的A元素都是链接,有些可能是锚。文档中的所有链接都由document.links集合提供,因此
for(让document.links的链接).
;-)+1用于
文档。链接
@阴影可能是正确的,我正在思考这个问题,但我仍然好奇:你认为什么是“很多”的链接?看起来我在某些页面上可能有多达300页。@RobG,你是对的,活动代表团是最好的选择。我已经相应地重写了整件事,效果好多了。如果可以的话,我会选择你的评论作为答案——想把它作为一个帖子发布吗?如果你愿意,你可以发布自己的答案并接受它。;-)