我正在尝试根据select元素上的onChange事件打开一个窗口,而不会被Chrome的弹出窗口拦截器阻止。
这里证明了这个问题。
https://jsfiddle.net/yyfe0824/1/
model(params {}
window.open调用'click me'按钮没有问题,但如果你尝试更改select下拉列表,chrome会阻止弹出窗口。
到目前为止,这个问题的答案已经特定于onClick事件。做研究表明,如果Chrome检测到它不是通过某种处理程序触发的用户,那么Chrome会阻止弹出窗口,因此我特意尝试内联调用函数,而不是使用其他命名函数。
这是window.open的预期行为,特别是onChange,如果有,是否有任何特定的解决方法? (除了首先将结构更改为点击事件。)
答案 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;
}
}