11

I'm trying to open a new window like so:

$('#wrapper').click(function() {
    window.setTimeout(function() {
        //alert('hi');
        window.open("http://example.com", "ExternalLinks", "resizable=yes, scrollbars=yes, status=yes");
    }, 1000);
});

This works in Firefox, but not in Chrome or Safari (so far, I've just tested on a Mac). The alert() works in all browsers, so there seems to be something preventing the window.open from executing in Safari/Chrome. Furthermore, if I remove the setTimeout and just call the window.open then it does work in all 3 browsers. It's almost like if the window.open is nested too far away from the click event, then it doesn't work in Safari/Chrome.

So you know, I have an all-Flash website and I'm trying to get external links to open in a new window, so I'm reading the hash tag in the URL (ex. htp://example.com/#/facebook/) and if it matches certain items, then I'm calling window.open to open a specific URL. I don't have access to the Flash source, or I would handle this there.

Any ideas?

matthewpavkov
  • 2,918
  • 4
  • 21
  • 37

3 Answers3

15

Safari/Chrome have built-in pop-up blockers that stop this from working. The only javascript that is allowed to open a new window in Safari/Chrome is javascript directly attached to click handlers (and other direct user input handlers). In past versions people figured out some ways to cheat (like generating some other element -- a form or div -- and simulating user input with javascript), but newer versions are smarter about detecting this. I'd recommend re-configuring things so that you don't use a delayed pop-up -- that is the kind of thing that can generally be jarring to a user after all.

Ben Lee
  • 52,489
  • 13
  • 125
  • 145
  • 1
    It's also worth noting that while Safari and Chrome have these strict popup blockers built in and turned on by default, it's not that other browsers don't have them -- it's just that for other browsers they are either add-ons or not automatically turned on at installation time. – Ben Lee Jan 12 '11 at 16:46
8

I got around this by checking the return value of window.open() for undefined. If that is true call alert() with a message for the user to to disable their popup blocker.

var myWin = window.open([args]);

if (myWin == undefined)
   alert('Please disable your popup blocker');
Dwight Sands
  • 111
  • 1
  • 8
0

Another workaround
Just open a popup with ACCEPT and CANCEL options and attach the window.open
action to the ACCEPT button and it will works. It worked for me...

Philip Enc
  • 1,072
  • 15
  • 21