【问题标题】:It is possible to Restore context menu可以恢复上下文菜单
【发布时间】:2013-11-06 22:33:46
【问题描述】:

我正在阻止上下文菜单,然后我想将其恢复到以前的状态。

myElement = document.querySelector('*');
myElement.addEventListener('contextmenu', MyContextMenu);

执行上述代码后是否可以恢复默认上下文菜单? 如果答案是肯定的,那么如何或如何正确地做到这一点?

我想要的是阻止上下文菜单,然后在一段时间后恢复它。

【问题讨论】:

  • 不确定我是否正确理解了您的问题,但您可以在您不想再调用MyContextMenu 时调用myElement.removeEventListener('contextmenu', MyContextMenu); 以进行上下文菜单的下一次调用。

标签: javascript


【解决方案1】:
var oldHandlerToKeep = element.oncontextmenu

【讨论】:

  • 可以将其作为参数传递为:myElement.addEventListener('contextmenu', MyContextMenu(myElement.oncontextmenu));
  • 如果我可以将旧处理程序传递给新处理程序,那么这个答案对我来说已经足够了
  • 这仅在另一个处理程序设置为element.oncontextmenu = AnotherHandler; 时才有效,但如果它是在element.addEventListener('contextmenu', AnotherHandler); 注册时无效。无论如何,只要MyContextMenu 不返回false,停止传播或阻止默认行为,其他处理程序(包括默认开启)也应该被调用,因为addEventListener 不会覆盖现有处理程序,而只是添加一个额外的。
  • 那么我设置为NULL意味着回到标准设置
  • 执行element.oncontextmenu = null; 不会删除使用element.addEventListener('contextmenu', ... ) 添加的侦听器。
【解决方案2】:

将所有上下文菜单重新分配为默认值:

document.querySelector('div').oncontextmenu = _=>false;

var d = document.createElement('div').oncontextmenu;
[...document.querySelectorAll("*")].forEach(e => e.oncontextmenu = d);
<div>sample</div>

【讨论】:

    【解决方案3】:

    这是一个替代解决方案(基于 this post by Chema):

        document.body.oncontextmenu = null;
        document.addEventListener("contextmenu",
            function (event) {
                event.returnValue = true;
                if (typeof(event.stopPropagation) === 'function')
                {
                    event.stopPropagation();
                }
                if (typeof(event.cancelBubble) === 'function')
                {
                    event.cancelBubble();
                }
            }, true);
    

    如果之前调用了 preventDefault(),这有助于恢复上下文菜单。希望对路人有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 2011-12-19
      • 2018-03-03
      • 1970-01-01
      相关资源
      最近更新 更多