2013-08-23 9 views
8

Uso il sistema di modelli Smarty. Una delle sue caratteristiche è la possibilità di generare uno script che generi informazioni di debug per ogni pagina. Qui potete vedere un esempio di codice generato:window.open restituisce null e fallisce nello script inline ma funziona dalla console

<script type="text/javascript"> 
//<![CDATA[ 

setTimeout(function() { //Attempt to fix the issue with timeout 
    var _smarty_console = window.open("about:blank","md5hash","width=680,height=600,resizable,scrollbars=yes"); 
    console.log(_smarty_console); //Trying to log it 
    if(_smarty_console!=null) { 
     _smarty_console.document.write("<!DOCTY... lots of HTML ...<\/html>\n"); 
     _smarty_console.document.close(); 
    } 
}, 5000); 
//]]> 
</script> 

Il problema è, che le funzioni window.open restituisce sempre null. Ho provato a ritardarlo con setTimeout ma non è cambiato nulla. Quando copio il codice ed eseguo la console Firebug, funziona correttamente. Non ci sono altri script sulla pagina. La pagina utilizza XHTML rigoroso. Lo script è giusto prima dello </body>.

+0

Questa è forse una domanda stupida, ma si può effettivamente vedere il pop-up? Se non è possibile, disattiva il blocco popup nel browser ... – Teemu

risposta

7

Viene bloccato dal browser. window.open non viene bloccato solo quando viene richiamato dall'azione dell'utente, ad esempio in un evento click, emesso da un evento browser nativo. Anche gli eventi emessi da javaScript vengono bloccati, proprio come i callback ritardati di setTimeout.

<a id="link" href="http://stackoverflow.com">StackOverflow</a> 

<script type="text/javascript"> 

// Example (with jQuery for simplicity) 

$("a#link").click(function (e) { 
    e.preventDefault(); 

    var url = this.href; 

    // this will not be blocked 
    var w0 = window.open(url); 
    console.log("w0: " + !!w0); // w0: true 

    window.setTimeout(function() { 
    // this will be blocked 
    var w1 = window.open(url); 
    console.log("w1: " + !!w1); // w1: false 
    }, 5000); 
}); 

</script> 

Guarda il Fiddle. L'ho provato anche con l'evento keypress, ma senza fortuna.

window.open restituisce un riferimento valido alla nuova (o una finestra denominata esistente) o null quando non è riuscito a creare una nuova finestra.

+0

Ho pensato che sarebbe stato collegato al browser. Ma dal momento che nessun "Popup è stato bloccato". messaggio apparso, ero confuso. Potresti darmi un consiglio su come farlo funzionare? Voglio che funzioni senza modificare le impostazioni del browser, naturalmente. –

+0

in nessun modo. solo tramite un evento click, proprio come nell'esempio nel mio post (aggiornamento) – metadings

+0

Neanche un evento chiave ha funzionato (CTRL + j). in tali circostanze, dovrò aggiungere un'eccezione per la mia pagina. –

-2

provare il comando successivo dopo window.open con timeout, ad esempio:

var myWindow = window.open('foo','_blank','menubar=no, scrollbars=yes, top=10, width=800,height=600'); 

setTimeout(myWindow.onload=function(){this.document.body.innerHTML+='bar';}, 2000); 
+1

Come dovrebbe essere d'aiuto? In che modo è correlato alla domanda? Puoi spiegare di più? –

Problemi correlati