Обнаружьте заблокированное всплывающее окно в Chrome

Эта функция преобразует шестнадцатеричную строку в байтовый массив в Node.js:

function hexStringToByteArray(hexStr) {
    let a = [];
    for(let c = 0; c < hexStr.length; c += 2) {
        a.push(parseInt(hexStr.substr(c, 2), 16));
    }
    return a;
}

console.log("Result: ", hexStringToByteArray("8001000501335688003300020002000200"));

100
задан Community 23 May 2017 в 12:32
поделиться

6 ответов

Ну, "волшебное время", о котором вы говорите, вероятно, наступает тогда, когда DOM всплывающего окна загружен. Или это может быть, когда все (изображения, внешний CSS и т. Д.) Было загружено. Вы можете легко проверить это, добавив во всплывающее окно очень большую графику (сначала очистите кеш!). Если вы использовали Javascript Framework, например jQuery (или что-то подобное), вы могли бы использовать событие ready () (или что-то подобное), чтобы дождаться загрузки DOM перед проверкой смещения окна. Опасность в том, что обнаружение Safari работает противоречивым образом: DOM всплывающего окна никогда не будет готов () в Safari, потому что он даст вам действительный дескриптор для окна, которое вы пытаетесь открыть - независимо от того, открывается ли оно на самом деле или не. (на самом деле, я считаю, что приведенный выше тестовый код всплывающего окна не будет работать для safari. )

Я думаю, что лучшее, что вы можете сделать, - это обернуть тест в setTimeout () и дать всплывающему окну 3-5 секунд для полной загрузки перед запуском теста. Он не идеален, но он должен работать как минимум в 95% случаев.

Вот код, который я использую для кросс-браузерного обнаружения, без компонента Chrome.

function _hasPopupBlocker(poppedWindow) {
    var result = false;

    try {
        if (typeof poppedWindow == 'undefined') {
            // Safari with popup blocker... leaves the popup window handle undefined
            result = true;
        }
        else if (poppedWindow && poppedWindow.closed) {
            // This happens if the user opens and closes the client window...
            // Confusing because the handle is still available, but it's in a "closed" state.
            // We're not saying that the window is not being blocked, we're just saying
            // that the window has been closed before the test could be run.
            result = false;
        }
        else if (poppedWindow && poppedWindow.test) {
            // This is the actual test. The client window should be fine.
            result = false;
        }
        else {
            // Else we'll assume the window is not OK
            result = true;
        }

    } catch (err) {
        //if (console) {
        //    console.warn("Could not access popup window", err);
        //}
    }

    return result;
}

Я запускаю этот тест из родительского элемента и завершаю это в setTimeout (), давая дочернему окну 3-5 секунд для загрузки. В дочернем окне вам необходимо добавить тестовую функцию:

function test () {}

Детектор блокировщика всплывающих окон проверяет, существует ли «тестовая» функция как член дочернего окна.

ДОБАВЛЕНО 15 ИЮНЯ 2015:

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

$(window).load(function() {
  this.opener.postMessage({'loaded': true}, "*");
  this.close();
});

Родитель прослушивает это сообщение, используя:

$(window).on('message', function(event) {     
  alert(event.originalEvent.data.loaded)
}); 

Надеюсь, это поможет.

63
ответ дан 24 November 2019 в 04:54
поделиться

Ответ Jason является единственным методом, о котором я могу думать также, но доверие положению как этот немного изворотливо!

В эти дни, Вы не должны действительно задавать вопрос “was мое незапрашиваемое заблокированное всплывающее окно? ”, потому что ответом является неизменно “yes” —  all главные браузеры, включили блокировщик всплывающих окон по умолчанию. Лучший подход только когда-либо к window.open () в ответ на прямой щелчок, который почти всегда позволяется.

1
ответ дан bobince 24 November 2019 в 04:54
поделиться

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

2
ответ дан Jason Cohen 24 November 2019 в 04:54
поделиться

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>

Всплывающее окно теста выглядит так:

<!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, чтобы узнать, отображаются ли всплывающие окна в других сценариях JavaScript. т.е.

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
ответ дан 24 November 2019 в 04:54
поделиться

У меня была похожая проблема с всплывающими окнами, не открывающимися в 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
ответ дан 24 November 2019 в 04:54
поделиться

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

var newWin = window.open(url);
if(!newWin || newWin.closed || typeof newWin.closed=='undefined' || newWin.location=='about:blank')
{
    //POPUP BLOCKED
}
0
ответ дан 24 November 2019 в 04:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: