Safari中的JavaScript window.open

37

我在Safari浏览器(包括iPad和桌面版)中打开新窗口时遇到了问题,与弹出窗口拦截器有关。基本上,我发现如果window.open不是从单击事件调用的,Safari将阻止弹出窗口。

当前调用window.open的事件是从列表框onchanged事件中更改的。

除了切换我们处理的事件以欺骗Safari允许此情况下的弹出窗口(onchanged事件),还有其他方法吗?

3个回答

38

safari浏览器有一个可以静音弹出窗口拦截器的功能,但没有显示被阻止的链接。

要检查弹出窗口拦截器是否激活,请进入safari设置 > 安全性 > 类似于“阻止弹出式窗口”的选项。

为了简单地解决这个问题,因为我无法打开一个新窗口,我会显示一个警报,显示弹出窗口被阻止。

在我的情况下,我使用选择输入来打开外部链接:

HTML

<select id="retailer" class="windowOpen retailer-submenu">
    <option value="null">Select one</option>
    <option value="http://amazon.com">Amazon</option>
    <option value="http://ebay.com">eBay</option>
</select>

Javascript

<script type='text/javascript'>
    $('select.windowOpen').change(function(){
        var url = $(this).val();

        var open = window.open(url);
        if (open == null || typeof(open)=='undefined')
            alert("Turn off your pop-up blocker!\n\nWe try to open the following url:\n"+url);
    });
</script>

检查弹出窗口是否被阻止的代码只有这么多:

var open = window.open('http://google.com');
if (open == null || typeof(open)=='undefined')
    alert("Turn off your pop-up blocker!");

PS:在我的情况下,jQuery触发器没有起作用。


我最终采用了优雅降级的方法,允许用户仍然使用选择器选择他们想要去的地方,然后使用按钮执行导航...这样我就不会弹出任何突兀的消息。 - theMothaShip
1
谢谢。最终我在Safari浏览器中显示了一个弹出窗口,其中包含一个“打开”按钮,以确保window.open命令在用户发起的堆栈中执行。 - samneric

15

1
不幸的是,当您尝试触发另一个元素的“点击”事件时,Safari也会阻止这些弹出窗口。唯一的方法是通过用户生成的控件点击事件来获取弹出窗口,如果在iPad上从下拉菜单中选择项目算作“点击”,那么我可以接受,但它不会触发点击事件... :( 是时候编写一些降级代码了! - theMothaShip
1
基本上,任何像样的浏览器都不会允许 window.open,除非执行可以追踪到用户发起的事件。 - Jon z
2
在我看来,真正的问题似乎是内置的静默弹出窗口拦截器。 - cw24
6
很遗憾,即使用户生成了点击事件并触发了异步操作(例如从 IndexedDB 中提取数据),但这仍然会出现错误,因为回调函数尝试打开窗口 :-( - scunliffe
我相信Safari在“判断”用户交互方面存在问题,Chrome做得更好。用户在选择器中发起了单击操作,如果它是一个更改事件,那么它应该被计算在内...这会破坏很多东西。 - Miguel

-1

当Safari阻止弹出窗口时,即使您单击链接,它也似乎没有被点击。您可以在您的能力中使用以下内容来启用Safari弹出窗口。

"safariAllowPopups": "true"

要在Safari弹出窗口中点击允许按钮,请使用以下代码:

 ((IOSDriver<IOSElement>) driver).context("NATIVE_APP");
 ((IOSDriver<IOSElement>) driver).findElement(By.id("Allow")).click();
 try{
          Thread.sleep(5000);
    }catch (InterruptedException e){
          System.out.println(e);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接