2010-06-13 29 views
27
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"); 
     }; 

Questo non funziona con nessun browser con cui ho provato (IE, Firefox, Chrome). Come posso rilevare quando una pagina viene caricata nella finestra (come un onload iframe)?Rilevamento dell'evento onload di una finestra aperta con window.open

+2

Credo che hai già l'onLoad nel vostro da qualche parte? – VoodooChild

+0

Presumo che non controlli la pagina che apre nel popup –

+0

Cosa stai provando a fare con '$ (...).onload' lì? Cosa c'è che non va con 'window.popup.onload'? –

risposta

15

Se il documento popup proviene da un dominio diverso, questo semplicemente non è possibile.

Aggiornamento aprile 2015: mi sono sbagliato su questo: se si possiede entrambi i domini, you can use window.postMessage and the message event in pretty much all browsers che sono rilevanti oggi.

In caso contrario, non è ancora possibile eseguire questo lavoro cross-browser senza alcun aiuto dal caricamento del documento nel pop-up. Devi essere in grado di rilevare una modifica nel pop-up che si verifica dopo il caricamento, che potrebbe essere una variabile impostata da JavaScript nella pagina popup quando gestisce il proprio evento load o se si ha il controllo di è possibile aggiungere una chiamata a una funzione nel dispositivo di apertura.

+1

Un modo semplice per controllarlo per monitorare la disponibilità di una funzione JS nell'altra pagina in una chiamata setTimeout(). – jvenema

+0

Secondo questo post http://stackoverflow.com/questions/25098021/securityerror-blocked-a-frame-with-origin-from-accessing-a-cross-origin-frame è possibile, ma è necessario possedere entrambi i domini . – James

+1

@James: Grazie. Ho aggiornato la mia risposta. –

45
var myPopup = window.open(...); 
myPopup.addEventListener('load', myFunction, false);

Se vi interessa IE, utilizzare la seguente come seconda riga invece:

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

Come si può vedere, sostenendo IE è abbastanza ingombrante e dovrebbero essere evitate se possibile . Voglio dire, se hai bisogno di supportare IE a causa del tuo pubblico, con tutti i mezzi, fallo.

+1

Comunque posso fare questo dominio incrociato? –

+1

Purtroppo no. Per motivi di sicurezza, i browser disabilitano l'interazione dell'oggetto JavaScript tra domini diversi. –

+2

Questo non funzionerà con tutti i browser. –

1

onload Il gestore di eventi deve trovarsi all'interno del markup HTML <body> del popup.

+0

Questo era l'unico modo ho potuto innescare esso, provato quasi in ogni altro modo possibile - grazie. '$ (popup) .find ('body'). attr ('onload', 'window.print();');' ha funzionato alla fine. – Breeno

5

Come osservato https://stackoverflow.com/a/3030893 aka Detecting the onload event of a window opened with window.open La soluzione di questa risposta è l'ideale:

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

Tuttavia, altri commenti e risposte perpetrare diverse idee sbagliate erronee come spiegato di seguito.

Il seguente script dimostra la volubile inerzia temporale della definizione di onload. Applicare lo script a un caricamento veloce location.href come file:/// e qualche sito lento per vedere il problema. È possibile visualizzare il messaggio onload o nessuno (ricaricando una pagina caricata possono essere visualizzate tutte e 3 le varianti). Si presume inoltre che la pagina caricata non definisca un evento onload che potrebbe aggravare il problema.

definizioni s' The onload gestore di eventi non sono assolutamente "dentro markup HTML di popup" anche se in ultima analisi, risiedono nel DOM della body ... del 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); 

cosa si può fare:

  • aprire un URL estera
  • su quel pg URL estera. barra degli indirizzi immettere javascript: ... URI
    erediterà i criteri dello stesso sito dell'URL estero
    NB.il javascript potrebbe essere necessario segnalibro come un bookmarklet dal barra degli indirizzi in notazione URI javascript: 's non sono efficaci nel recente (circa 2012) i browser
  • questo dà modo efficace l'accesso dominio croce, ma nota:
    1. il javascript non è indigeni di una pagina web o di un sito, il che significa che la sua origine ha una nazionalità senza stato e quindi soddisfa intrinsecamente le regole di immigrazione css (x-site scripting) e sop (stessa politica di origine)
    2. viene invocato manualmente tramite la barra degli indirizzi o segnalibri E
      lo script è manualmente entrato in quei luoghi

così ogni pagina, o quasi, indipendentemente da provenienza, può essere modificato come:

javascript: 
    if(confirm("wipe out links & anchors?\n"+document.body.innerHTML)) 
    void(document.body.innerHTML=document.body.innerHTML.replace(/<a /g,"< a ")) 

(beh quasi ...
jar:file:///usr/lib/firefox/omni.ja!/chrome/toolkit/content/global/aboutSupport.xhtml
La pagina di risoluzione dei problemi FF di Mozilla e altri archivi jar sono eccezioni)

Come altro esempio:
Per disattivare regolarmente l'usurpazione di google del target pg. colpi, cambiano è rwt funzione come segue:

javascript:void(rwt=function(unusurpURL){return unusurpURL}) 

e segnalibro questo come spay google (neuteralize google?) vale a dire. è sistemato".

Questo segnalibro è poi cliccato prima di qualsiasi google colpi sono cliccato, così i segnalibri di uno qualsiasi di questi successi siano puliti e non le aberrazioni imbastarditi perversi che google ne viene fatto.

test fatto con

window.navigator.userAgent= 
Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:11.0) Gecko/20100101 Firefox/11.0 

Va notato che addEventListener in Mozilla ha solo un quarto parametro non standard, booleano che ,, se true permette di contenuti non attendibile trigger per essere istanziati per le pagine straniere.

ref:
element.addEventListener | Document Object Model (DOM) | MDN:
Interaction between privileged and non-privileged pages | Code snippets | MDN:

Bookmark:
Detecting the onload event of a window opened with window.open

+6

In questa risposta ci sono molte frasi che dicono una cosa e poi sono seguite da un'altra frase che corregge la precedente. Questo fa sì che sia difficile da seguire. Ci sono buone informazioni qui, è solo difficile da vedere. Otterrai più voti parlando in modo più chiaro. – MushinNoShin

+0

Inoltre, se a questa domanda viene data una risposta da un'altra domanda, forse vale la pena segnalarla come duplicato di quell'altra domanda e indirizzando il richiedente all'altra domanda in un commento. – MushinNoShin

+0

La risposta di riferimento era il collegamento diretto 'condividi' a una risposta inviata a questa stessa domanda: sarebbe stato meglio ... fare! ... gli upvotes – ekim

2

Questo ha fatto il trucco per me; piena Esempio:

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

dovrebbe essere detto che questo funzionerà solo se i domini sono entrambi uguali –

Problemi correlati