Откройте новое окно после того, как событие Click не работает в Safari, Chrome

Я пытаюсь открыть новое окно следующим образом:

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

Это работает в Firefox, но не в Chrome или Safari (до сих пор я только что тестировал на Mac). alert() работает во всех браузерах, поэтому, кажется, что-то мешает выполнению window.open в Safari/Chrome. Кроме того, если я удалю setTimeout и просто вызову window.open, то он будет работать во всех трех браузерах. Это почти так, если window.open вложен слишком далеко от события click, тогда он не работает в Safari/Chrome.

Итак, вы знаете, у меня есть все-Flash-сайт, и я пытаюсь открыть внешние ссылки в новом окне, поэтому я читаю хэш-тег в URL-адресе (например, htp://example. com/#/facebook/), и если он соответствует определенным элементам, я вызываю window.open, чтобы открыть определенный URL-адрес. У меня нет доступа к источнику Flash, иначе я бы справился с этим.

Любые идеи?

Ответ 1

Safari/Chrome имеют встроенные блокировки всплывающих окон, которые не позволяют работать. Единственный javascript, которому разрешено открывать новое окно в Safari/Chrome, - это javascript, непосредственно прикрепленный к обработчикам кликов (и другим прямым пользовательским обработчикам ввода). В прошлых версиях люди выяснили некоторые способы обмануть (например, создать какой-то другой элемент - форму или div - и имитировать пользовательский ввод с помощью javascript), но более новые версии умнее об этом. Я бы рекомендовал переконфигурировать все так, чтобы вы не использовали всплывающее сообщение с задержкой - это то, что обычно может раздражать пользователя.

Ответ 2

Я обошел это, проверив возвращаемое значение window.open() для undefined. Если это истинный сигнал вызова() с сообщением, чтобы пользователь мог отключить свой блокировщик всплывающих окон.

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

if (myWin == undefined)
   alert('Please disable your popup blocker');

Ответ 3

Другое обходное решение
Просто откройте всплывающее окно с параметрами ACCEPT и CANCEL и прикрепите действие window.open к кнопке ACCEPT, и оно будет работать. Это сработало для меня...