Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 浏览器上下文菜单是否有关闭事件_Javascript_Jquery_Dom Events_Contextmenu - Fatal编程技术网

Javascript 浏览器上下文菜单是否有关闭事件

Javascript 浏览器上下文菜单是否有关闭事件,javascript,jquery,dom-events,contextmenu,Javascript,Jquery,Dom Events,Contextmenu,我使用jQuery捕捉上下文菜单事件,如下所示: $(document.body).on("contextmenu", function(e){ //do stuff here }); 到目前为止,一切顺利。现在我想在它关闭时执行一些代码,但似乎找不到正确的解决方案 使用类似于以下的方法可以处理一些情况,但不是全部: $(document.body).on("contextmenu click", function(e){}); 在以下情况下不会执行: 浏览器失去焦点 选择了上下文

我使用jQuery捕捉
上下文菜单
事件,如下所示:

$(document.body).on("contextmenu", function(e){
    //do stuff here
});
到目前为止,一切顺利。现在我想在它关闭时执行一些代码,但似乎找不到正确的解决方案

使用类似于以下的方法可以处理一些情况,但不是全部:

$(document.body).on("contextmenu click", function(e){});
在以下情况下不会执行:

  • 浏览器失去焦点
  • 选择了上下文菜单中的一个选项
  • 用户单击浏览器中不在页面上的任何位置

注意:我没有使用jQuery上下文菜单,我只是用它来捕捉事件。

以下代码可能会对您有所帮助


我需要检测上下文菜单何时关闭,因此我想出了一个解决方案

小提琴:

var-premenuelm;
var TempContextMenuCloseHandler=函数(e){
console.log('closed!');
//控制台日志(e);
removeEventListener('keyup',TempContextMenuCloseHandler,true);
removeEventListener('mousedown',TempContextMenuCloseHandler,true);
removeEventListener('focus',TempContextMenuCloseHandler,true);
var focuselem=document.getElementById('tempfocus');
if(focuselem===document.activeElement)premenuelem.focus();
focuselem.style.display='none';
};
var TempContextMenuHandler=函数(e){
console.log('open!');
//控制台日志(e);
premenuelm=document.activeElement;
var focuselem=document.getElementById('tempfocus');
focuselem.style.display='block';
focuselem.focus();
addEventListener('keyup',TempContextMenuCloseHandler,true);
addEventListener('mousedown',TempContextMenuCloseHandler,true);
addEventListener('focus',TempContextMenuCloseHandler,true);
};
addEventListener('contextmenu',TempContextMenuHandler,true)
html,正文{最小高度:100%;}


修复了浏览器的不集中问题,但其他两种情况仍然存在。我相信它解决了第一个和最后一个问题。唯一存在的问题是点击关联菜单的选项会失败,只点击选项不会从窗口中移除焦点。例如,当我点击当前选项卡时,关联菜单关闭,但窗口不会出现模糊事件。在chrome 42中,你可以右击并点击escape,hideContextMenu不会触发,但如果你点击它,它会。整洁+1.在桌面Chrome 53上,
'mousemove'
事件不会在上下文菜单打开时触发,而在上下文菜单关闭时会立即触发,因此将
$(窗口)。mousemove(hideContextMenu)
添加到容器中,应该在任何情况下都会触发hideContextMenu。我认为不可能注意到选择了上下文菜单选项。你为什么还需要意识到这一点?@Bergi在我正在显示自己的普通contextmenu旁边,我希望它同时关闭。也许这值得为所有相关浏览器创建一个功能请求,我个人想知道这个事件和
contextmenu
事件是如何触发的(鼠标、触摸、按键等)。@BrianTompsett-汤莱恩 你说得对,没有注意到标签描述。我已将其更改为dom事件。我喜欢该解决方案,但它在osx上似乎没有达到预期效果,我已在firefox和chrome上进行了测试。目前无法在windows上进行测试,但我认为有一点不同,在osx上,上下文菜单因任何原因消失后,你需要再次单击(或使用任何其他输入)在处理事件之前。我自己也遇到了上述解决方案的其他问题。我专注于让键盘和鼠标取消操作正常工作,我只对实际选择上下文菜单项进行了最低限度的测试。一些上下文菜单项触发事件,而其他项则不会!浏览器(或操作系统)正在吃事件和/或不生成应有的焦点事件-即使在上下文菜单关闭时持续重新触发“焦点”事件也是一个巨大的优势。有人建议使用mousemove,但Firefox(至少在Windows上)在上下文菜单打开的情况下继续处理浏览器事件。
var isIntextMenuOpen ;
$(document).on("contextmenu", function(e){

    isIntextMenuOpen = true;
});
function hideContextmenu(e){
       if(isIntextMenuOpen ){
            console.log("contextmenu closed ");
       }

     isIntextMenuOpen = false;
}
$(window).blur(hideContextmenu);

$(document).click(hideContextmenu);