37

I've run into an issue with opening a new window in safari (both ipad and desktop versions) that revolves around the popup blocker. Basically I've found that if window.open isn't called from a click event, safari will block the popup.

The event that is calling window.open is currently onchanged from a list box.

Is there any way other than switching which event we handle to trick safari into allowing a popup in this scenario? (the onchanged event)

theMothaShip
  • 1,191
  • 1
  • 12
  • 24

3 Answers3

38

The safari has a pop-up blocker silencer not show when a link is blocked.

To check if the pop-up blocker is active, go on safari settings > security > something like blocking pop-ups.

To cross it in a simple way, since I can not open a new window, I display an alert showing pop-up blocked.

In my case, I use select inputs to open external links:

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>

The code to check if a pop-up is blocked is just this:

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

PS: the jquery trigger did not work with me.

Lucas Serafim
  • 3,702
  • 6
  • 30
  • 36
  • I ended up going with a graceful degradation approach which allowed the user to still use the select to pick where they wanted to go and then a button to actually perform the navigation... That way I'm not popping up any obtrusive messages – theMothaShip Jul 26 '12 at 19:39
  • 1
    Thanks. I ended up displaying a pop-up in safari browsers with an Open button that ensured the window.open command was performed in a user-initiated stack. – samneric Nov 18 '16 at 00:55
15

I don't think there is a way to open a new window in mobile safari other than from a button click. Refer to this StackOverflow Question which is similar. I'm not sure if it will work, but you can look at triggering a button click programatically using jquery's trigger() function.

You might also want to look at options of showing a dialog within your own page, maybe using tools like jquery ui.

HTH!

Community
  • 1
  • 1
Scorpion-Prince
  • 3,574
  • 3
  • 18
  • 24
  • 1
    Unfortunately, when you try to trigger another elements "click" event, safari also blocks those as popups. The only way to get a popup, is to have a user generated click event on a control, which I would be fine with if when you selected an item from the dropdown on an Ipad, it counted as a "click", however it doesn't fire the click event... :( Time for some degradation code! – theMothaShip Mar 27 '12 at 18:48
  • 1
    Yeah basically any decent browser will not allow window.open except when the execution can be traced to a user-initiated event. – jrz Feb 27 '14 at 19:06
  • 2
    In my opinion the real problem seems to be the built-in silent popup blocker. – cw24 Oct 20 '14 at 08:18
  • 6
    Sadly this breaks even when the user generated the click... which triggers an asynchronous action (say pulling data from an IndexedDB)... where the callback tries to open the window :-( – scunliffe Mar 11 '15 at 19:00
  • I believe the safari is "judging" user interaction wrong. Chromes does it better. The user initiated a click in the picker, if its a change event it should count anyway... This breaks so many things – Miguel Oct 06 '21 at 09:41
-1

When Safari block the pop uo even if you click the link it appears as its not clicking.you can use below in your capabilities to enable safari popup

"safariAllowPopups": "true"

To Click on the Allow button in Safari Pop up use below code:

 ((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);
    }
Sonali Das
  • 943
  • 1
  • 7
  • 24