Иногда я сталкивался с веб-страницей, которая пытается открыть новое окно (для ввода данных пользователем или чего-то важного), но блокировщик всплывающих окон предотвращает это.
Какие методы может использовать вызывающее окно, чтобы убедиться, что новое окно запущено правильно?
Я попробовал несколько приведенных выше примеров, но мне не удалось заставить их работать с Chrome. Этот простой подход, похоже, работает с Chrome 39, Firefox 34, Safari 5.1.7 и IE 11. Вот фрагмент кода из нашей библиотеки JS.
источник
Обновление: всплывающие окна существуют с очень древних времен. Первоначальная идея заключалась в том, чтобы показать другой контент, не закрывая главное окно. На данный момент есть и другие способы сделать это: JavaScript может отправлять запросы на сервер, поэтому всплывающие окна используются редко. Но иногда они все же пригодятся.
В прошлом злые сайты часто злоупотребляли всплывающими окнами. Плохая страница может открывать множество всплывающих окон с рекламой. Итак, теперь большинство браузеров пытаются блокировать всплывающие окна и защищать пользователя.
Большинство браузеров блокируют всплывающие окна, если они вызываются вне обработчиков событий, запускаемых пользователем, например onclick.
Если задуматься, это немного сложно. Если код находится непосредственно в обработчике onclick, это просто. Но что такое всплывающее окно открывается в setTimeout?
Попробуйте этот код:
Всплывающее окно открывается в Chrome, но блокируется в Firefox.
… И это работает и в Firefox:
Разница в том, что Firefox рассматривает тайм-аут в 2000 мс или меньше, что является приемлемым, но после него - удаляет «доверие», предполагая, что теперь оно «вне действия пользователя». Итак, первый заблокирован, а второй - нет.
Исходный ответ, который был текущим 2012:
Надеюсь это поможет! :)
источник
Content-Disposition: attachment;
в заголовке ответа), всплывающее окно немедленно закроется, поэтомуsetTimeout
код завершится ошибкой, и браузер будет жаловаться, что «Блокировщик всплывающих окон включен!». Для Chrome я рекомендую решение @ DanielB, и оно отлично работает.Content-Disposition: attachment;
заголовком открывать ее во всплывающем окне не нужно. Просто сделайте прямую ссылку на ресурс, который вы хотите загрузить, и собственное поведение браузера позволит вам загрузить, не перенаправляя вас с текущей страницы.window.location
для этого, если первый файл занимает слишком много времени для создания, он будет проигнорирован при запуске второго запроса. Это причина, по которой я должен использоватьwindow.open
, посколькуwindow.location
никогда не сообщает мне, когда заканчивается ответ.Одно «решение», которое всегда будет работать независимо от компании или версии браузера, - это просто поместить предупреждающее сообщение на экран где-нибудь рядом с элементом управления, который создаст всплывающее окно, вежливо предупреждающее пользователя о том, что для действия требуется всплывающее окно. вверх и включить их для сайта.
Я знаю, что это не фантастика или что-то в этом роде, но это не может быть проще и требует всего 5 минут тестирования, после чего вы можете перейти к другим кошмарам.
После того, как пользователь разрешил всплывающие окна для вашего сайта, также будет внимательным, если вы не переборщите с всплывающими окнами. Меньше всего вам хочется раздражать посетителей.
источник
Я объединил решения @Kevin B и @ DanielB.
Это намного проще.
Использование:
источник
isPopupBlockerActivated
функция никогда не возвращаетсяreturn (popupWindow.innerHeight > 0) === false;
. Функция You возвращает false, если ваш браузер не Chrome. Потому что загрузка - это асинхронный процесс. Ваша функция возвращает false, а затем выполняется onload, но ее результат никогда не возвращается.Я пробовал множество решений, но единственное, что я смог придумать, которое также работало с uBlock Origin, - это использование тайм-аута для проверки закрытого статуса всплывающего окна.
Очевидно, это взлом; вроде все решения этой проблемы.
Вам нужно предоставить достаточно времени в setTimeout для учета начального открытия и закрытия, поэтому он никогда не будет полностью точным. Это будет позиция проб и ошибок.
Добавьте это в свой список попыток.
источник
Простым подходом, если вы также владеете дочерним кодом , было бы создание простой переменной в его html, как показано ниже:
А затем проверьте его наличие у родителя, что-то вроде следующего:
Мы ждем некоторое время, чтобы убедиться, что веб-страница загружена, и проверяем ее существование. Очевидно, что если окно не загрузится после 1500 мсек, то переменная все равно будет
undefined
.источник
Используя событие onbeforeunload, мы можем проверить следующее
он откроет 2 черных окна в фоновом режиме
функция возвращает логическое значение.
источник