Откройте новое окно после того, как событие 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, и оно будет работать. Это сработало для меня...