js为什么不能阻止ctrl w关闭事件?

在 window 上监听keypress事件
当触发keydown事件时,判断ctrlKey是否为true,keyCode是否为87(w
如果是,阻止默认事件。
但是似乎并不能阻止窗口关闭事件

        //测试屏蔽ctrl+w 
        $(window).on('keydown',function(event){
            if(event.ctrlKey&&event.keyCode==87){
                event.preventDefault();
                event.returnValue = false;
                alert("已阻止关闭事件");
                return false;
            }
            if(event.ctrlKey&&event.keyCode==65){
                event.preventDefault();
                alert("已阻止关闭事件");
                return false;
            }
        });

下面那一段是测试其他组合键是不是能用
经过测试发现ctrl+a可以拦截,但是ctrl+w并不能拦截
通过打断点的方式发现,如果按了ctrl+w,似乎浏览器并没有触发keydown事件就直接关闭了页面
请问有什么解决方法么?

navigator.userAgent:
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36"

==============================
刚刚去测试了一下
ctrl + w在chrome浏览器中,不会触发任何监听事件
如果说为了安全或者为了用户主观意愿,在按下ctrl + w 以后一定要关闭当前标签页
为什么不做成,事件依旧触发,但是强制执行关闭命令。
类似于 onbeforeunload

阅读 10.2k
6 个回答

你的浏览器只是一个软件,它得到的东西都是操作系统给的,ctrl+w关闭浏览器tab页是操作系统的指令或者是当前页面上层软件的指令,意思就是关闭一个tab页,你当前在阻止的只是当前tab页的ctrl+w事件,怎么可能阻止上级指令的执行。

直白一点讲吧 windows上事件是消息机制的,按下ctrl + A 或者 ctrl + W 的时候触发系统中断,系统接收到按键判断是何类型,并层层传递给当前打开的窗口,此种情况下是浏览器,浏览器接收到消息,判断当前tab是哪个,并把这个消息传递给当前tab,当前的tab线程再一步处理按键类型,ctrl+A是全选,所以线程会传递一个全选的消息往js引擎,渲染引擎等,但是ctrl+W是关闭,tab页无需再往下传递按键消息,直接关闭当前tab

其中有很多不对的地方,但是可以按照这个说法帮助理解

键盘事件不只是有你的Javascript在浏览器中注册的事件处理程序, 系统的你是阻止不了的. Javascript 在浏览器中运行, 你只能控制浏览器给你的东西. 浏览器外的东西你就控制不了了, 除非你自己去Hack浏览器.

如果这样可以阻止浏览器关闭窗口,那意味着js可以调用你的操作系统,那每一张网页都有可能让你电脑死掉。
如果你不想让页面关闭,那就做提示吧,用onbeforeunload

优先级的问题,浏览器也会监听键盘上事件的,浏览器监听完毕才轮到js监听,感觉有点像事件捕获。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏