17

Smarty テンプレート システムを使用しています。その機能の 1 つは、すべてのページのデバッグ情報を生成するスクリプトを出力できることです。生成されたコードの例を次に示します。

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

問題は、window.open関数が常に を返すことnullです。私はそれを遅らせようとしましsetTimeoutたが、何も変わりませんでした。コードをコピーして Firebug コンソールで実行すると、正しく動作します。ページに他のスクリプトはありません。このページは厳密な XHTML を使用しています。スクリプトは の直前</body>です。

4

2 に答える 2

23

ブラウザによってブロックされています。window.openネイティブブラウザイベントによって発行されたクリックイベントなど、ユーザーアクションによって呼び出された場合にのみブロックされません。また、setTimeout コールバックの遅延と同様に、javaScript によって発行されたイベントもブロックされます。

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

フィドルを見る。私もkeypressイベントで試してみましたが、うまくいきませんでした。

window.open新しい (または既存の名前付きの) ウィンドウへの有効な参照を返すかnull、新しいウィンドウの作成に失敗した場合に返します。

于 2013-08-23T11:25:55.717 に答える