在window.open打开的窗口中使用document.write编写的脚本元素不会在Windows 7的IE8中执行

时间:2010-06-24 21:58:16

标签: javascript internet-explorer windows-7

我遇到了一个似乎只出现在Windows 7上的问题。它似乎在不同版本的Windows上的IE8中运行良好。基本上,我正在用window.open()创建一个新窗口,然后使用document.write()来编写包含脚本包含的新窗口的内容。在IE中,这些脚本没有正确执行。大多数时候他们根本没有执行,但偶尔会有其中一个人执行。这只是一个清除缓存 - 一旦javascript文件在缓存中,它就可以正常工作。

简化测试用例:

的test.html:

<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN' 'http://www.w3.org/TR/html4/loose.dtd'>
<html>
<head>
   <script type="text/javascript">
      var w = window.open();
      var windowHTML = "\
<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN' 'http://www.w3.org/TR/html4/loose.dtd'>\n\
<html>\n\
<head>\n\
   <script type='text/javascript' src='test.js'></scr"+"ipt>\n\
   <script type='text/javascript' src='test2.js'></scr"+"ipt>\n\
</head>\n\
<body>\n\
</body>\n\
</html>";
      w.document.write(windowHTML);
      w.document.close();
   </script>
</head>
<body>
</body>
</html>

test.js:

alert("test");

test2.js:

alert("test2");

当我去test.html时,我希望看到一个新窗口弹出警告“test”然后“test2”。我在大多数浏览器中都这样做,包括IE6。但是,当我在Windows 7上的IE8中尝试此操作时,它会打开空白页面,但不会出现警报(或偶尔会出现警报)。

这是某种时间问题吗?有没有人见过这个?有什么方法可以解决它吗?


修改 这是Rob Cooney想要看到的我试过的代码。同样,它适用于其他浏览器,但不适用于Windows 7上的IE8。

TEST.HTM:

<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN' 'http://www.w3.org/TR/html4/loose.dtd'>
<html>
<head>
   <script type="text/javascript">
      var w = window.open();
      var windowHTML =
         "<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN' 'http://www.w3.org/TR/html4/loose.dtd'>\n" +
         "<html>\n" +
         "<head>\n" +
         "   <script type='text/javascript' src='test.js'></scr"+"ipt>\n" +
         "   <script type='text/javascript' src='test2.js'></scr"+"ipt>\n" +
         "</head>\n" +
         "<body onload='test();test2()'>\n" +
         "</body>\n" +
         "</html>";
      w.document.write(windowHTML);
      setTimeout(function() {
         w.document.close();
      }, 10000);
   </script>
</head>
<body>
</body>
</html>

test.js:

function test() {
   alert("test");
}

test2.js:

function test2() {
   alert("test2");
}

另外,我在MSDN论坛here上发布了这个问题。


接受no的解决方法作为最佳答案。这是我修改过的代码:

<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN' 'http://www.w3.org/TR/html4/loose.dtd'>
<html>
<head>
   <script type="text/javascript">
      var w = window.open();
      var windowHTML =
         "<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN' 'http://www.w3.org/TR/html4/loose.dtd'>\n" +
         "<html>\n" +
         "<head></head>\n" +
         "<body></body>\n" +
         "</html>";
      w.document.write(windowHTML);
      w.document.close();

      var s = w.document.createElement("script");
      s.type = "text/javascript";
      s.src = "test.js";
      w.document.getElementsByTagName("HEAD")[0].appendChild(s);

      var s2 = w.document.createElement("script");
      s2.type = "text/javascript";
      s2.src = "test2.js";
      w.document.getElementsByTagName("HEAD")[0].appendChild(s2);
   </script>
</head>
<body>
</body>
</html>

注意:使用此解决方案需要注意的是,javascript文件现在是异步加载的,因此如果文件之间存在依赖关系,则无法确定它们是否会加载按正确的顺序。我使用setTimeout解决了这个问题,并在加载第二个文件之前测试第一个文件中是否存在变量。

3 个答案:

答案 0 :(得分:6)

尝试这样的事情(未经测试):

var s=document.createElement('script');
s.type = "text/javascript";
s.src = "test.js";
document.body.appendChild(s);

答案 1 :(得分:1)

您可能需要考虑在导入的js文件中的函数定义中包装警报调用,然后将onLoad添加到调用函数的windowHTML的body标记

编辑:

<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN' 'http://www.w3.org/TR/html4/loose.dtd'>
<html>
<head>
   <script type="text/javascript">
      var w = window.open();
      w.document.writeln("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">");
      w.document.writeln("<html>");
        w.document.writeln("<head>");
        w.document.writeln("<script type=\"text/javascript\" src=\"test.js\"></scr"+"ipt>");
        w.document.writeln("<script type=\"text/javascript\" src=\"test2.js\"></scr"+"ipt>");
        w.document.writeln("</head>");
        w.document.writeln("<body onload=\"test();test2()\">");
        w.document.writeln("</body>");
        w.document.writeln("</html>");
         w.document.close();
   </script>
</head>
<body>
</body>
</html>

答案 2 :(得分:-1)

我不确定你打电话给弹出窗口的目的是什么......如果没有必要设置一个单独的窗口,你可以尝试在现有页面上设置一个覆盖层......有些人称之为收藏夹。

某些浏览器上的window.open函数最初会提示用户“接受弹出窗口”(我觉得很烦人),如果你不需要弹出窗口并且可以在同一页面上实现所有内容,你可以使用jQuery .load函数代替将内容加载到容器中(无需重新加载页面)。

http://api.jquery.com/load/