【问题标题】:javascript window.open in safari在 Safari 浏览器中打开 javascript window.open
【发布时间】:2021-10-11 06:12:08
【问题描述】:

我在 Safari(ipad 和桌面版本)中打开一个围绕弹出窗口阻止程序的新窗口时遇到了问题。基本上我发现如果没有从点击事件中调用 window.open,safari 会阻止弹出窗口。

正在调用 window.open 的事件当前是从一个列表框 onchanged。

在这种情况下,除了切换我们处理的事件来欺骗 safari 允许弹出窗口之外,还有其他方法吗? (onchanged 事件)

【问题讨论】:

    标签: javascript ipad safari


    【解决方案1】:

    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 触发器对我不起作用。

    【讨论】:

    • 我最终采用了一种优雅的降级方法,它允许用户仍然使用选择来选择他们想去的地方,然后一个按钮来实际执行导航......这样我就不弹出任何突兀的消息
    • 谢谢。我最终在 Safari 浏览器中显示了一个带有打开按钮的弹出窗口,该按钮确保 window.open 命令在用户启动的堆栈中执行。
    【解决方案2】:

    我认为除了单击按钮之外,没有其他方法可以在移动 Safari 中打开新窗口。请参阅类似的StackOverflow Question。我不确定它是否会起作用,但你可以看看triggering a button click programatically using jquery's trigger() function

    您可能还想查看在您自己的页面中显示对话框的选项,可能使用 jquery ui 之类的工具。

    HTH!

    【讨论】:

    • 不幸的是,当您尝试触发另一个元素的“点击”事件时,safari 也会阻止那些弹出窗口。获得弹出窗口的唯一方法是让用户在控件上生成点击事件,如果当您从 Ipad 的下拉列表中选择一个项目时,它会被视为“点击”,但它不会'不要触发点击事件... :( 一些降级代码的时间!
    • 是的,基本上任何像样的浏览器都不允许 window.open ,除非执行可以追溯到用户发起的事件。
    • 在我看来,真正的问题似乎是内置的静默弹出窗口拦截器。
    • 遗憾的是,即使用户生成了点击...触发异步操作(例如从 IndexedDB 中提取数据)...回调尝试打开窗口时,这也会中断:-(跨度>
    • 我相信 safari “判断”用户交互是错误的。 Chrome 做得更好。用户在选择器中发起了一次点击,如果它是一个更改事件,它无论如何都应该计数......这会破坏很多东西
    【解决方案3】:

    当 Safari 阻止弹出 uo 时,即使您点击了显示为未点击的链接。您可以在您的功能中使用以下功能来启用 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);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-16
      • 1970-01-01
      • 2015-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多