web-dev-qa-db-ja.com

window.openがnullを返し、インラインスクリプトで失敗するが、コンソールからは機能する

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>の直前にあります。

ブラウザによってブロックされています。 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を返します。

21
metadings