Мне известны методы javascript, позволяющие определить, заблокировано ли всплывающее окно в других браузерах (как описано в ответе на этот вопрос ). Вот основной тест:
var newWin = window.open(url);
if(!newWin || newWin.closed || typeof newWin.closed=='undefined')
{
//POPUP BLOCKED
}
Но в Chrome это не работает. Раздел «POPUP BLOCKED» никогда не достигается, когда всплывающее окно заблокировано.
Конечно, тест в определенной степени работает, поскольку Chrome фактически не блокирует всплывающее окно, а открывает его в крошечном свернутом окне в правом нижнем углу, в котором перечислены «заблокированные» всплывающие окна.
Я бы хотел узнать, заблокировано ли всплывающее окно блокировщиком всплывающих окон Chrome. Я стараюсь избегать обнюхивания браузера в пользу обнаружения функций. Есть ли способ сделать это без обнюхивания браузера?
Изменить : теперь я попытался использовать newWin.outerHeight
,newWin.left
и других аналогичных свойств для достижения этой цели . Google Chrome возвращает все значения положения и высоты как 0, когда всплывающее окно заблокировано.
К сожалению, он также возвращает те же значения, даже если всплывающее окно действительно открыто в течение неизвестного периода времени. После некоторого волшебного периода (пара секунд в моем тестировании) информация о местоположении и размере возвращается в виде правильных значений. Другими словами, я еще не приблизился к тому, чтобы это понять. Любая помощь будет оценена.
источник
Ответы:
Что ж, «волшебное время», о котором вы говорите, вероятно, наступает, когда DOM всплывающего окна загружен. Или это может быть, когда все (изображения, внешний CSS и т. Д.) Было загружено. Вы можете легко проверить это, добавив во всплывающее окно очень большую графику (сначала очистите кеш!). Если вы использовали Javascript Framework, например jQuery (или что-то подобное), вы могли бы использовать событие ready () (или что-то подобное), чтобы дождаться загрузки DOM перед проверкой смещения окна. Опасность в том, что обнаружение Safari работает противоречивым образом: DOM всплывающего окна никогда не будет готов () в Safari, потому что он даст вам действительный дескриптор для окна, которое вы пытаетесь открыть - независимо от того, открывается ли оно на самом деле или не. (на самом деле, я считаю, что приведенный выше тестовый код всплывающего окна не будет работать для сафари.)
Я думаю, что лучшее, что вы можете сделать, это обернуть тест в setTimeout () и дать всплывающему окну 3-5 секунд для полной загрузки перед запуском теста. Это не идеально, но должно работать как минимум в 95% случаев.
Вот код, который я использую для кросс-браузерного обнаружения, без части Chrome.
Что я делаю, так это запускаю этот тест от родителя и оборачиваю его в setTimeout (), давая дочернему окну 3-5 секунд для загрузки. В дочернем окне нужно добавить тестовую функцию:
function test () {}
Детектор блокировки всплывающих окон проверяет, существует ли функция «test» как член дочернего окна.
ДОБАВЛЕНО 15 ИЮНЯ 2015:
Я думаю, что современный способ справиться с этим - использовать window.postMessage (), чтобы дочерний элемент уведомлял родителя о том, что окно загружено. Подход аналогичен (ребенок сообщает родителям, что он загружен), но средства связи улучшились. Мне удалось сделать этот кросс-домен от ребенка:
Родитель прослушивает это сообщение, используя:
Надеюсь это поможет.
источник
Всего одно улучшение снайпета InvisibleBacon (протестировано в IE9, Safari 5, Chrome 9 и FF 3.6):
источник
Ниже приведено решение jQuery для проверки блокировщика всплывающих окон. Он был протестирован в FF (v11), Safari (v6), Chrome (v23.0.127.95) и IE (v7 и v9). Обновите функцию _displayError для обработки сообщения об ошибке по своему усмотрению.
Использование:
Надеюсь это поможет! :)
источник
Ответ Рича больше не будет работать для Chrome. Похоже, сейчас Chrome действительно выполняет любой Javascript во всплывающем окне. В итоге я проверил значение screenX, равное 0, чтобы проверить наличие заблокированных всплывающих окон. Я также думаю, что нашел способ гарантировать, что это свойство является окончательным перед проверкой. Это работает только для всплывающих окон в вашем домене, но вы можете добавить обработчик загрузки следующим образом:
Как сообщалось многими, свойство screenX иногда сообщает ненулевое значение для неудачных всплывающих окон, даже после загрузки. Я тоже испытал это поведение, но если вы добавите проверку после тайм-аута в 0 мс, свойство screenX всегда будет выводить согласованное значение.
Сообщите мне, есть ли способы сделать этот сценарий более надежным. Хотя, похоже, работает для моих целей.
источник
onload
никогда не срабатывает.Это сработало для меня:
ВнешниеHeight и outerWidth предназначены для chrome, потому что трюк about: blank, приведенный выше, больше не работает в chrome.
источник
Я собираюсь просто скопировать / вставить ответ, предоставленный здесь: https://stackoverflow.com/a/27725432/892099 от DanielB. работает на chrome 40 и очень чисто. никаких грязных хаков или ожидания.
источник
Как насчет
Promise
подхода?И вы можете использовать его как классический
window.open
Вы можете изменить код так, чтобы он не выполнял обещание вместо возврата
undefined
, я просто подумал, чтоif
это более простой поток управления, чемtry / catch
в этом случае.источник
Проверьте положение окна относительно родителя. Chrome делает окно почти за пределами экрана.
источник
У меня была аналогичная проблема с всплывающими окнами, которые не открывались в Chrome. Я был расстроен, потому что я не пытался сделать что-то скрытное, например всплывающее окно загрузки, просто открывая окно, когда пользователь щелкает. Я был ДВОЙНО разочарован, потому что выполнение моей функции, включающей window.open () из командной строки firebug, работало, в то время как на самом деле нажатие на мою ссылку - нет! Вот мое решение:
Неправильный способ: запуск window.open () из прослушивателя событий (в моем случае dojo.connect с методом события onclick узла DOM).
Правильный путь: присвоение функции свойству onclick узла, который вызвал window.open ().
И, конечно же, я все еще могу создавать прослушиватели событий для того же события onclick, если мне нужно. С этим изменением я мог открывать окна, даже если для Chrome было установлено значение «Не разрешать сайтам показывать всплывающие окна». Радость.
Если кто-нибудь, разбирающийся в Chrome, может рассказать остальным, почему это имеет значение, я бы хотел это услышать, хотя я подозреваю, что это просто попытка закрыть дверь для вредоносных программных всплывающих окон.
источник
Вот версия, которая сейчас работает в Chrome. Просто небольшое изменение от решения Рича, хотя я добавил обертку, которая также обрабатывает время.
Чтобы использовать это, просто сделайте следующее:
Если всплывающее окно заблокировано, предупреждающее сообщение будет отображаться после 5-секундного льготного периода (вы можете настроить это, но 5 секунд должны быть вполне безопасными).
источник
Этот фрагмент включает в себя все вышеперечисленное. По какой-то причине StackOverflow исключает первую и последнюю строки кода в блоке кода ниже, поэтому я написал об этом блог. Полное объяснение и остальной (загружаемый) код можно найти в моем блоге на thecodeabode.blogspot.com.
источник
Ничего себе, здесь есть много решений. Это мой, он использует решения, взятые из текущего принятого ответа (который не работает в последней версии Chrome и требует обертывания его в тайм-аут), а также связанное решение в этом потоке (которое на самом деле является ванильным JS, а не jQuery) .
Mine использует архитектуру обратного вызова, которая будет отправлена,
true
когда всплывающее окно заблокировано, и вfalse
противном случае.источник
Ответ Джейсона - единственный метод, о котором я тоже могу думать, но полагаться на такую позицию немного хитро!
В наши дни вам действительно не нужно задавать вопрос «Было ли заблокировано мое незапрашиваемое всплывающее окно?», Потому что ответ неизменно «да» - во всех основных браузерах блокировка всплывающих окон включена по умолчанию. Лучше всего использовать window.open () только в ответ на прямой щелчок, что почти всегда разрешено.
источник
ЗДРАВСТВУЙ
Я немного изменил описанные выше решения и думаю, что он работает как минимум для Chrome. Мое решение предназначено для определения того, блокируется ли всплывающее окно при открытии главной страницы, а не при открытии всплывающего окна, но я уверен, что есть люди, которые могут его изменить. :-) Недостатком здесь является то, что всплывающее окно отображается на пару секунд (возможно, можно немного сократить), когда нет блокировщика всплывающих окон.
Я поместил это в раздел своего «главного» окна
Всплывающий тест выглядит так:
Когда я вызываю тестовую функцию на всплывающей странице через 3500 мс, Chrome правильно установил внутреннюю высоту.
Я использую переменную popUpsBlocked, чтобы узнать, отображаются ли всплывающие окна в других javascripts. т.е.
источник
источник
Насколько я могу судить (из того, что я тестировал), Chrome возвращает объект окна с местоположением about: blank. Итак, для всех браузеров должно работать следующее:
источник