如果按下“F2”,我想打开新窗口。下面的代码在 Firefox 中给出了 newWindow is null
错误消息。如果我不使用弹出窗口阻止程序,它就可以工作。在 IE 中也一样。即使启用了弹出窗口拦截器,它也可以在 chrome 中运行。
hotkeys: {
"f3" : function () {
url = "http://www.vse.cz";
var newWindow = window.open(url, '_blank');
newWindow.focus();
return false;
},
问题 1:我能否让它适用于所有浏览器,以便用户在使用热键插件时不必更改其设置?
问题 2: 为什么 Using JavaScript instead of target to open new windows 在 firefox 中运行没有任何问题?那是因为它是一个链接而不是使用热键插件吗?
我的理解是上面页面的脚本不知何故 操纵发生的事情 当用户点击链接时。它改变了点击的属性,所以 浏览器“不知道”这是新窗口,所以弹出窗口拦截器是 绕过。
在我的例子中,我使用由其他东西触发的纯 js 函数,而不是 用户点击。而且“我的功能”不会更改任何 html 对象的属性。我想这就是区别。我不确定我是不是 就在这里。
最佳答案
不幸的是,您无法通过按键打开新窗口(除了禁用弹出窗口阻止程序)。
IE、Firefox 和 Chrome 中的弹出窗口阻止程序(从高层次上)的工作方式是浏览器(在遇到对 window.open
的调用时)沿着 JavaScript 调用堆栈向上移动以确定当前函数是否是——或者被一个函数调用——一个事件处理程序。换句话说,它会查明当前函数是否正在执行,因为用户执行了触发 DOM 事件的操作。
如果是,则允许弹出;否则它被阻止。但是,哪些事件符合“允许弹出”的条件因浏览器而异。 By default in Mozilla , 只有 change
, click
, dblclick
, mouseup
, reset
, 和 submit
资格。 (我假设 IE 是相似的。)
函数是任何其他类型事件的事件处理程序——例如 keydown
/keyup
/keypress
在你的情况下——不有资格接受特殊的弹出窗口允许处理,这意味着你的弹出窗口被阻止,这就是你调用 window.open
的原因返回 null
.
但是,Chrome 会考虑 keydown
事件符合允许打开弹出窗口的条件,这就是您的脚本在该浏览器中运行的原因。
Here's a reduced example演示这是如何工作的。这个演示:
- 定义一个名为
spawn()
的函数这叫window.open
打开一个弹出窗口。 - 调用
spawn()
页面加载后立即。这被所有浏览器阻止,因为调用是从全局范围进行的;它不是从事件处理程序中调用的。 - 将函数附加到
window.onkeydown
这叫spawn()
.如果您在 Chrome 中按任意键,弹出窗口将打开,因为它允许来自keydown
的弹出窗口处理程序。在 IE 和 Firefox 中,弹出窗口将被阻止,因为这些浏览器不允许来自键盘事件的弹出窗口。 - 将事件处理程序附加到调用
spawn()
的链接.当您单击该链接时,所有浏览器都将允许弹出窗口,因为调用了window.open
。可以追溯到click
的事件处理程序事件。
正如您现在看到的,没有任何操作可以操纵事件属性或“欺骗”浏览器使其不知道有一个新窗口。允许通过链接点击打开弹出窗口的行为是设计的,理论是如果您点击了某个内容,您很可能想要看到任何内容在弹出窗口中。但是,当调用电话时 window.open
从您未执行任何操作的地方(例如全局范围),您可能对自动启动的弹出窗口中的任何 [ad] 不感兴趣。
通过这种方式,弹出窗口拦截器可以防止烦扰(自动启动广告),同时仍允许页面根据用户请求打开弹出窗口。
关于javascript - 即使弹出窗口被阻止,热键插件也会打开新窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6094613/