Открыть новое окно после того, как событие клика не работает в Safari, Chrome - PullRequest
11 голосов
/ 12 января 2011

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

$('#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, тогда он работает во всех 3 браузерах.Это почти как если бы window.open был вложен слишком далеко от события click, тогда он не работает в Safari / Chrome.

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

Есть идеи?

Ответы [ 3 ]

14 голосов
/ 12 января 2011

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

7 голосов
/ 06 февраля 2014

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

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

if (myWin == undefined)
   alert('Please disable your popup blocker');
0 голосов
/ 18 ноября 2015

Другой обходной путь
Просто откройте всплывающее окно с параметрами ПРИНЯТЬ и ОТМЕНА и присоедините действие window.open
к кнопке ПРИНЯТЬ, и оно будет работать.У меня это сработало ...

...