jQuery: получить готовый документ () в дочернем окне

Я пытаюсь получить уведомление, когда в дочернем окне, которое я открываю, документ загружен и готов. Это не работает:

win = window.open(href, 'test', 'width=300, height=400');
win.focus();
$(win.document).ready(function() {
           // Ok, the function will reach here but if I try to manipulate the
           // DOM it doesn't work unless I use breakpoints
           $(this).contents().find("...").doStuff(); // nothing happens
    });

Что мне нужно сделать?


person mrmclovin    schedule 30.01.2011    source источник
comment
спасибо Макловин! это помогло мне решить аналогичную проблему   -  person DevDave    schedule 29.01.2013


Ответы (4)


Вы пробовали это? —

$(win.document).ready(function() {
    $(win.document).contents().find("...").doStuff();
});

В этом вопросе обсуждается что-то очень похожее. Дублировать?

person polarblau    schedule 30.01.2011
comment
Да я тоже так пробовал. Если мой вывод из моих тестов верен, проблема в том, что функция ready() запускается, когда дерево DOM еще не готово. - person mrmclovin; 30.01.2011
comment
Пробовали ли вы и простой JS, упомянутый в ответе на другой вопрос? - person polarblau; 30.01.2011
comment
Да, это работает с ручным javascript, спасибо! Пришлось сделать так: win.onload = function() { form = $(this.document.getElementById(form_id)); form.submit (функция (evt) { - person mrmclovin; 30.01.2011
comment
это не работает, требуется win.onload = function() {} - person iamkrillin; 18.02.2015

У меня была похожая проблема, и для меня событие .load в окне сработало, а .ready - нет. Итак, вы можете попробовать:

win = window.open(href, 'test', 'width=300, height=400');
$(win).load(function() {
    $(this).contents().find("...").doStuff(); 
});
person Gunni    schedule 19.02.2013
comment
Это сработало для меня в Chrome и FF, но IE не запускал обратный вызов загрузки. В итоге я добавил самоотменяющийся setInterval, чтобы проверить, готово ли дочернее окно, и запустить код. - person Andrew; 19.11.2016
comment
Я исследовал, почему ready не работает, поэтому поделюсь. $(win.document).ready полностью эквивалентно $(window).ready. См. источник. (Примечание: даже во время публикации этого вопроса, то есть в 2011 году, ready работает аналогично версии 3.3.1) Мы должны использовать load вместо ready для этой цели, как предложил Гунни. - person anqooqie; 08.02.2018

Используйте window.opener в скрипте на сайте, который вы загружаете, и выполняйте функцию, определенную в глобальном (!) на первой странице.

Главная страница:

<html>
<head>
<script type="text/javascript">
    window.notify = function () {
        alert('runned from opened window');
    };
    window.onload = function() {
        document.getElementById('button').addEventListener('click', function() {
            window.open('test.html');
        }, false);
    };
</script>
</head>
<body>
<button id="button">Open window</button>
</body>

Opened page:

<html>
<head>
<script type="text/javascript">
    window.onload = function() {
        window.opener.notify()
    };
</script>
</head>
<body>
    Popup site
</body>
</html>
person Radek Benkel    schedule 30.01.2011
comment
Спасибо за предложение. Однако я не могу (не хочу) редактировать целевой сайт, который я открываю! - person mrmclovin; 30.01.2011

Просто добавьте этот код в iframe,

$(document,parent.document).ready(function(){
alert('Done');
});  
person vkGunasekaran    schedule 14.12.2016