2011-01-30 4 views
12

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

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 
    }); 

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

+0

благодаря McLovin! это помогло мне решить аналогичную проблему. – DevDave

ответ

8

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

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

This question обсуждает что-то очень похожее. Дублирование?

+4

Да, я тоже это пробовал. Если мое заключение из моих тестов правильное, проблема в том, что функция ready() запускается, пока дерево DOM еще не готово. – mrmclovin

+1

Вы тоже попробовали простой JS, о котором говорится в ответе на другой вопрос ? – polarblau

+5

Да, он работает с ручным javascript, спасибо! Пришлось сделать так: \t win.onload = function() { \t \t form = $ (this.document.getElementById (form_id)); \t \t form.submit (функция (evt) { – mrmclovin

1

Используйте 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> 

Открыта страница:

<html> 
<head> 
<script type="text/javascript"> 
    window.onload = function() { 
     window.opener.notify() 
    }; 
</script> 
</head> 
<body> 
    Popup site 
</body> 
</html> 
+0

Благодарим за предложение. Однако я не могу (не хочу) редактировать целевой сайт, который я открываю! – mrmclovin

5

У меня была аналогичная проблема, и для меня событие .load на окне сделал работу, то .ready сделал не. Таким образом, вы можете попробовать:

win = window.open(href, 'test', 'width=300, height=400'); 
$(win).load(function() { 
    $(this).contents().find("...").doStuff(); 
}); 
+0

Это работало для меня в Chrome и FF, но IE не запускал обратный вызов загрузки. В итоге я добавил самозавершающий 'setInterval', чтобы проверить, было ли дочернее окно готово и запускать код –

+0

Я исследовал, почему 'ready' не работает, поэтому я поделюсь им. ' $ (win.document) .ready' полностью эквивалентен '$ (window) .ready'. См. [источник ] (https://github.com/jquery/jquery/blob/3.3.1/src/core/ready.js#L13-L26). (Примечание: даже во время публикации этого вопроса, то есть 2011 г., 'ready' работает аналогично v3.3.1) Для этой цели мы должны использовать 'load' вместо' ready', как предположил Ганни. – anqooqie

0

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

$(document,parent.document).ready(function(){ 
alert('Done'); 
}); 
Смежные вопросы