Подтвердить что ты не робот

Обнаружение события 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)?

4b9b3361

Ответ 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 не происходит, когда страница загружается из кэша.