Обнаружение события загрузки окна, открытого с помощью window.open - PullRequest
33 голосов
/ 13 июня 2010
 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)?

Ответы [ 5 ]

50 голосов
/ 13 июня 2010
var myPopup = window.open(...);
myPopup.addEventListener('load', myFunction, false);

Если вам небезразличен IE, используйте вместо этого следующую строку:

myPopup[myPopup.addEventListener ? 'addEventListener' : 'attachEvent'](
  (myPopup.attachEvent ? 'on' : '') + 'load', myFunction, false
);

Как видите, поддержка IE довольно громоздка и ее следует избегать , если возможно . Я имею в виду, если вам нужно поддерживать IE из-за вашей аудитории, во что бы то ни стало, сделайте это.

19 голосов
/ 13 июня 2010

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

Обновление, апрель 2015 года: я ошибся: если вы владеете обоими доменами, выможно использовать window.postMessage и message событие в почти во всех браузерах , которые актуальны сегодня .

Если нет, то вы все равно не сможетевозможность сделать эту работу кросс-браузерной без помощи документа, загружаемого во всплывающее окно.Вы должны быть в состоянии обнаружить изменение во всплывающем окне, которое происходит после его загрузки, которое может быть переменной, которую устанавливает JavaScript на всплывающей странице, когда он обрабатывает свое собственное событие load, или если у вас есть некоторыеконтроль над ним вы можете добавить вызов функции в открывателе.

6 голосов
/ 30 сентября 2012

Как отмечалось в этом ответе https://stackoverflow.com/a/3030893 он же Обнаружение события загрузки окна, открытого с помощью 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")))

Однако, другие комментарии иответы приводят к нескольким ошибочным заблуждениям, как объяснено ниже.

Следующий скрипт демонстрирует темпераментную переменчивость во времени определения onload.Примените скрипт к быстрой загрузке 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 pg.В адресной строке введите javascript: ... URI
    , он будет наследовать те же политики сайта, что и внешний URL-адрес
    NB.Javascript, возможно, нужно добавить в закладки как букмарклет, поскольку адресные строки URI javascript: не работают в последних (около 2012 года) браузерах
  • , что фактически дает междоменный доступ, но обратите внимание:
    1. javascript не свойственен веб-странице или сайту, что означает, что его происхождение имеет гражданство без гражданства и, таким образом, по существу удовлетворяет иммиграционным правилам css (сценарии x-site) и sop (та же политика происхождения)
    2. он вызывается вручную через адресную строку или закладки И
      сценарий вручную введен в эти местоположения

Таким образом, можно изменить любую страницу, почти независимо от ее происхождения, например:

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
Страница устранения неполадок FF в Mozilla и другие 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 позволяет создавать триггеры ненадежного содержимогодля иностранных страниц.

ref:
element.addEventListener |Объектная модель документа (DOM) |MDN:
Взаимодействие между привилегированными и непривилегированными страницами |Фрагменты кода |MDN:

Закладка:
Обнаружение события загрузки окна, открытого с помощью window.open

3 голосов
/ 23 сентября 2014

Это помогло мне;полный пример:

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
            }
        }
    });
})();
1 голос
/ 13 июня 2010

onload обработчик события должен быть внутри HTML <body> разметки всплывающего окна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...