Обнаружение события onload окна, открытого с помощью window.open
window.popup = window.open($(this).attr('href'), 'Ad', 'left=20,top=20,width=500,height=500,toolbar=1,resizable=0');
$(window.popup).onload = function()
{
alert("Popup has loaded a page");
};
Это не работает ни в одном браузере, с которым я его пробовал (IE, Firefox, Chrome). Как определить, когда страница загружается в окно (например, iframe onload)?
Ответы
Ответ 1
Если всплывающий документ из другого домена, это просто невозможно.
Обновление апреля 2015 года: я ошибался: если у вас есть оба домена, вы можете использовать window.postMessage
и событие message
в почти все браузеры, которые актуальны сегодня.
Если нет, вы все равно не сможете сделать эту работу кросс-браузером без какой-либо помощи из загружаемого документа во всплывающее окно. Вы должны иметь возможность обнаруживать изменение всплывающего окна, которое происходит после его загрузки, которое может быть переменной, которую JavaScript на всплывающей странице задает, когда обрабатывает свое собственное событие load
, или если у вас есть вы можете добавить вызов функции в открыватель.
Ответ 2
var myPopup = window.open(...);
myPopup.addEventListener('load', myFunction, false);
Если вы беспокоитесь об IE, используйте вместо этого следующую строку:
myPopup[myPopup.addEventListener ? 'addEventListener' : 'attachEvent'](
(myPopup.attachEvent ? 'on' : '') + 'load', myFunction, false
);
Как вы можете видеть, поддержка IE довольно громоздка, и ее следует избегать, если это возможно. Я имею в виду, если вам нужно поддерживать IE из-за вашей аудитории, во что бы то ни стало, сделайте это.
Ответ 3
Как отметил этот ответ fooobar.com/questions/155057/... aka Обнаружение события onload окна, открытого с помощью window.open идеально подходит:
javascript: /* IE will use 1 ignore 1 w/ error, FF t'other way 'round */
(function(ow){
ow . addEventListener( 'load', function(){alert("loaded")}, false);
ow . attachEvent('onload', function(){alert("loaded")}, false);
}(window.open(prompt("Where are you going today?",location.href),"snapDown")))
Однако другие комментарии и ответы совершают несколько ошибочных заблуждений, как описано ниже.
Следующий script демонстрирует темпераментную временную непостоянство определения onload
. Примените script к быстрой загрузке location.href
, например file:///
, и к некоторому медленному сайту, чтобы увидеть проблему. Можно увидеть сообщение onload
или вообще ничего (перезагружая загруженную страницу, можно увидеть все 3 варианта). Также предполагается, что сама загружаемая страница не определяет событие onload
, которое могло бы осложнить проблему.
Определения обработчика событий onload
определенно не являются "внутренней разметкой HTML", хотя в конечном итоге они будут находиться в DOM body
... HTML
.
javascript:
window.popup=window.open(location.href,'snapDown');
window.popup.onload=function(){alert("message one ")};
alert("message 1 maybe too soon\n"+window.popup.onload);
window.popup.onload=function(){alert("message two")};
alert("message 2 maybe too late\n"+window.popup.onload);
что вы можете сделать:
- открыть внешний URL
- для этого внешнего URL-адреса. адресная строка введите
javascript: ...
URI
он наследует политики того же сайта, что и внешний URL-адрес
NB. javascript, возможно, необходимо будет помечать как букмарклет, поскольку адресная строка URI javascript:
не эффективна в последних (около 2012) браузерах
- это эффективно дает доступ к перекрестным доменам, но обратите внимание:
- javascript не является аборигенным для веб-страницы или сайта, то есть его происхождение имеет гражданство без гражданства и, следовательно, внутренне удовлетворяет правилам иммиграции css (x-site scripting) и sop (той же исходной политики).
- он вызывается вручную через адресную строку или закладки И
script вводится вручную в эти местоположения.
Таким образом, любая страница, ну почти, независимо от происхождения, может быть изменена следующим образом:
javascript:
if(confirm("wipe out links & anchors?\n"+document.body.innerHTML))
void(document.body.innerHTML=document.body.innerHTML.replace(/<a /g,"< a "))
(ну почти...
jar:file:///usr/lib/firefox/omni.ja!/chrome/toolkit/content/global/aboutSupport.xhtml
Страница устранения неполадок Mozilla FF и другие архивы jar
являются исключениями)
В качестве еще одного примера:
Чтобы регулярно отключать узурпацию google целевого pg. хитов, измените его rwt
следующим образом:
javascript:void(rwt=function(unusurpURL){return unusurpURL})
и пометить это как spay google
(neuteralize google
?) т.е. он "исправлен".
Затем эта закладка будет нажата до того, как будут нажаты любые щелчки google
, поэтому закладки любого из этих хитов являются чистыми, а не измененными извращенными аберрациями, которые google
сделаны из них.
тесты, выполненные с помощью
window.navigator.userAgent=
Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:11.0) Gecko/20100101 Firefox/11.0
Следует отметить, что addEventListener
в Mozilla имеет нестандартный четвертый логический параметр, который, если true
позволяет создавать триггеры ненадежного контента для иностранных страниц.
исх:
element.addEventListener | Объектная модель документа (DOM) | MDN:
Взаимодействие между привилегированными и непривилегированными страницами | Фрагменты кода | MDN:
Закладка:
Обнаружение события onload окна, открытого с помощью window.open
Ответ 4
Это помогло; полный пример:
HTML:
<a href="/my-popup.php" class="import">Click for my popup on same domain</a>
JavaScript:
(function(){
var doc = document;
jQuery('.import').click(function(e){
e.preventDefault();
window.popup = window.open(jQuery(this).attr('href'), 'importwindow', 'width=500, height=200, top=100, left=200, toolbar=1');
window.popup.onload = function() {
window.popup.onbeforeunload = function(){
doc.location.reload(true); //will refresh page after popup close
}
}
});
})();
Ответ 5
onload
обработчик событий должен быть внутри всплывающего HTML <body>
разметки.
Ответ 6
Основная проблема заключается в том, что вы открываете окно для отображения страницы, содержимое которой уже кэшировано в браузере. Поэтому загрузка не происходит и, следовательно, не происходит загрузка -event.
Одна из возможностей может заключаться в использовании "PageShow" -event вместо этого, как описано в:
https://support.microsoft.com/en-us/help/3011939/onload-event-does-not-occur-when-clicking-the-back-button-to-a-previou
Ответ 7
Прежде всего, когда загружается ваше первое начальное окно, оно кэшируется. Поэтому при создании нового окна из первого окна содержимое нового окна не загружается с сервера, а загружается из кэша. Следовательно, при создании нового окна событие onload
не происходит.
Однако в этом случае происходит событие onpageshow
. Это всегда происходит после события onload
и даже когда страница загружается из кэша. Кроме того, теперь он поддерживается всеми основными браузерами.
window.popup = window.open($(this).attr('href'), 'Ad', 'left=20,top=20,width=500,height=500,toolbar=1,resizable=0');
$(window.popup).onpageshow = function() {
alert("Popup has loaded a page");
};
Веб-сайт w3school более подробно описывает это:
Событие onpageshow аналогично событию onload
, за исключением того, что оно происходит после события onload при первой загрузке страницы. Кроме того, событие onpageshow
происходит каждый раз, когда страница загружается, тогда как событие onload не происходит, когда страница загружается из кэша.