'window.open'已被Chrome更改事件阻止

时间:2015-05-26 18:25:16

标签: javascript html google-chrome onchange

我正在尝试根据select元素上的onChange事件打开一个窗口,而不会被Chrome的弹出窗口拦截器阻止。

这里证明了这个问题。

https://jsfiddle.net/yyfe0824/1/

model(params {}

window.open调用'click me'按钮没有问题,但如果你尝试更改select下拉列表,chrome会阻止弹出窗口。

到目前为止,这个问题的答案已经特定于onClick事件。做研究表明,如果Chrome检测到它不是通过某种处理程序触发的用户,那么Chrome会阻止弹出窗口,因此我特意尝试内联调用函数,而不是使用其他命名函数。

这是window.open的预期行为,特别是onChange,如果有,是否有任何特定的解决方法? (除了首先将结构更改为点击事件。)

2 个答案:

答案 0 :(得分:5)

根据设计,浏览器阻止window.open的唯一时间是您处理click事件时。

我的建议是提供一个链接,当用户从下拉列表中选择时,该链接会发生变化。

我建议不要打开弹出窗口,因为当你从下拉列表中选择时用户不希望弹出窗口,这就是弹出窗口阻止程序通常不允许这样做的原因。即使你发现在浏览器中有效的东西(在Firefox中为https://jsfiddle.net/yyfe0824/5/),它也可能在将来中断。

答案 1 :(得分:-1)

您应该可以通过点击连接来解决此问题,并简单地确定新选择的项目是否与之前选择的项目匹配。

我已编辑了之前的JSFiddle以使其正常运行。

dropdown.addEventListener('click', Foo);    
function Foo(e)
{
    var selectedIndex = dropdown.selectedIndex;
    if(selectedIndex !== oldSelectedIndex)
    {
        var val = dropdown.options[selectedIndex].value;
        var opened = window.open(val);
        oldSelectedIndex = selectedIndex;
    }
}