javascript - 即使弹出窗口被阻止,热键插件也会打开新窗口?

标签 javascript jquery jstree

如果按下“F2”,我想打开新窗口。下面的代码在 Firefox 中给出了 newWindow is null 错误消息。如果我不使用弹出窗口阻止程序,它就可以工作。在 IE 中也一样。即使启用了弹出窗口拦截器,它也可以在 chrome 中运行。

使用 jstree pre 1.0 stable

            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/

相关文章:

javascript - 使用 jQuery 按 JSON 数组分组

jstree - 我可以以编程方式关闭 jsTree 中的上下文菜单吗?

jquery - 如何编辑 jsTree 节点并获取新名称?

javascript - 如何将类属性绑定(bind)到 Vue 2.0 中的表达式?

javascript - 基于 Three.js 中新枢轴的对象动画旋转

javascript - 有没有办法从您使用 .load() 加载的 htm 加载函数? jQuery

jquery - 动态禁用和启用单选按钮

JavaScript 无法在 Chrome 或 Firefox 上运行

javascript - 关闭存储在计时器/Websocket 客户端对数组中的 JavaScript setInterval 计时器

javascript - 示例 jsTree 代码不起作用