Эта функция преобразует шестнадцатеричную строку в байтовый массив в 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"));
Ну, "волшебное время", о котором вы говорите, вероятно, наступает тогда, когда 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)
});
Надеюсь, это поможет.
Ответ Jason является единственным методом, о котором я могу думать также, но доверие положению как этот немного изворотливо!
В эти дни, Вы не должны действительно задавать вопрос “was мое незапрашиваемое заблокированное всплывающее окно? ”, потому что ответом является неизменно “yes” —  all главные браузеры, включили блокировщик всплывающих окон по умолчанию. Лучший подход только когда-либо к window.open () в ответ на прямой щелчок, который почти всегда позволяется.
Проверьте положение окна относительно родителя. Chrome заставляет окно появиться почти вне экрана.
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();
}
У меня была похожая проблема с всплывающими окнами, не открывающимися в 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 сможет объяснить остальным, почему это имеет значение, я с удовольствием послушаю, хотя я подозреваю, что это просто попытка закрыть дверь для вредоносных программных всплывающих окон.
Насколько я могу судить (из того, что я тестировал), Chrome возвращает объект окна с расположением 'about: blank'. Итак, во всех браузерах должно работать следующее:
var newWin = window.open(url);
if(!newWin || newWin.closed || typeof newWin.closed=='undefined' || newWin.location=='about:blank')
{
//POPUP BLOCKED
}