2013-08-23 16 views
8

Używam systemu szablonów Smarty. Jedną z jego funkcji jest możliwość generowania skryptu, który generuje informacje debugowania dla każdej strony. Tutaj można zobaczyć przykład kodu wygenerowanego:window.open zwraca wartość null i kończy się niepowodzeniem w skrypcie wbudowanym, ale działa z poziomu konsoli

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

Problem polega na tym, że funkcje window.open zawsze zwraca null. Próbowałem opóźnić to z setTimeout, ale nic się nie zmieniło. Kiedy kopiuję kod i uruchamiam go w konsoli Firebug, działa on poprawnie. Na stronie nie ma innych skryptów. Strona używa ścisłego XHTML. Skrypt jest tuż przed </body>.

+0

To może głupie pytanie, ale rzeczywiście można zobaczyć pop-up? Jeśli nie możesz, wyłącz blokowanie wyskakujących okienek w przeglądarce ... – Teemu

Odpowiedz

7

Jest zablokowany przez przeglądarkę. window.open nie jest blokowany tylko wtedy, gdy jest wywoływany przez akcję użytkownika, na przykład w zdarzeniu kliknięcia, emitowanym przez rodzime zdarzenie przeglądarki. Również zdarzenia emitowane javaScript są blokowane, podobnie jak opóźnione wywołania funkcji 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> 

Zobacz, jak Fiddle. Próbowałem także z wydarzeniem keypress, ale bez powodzenia.

window.open zwraca poprawną referencję do nowego (lub istniejącego podanego) okna lub null, gdy nie udało się utworzyć nowego okna.

+0

Myślałem, że to będzie coś związanego z przeglądarką. Ale ponieważ żaden "Popup nie został zablokowany". pojawiła się wiadomość, byłem zdezorientowany. Czy możesz dać mi poradę, jak zmusić go do działania? Chcę, żeby działało bez zmiany ustawień przeglądarki oczywiście. –

+0

nie ma mowy. tylko za pośrednictwem zdarzenia kliknięcia, tak jak przykład w moim poście (aktualizacja) – metadings

+0

Nawet kluczowe wydarzenie nie zadziałało (CTRL + j). w takich okolicznościach będę musiał dodać wyjątek dla mojej strony. –

-2

Spróbuj następnego polecenia po window.open z limitu czasu, na przykład:

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

Jak to pomóc? Jak to jest związane z pytaniem? Czy możesz to bardziej wyjaśnić? –