Обнаружить заблокированное всплывающее окно в Chrome - PullRequest
100 голосов
/ 21 марта 2009

Мне известны методы 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, когда всплывающее окно заблокировано.

К сожалению, он также возвращает те же значения, даже если всплывающее окно действительно открывается в течение неизвестного периода времени. После некоторого магического периода (несколько секунд в моем тестировании) информация о местоположении и размере возвращается как правильные значения. Другими словами, я все еще не приблизился к выяснению этого. Любая помощь будет оценена.

Ответы [ 16 ]

2 голосов
/ 07 июля 2010

У меня была похожая проблема, когда всплывающие окна не открывались в Chrome. Я был разочарован, потому что я не пытался сделать что-то подлое, например всплывающее окно при загрузке, просто открыв окно, когда пользователь нажал. Я был ДВОЙНО расстроен, потому что запуск моей функции, включающей window.open () из командной строки firebug, сработал, в то время как нажатие на мою ссылку не сработало! Вот мое решение:

Неправильный способ: запуск window.open () из прослушивателя событий (в моем случае dojo.connect для метода события onclick узла DOM).

dojo.connect(myNode, "onclick", function() {
    window.open();
}

Правильный путь: назначение функции свойству onclick узла, который вызвал window.open ().

myNode.onclick = function() {
    window.open();
}

И, конечно, я все еще могу делать прослушиватели событий для того же события onclick, если мне нужно. С этим изменением я мог открыть свои окна, даже если в Chrome было установлено «Не разрешать показывать всплывающие окна на каком-либо сайте». Джой.

Если кто-то из мудрых в том, что касается Chrome, сможет рассказать остальным, почему он имеет значение, я бы хотел услышать об этом, хотя я подозреваю, что это всего лишь попытка закрыть дверь для вредоносных программных всплывающих окон.

2 голосов
/ 21 марта 2009

Проверьте положение окна относительно родителя. Chrome заставляет окно появляться почти за кадром.

1 голос
/ 13 апреля 2011
function openPopUpWindow(format)
{   
    var win = window.open('popupShow.html',
                          'ReportViewer',
                          'width=920px,height=720px,left=50px,top=20px,location=no,directories=no,status=no,menubar=no,toolbar=no,resizable=1,maximize:yes,scrollbars=0');

    if (win == null || typeof(win) == "undefined" || (win == null && win.outerWidth == 0) || (win != null && win.outerHeight == 0) || win.test == "undefined") 
    {
        alert("The popup was blocked. You must allow popups to use this site.");  
    }
    else if (win)
    {
        win.onload = function()
        {          
            if (win.screenX === 0) {
                alert("The popup was blocked. You must allow popups to use this site.");
                win.close();
            } 
        };
    }
}
1 голос
/ 18 мая 2010

HI

Я немного изменил решения, описанные выше, и думаю, что он работает как минимум для Chrome. Мое решение состоит в том, чтобы определить, заблокировано ли всплывающее окно при открытии главной страницы, а не при открытии всплывающего окна, но я уверен, что есть люди, которые могут его изменить. :-) Недостатком здесь является то, что всплывающее окно отображается в течение пары секунд (возможно, можно немного сократить), когда нет блокировщика всплывающих окон.

Я положил это в разделе моего главного окна

<script type="text/JavaScript" language="JavaScript">

 var mine = window.open('popuptest.htm','popuptest','width=1px,height=1px,left=0,top=0,scrollbars=no');
 if(!mine|| mine.closed || typeof mine.closed=='undefined')
  {
    popUpsBlocked = true       
    alert('Popup blocker detected ');
    if(mine)
      mine.close();
 }
 else
 {
    popUpsBlocked = false    
    var cookieCheckTimer = null;
    cookieCheckTimer =  setTimeout('testPopup();', 3500);
 }


function testPopup()
{
  if(mine)
  {
    if(mine.test())
    {
       popUpsBlocked = false;
    }
    else
    {
        alert('Popup blocker detected ');
         popUpsBlocked = true;
     }
    mine.close();
}

} 
</script>

Popuptest выглядит так:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>Popup test</title>
<script type="text/javascript" language="Javascript">
   function test() {if(window.innerHeight!=0){return true;} else return false;}
</script>
</head>

<body>
</body>
</html>

Когда я вызываю тестовую функцию на всплывающей странице через 3500 мс, внутренняя высота была правильно установлена ​​Chrome.

Я использую переменную popUpsBlocked, чтобы узнать, отображаются ли всплывающие окна в других javascripts. то есть

function ShowConfirmationMessage()
{
if(popUpsBlocked)
 { 
  alert('Popups are blocked, can not display confirmation popup. A mail will be sent with the confirmation.');
 } 
 else
 { 
  displayConfirmationPopup();
 }
 mailConfirmation();
}
1 голос
/ 21 марта 2009

Ответ Джейсона - единственный метод, о котором я тоже могу подумать, но полагаться на подобную позицию немного глупо!

В наши дни вам не нужно задавать вопрос «было ли заблокировано мое незапрошенное всплывающее окно?», Потому что ответ неизменно «да» - во всех основных браузерах по умолчанию включена блокировка всплывающих окон. Наилучший подход - это использовать только window.open () в ответ на прямой щелчок, что почти всегда разрешено.

0 голосов
/ 02 августа 2010

Насколько я могу судить (из того, что я тестировал), Chrome возвращает объект окна с расположением about: blank. Итак, для всех браузеров должно работать следующее:

var newWin = window.open(url);
if(!newWin || newWin.closed || typeof newWin.closed=='undefined' || newWin.location=='about:blank')
{
    //POPUP BLOCKED
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...