window.open returns null and fails in inline script but works from console

我只是一个虾纸丫 提交于 2019-12-17 20:44:56

问题


I'm using Smarty template system. One of its features is posibility to output script that generates debug information for every page. Here you can see an example of generated code:

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

The problem is, that the window.open functions always returns null. I tried to delay it with setTimeout but nothing changed. When I copy the code and run it in Firebug console, it works properly. There are no other scripts on page. The page uses strict XHTML. The script is right before </body>.


回答1:


It is blocked by the browser. window.open is only not being blocked, when it is invoked by user action, for example in a click event, emitted by a native browser event. Also javaScript emitted events are being blocked, just like delayed setTimeout callbacks.

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

Watch the Fiddle. I also tried it with the keypress event, but no luck.

window.open returns a valid reference to the new (or an existing named) window, or null when it failed to create a new window.




回答2:


Try the next command after window.open with timeout, for example:

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


来源:https://stackoverflow.com/questions/18401331/window-open-returns-null-and-fails-in-inline-script-but-works-from-console

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!