2011-01-30 13 views
12

Estoy tratando de recibir una notificación cuando la ventana secundaria que abro tiene su documento cargado y listo. Esto no parece funcionar:jQuery: recibir documento listo() en la ventana secundaria

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

¿Qué tengo que hacer?

+0

gracias McLovin! esto me ayudó a resolver un problema similar – DevDave

Respuesta

8

¿Has probado esto? -

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

This question discute algo muy similar. ¿Duplicar?

+4

Sí, lo he intentado también. Si mi consuelo por mis pruebas es correcto, el problema es que la función ready() se desencadena mientras que el árbol DOM no está realmente listo todavía. – mrmclovin

+1

¿Has probado el JS simple también, eso se menciona en la respuesta a la otra pregunta? ? – polarblau

+5

Sí, funciona con javascript manual, ¡gracias! Tuve que hacer esto: \t win.onload = function() { \t \t form = $ (this.document.getElementById (form_id)); \t \t form.submit (function (evt) { – mrmclovin

1

Use window.opener en script in site, que está cargando y ejecutando la función definida en global (!) En la primera página.

página principal:

<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> 

página abierta:

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

Gracias por la sugerencia. Sin embargo, no puedo (no quiero) editar el ¡El sitio de destino que estoy abriendo! – mrmclovin

5

He tenido un problema similar y para mí el evento .load en la ventana hizo el trabajo, el ready hizo no. Por lo que puede probar:

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

Esto funcionó para mí en Chrome y FF, pero IE no ejecutó la devolución de llamada de carga. Terminé agregando un 'setInterval 'auto-cancelador para verificar si la ventana secundaria estaba lista y ejecutar el código –

+0

Investigué por qué 'listo' no funciona, entonces lo compartiré. ' $ (win.document) .ready' es completamente equivalente a '$ (ventana) .ready'. Ver [la fuente ] (https://github.com/jquery/jquery/blob/3.3.1/src/core/ready.js#L13-L26). (Nota: incluso en el momento de publicación de esta pregunta, eso es 2011, 'ready' funciona de forma similar a v3.3.1) Deberíamos usar 'load' en lugar de' ready' para el propósito, como sugirió Gunni. – anqooqie

0

Basta con añadir este código en iframe,

$(document,parent.document).ready(function(){ 
alert('Done'); 
}); 
Cuestiones relacionadas