我遇到了一个似乎只出现在
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上发布了这个问题.
<!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解决了这个问题,并在加载第二个文件之前测试第一个文件中是否存在变量.
解决方法
尝试这样的事情(未经测试):
var s=document.createElement('script'); s.type = "text/javascript"; s.src = "test.js"; document.body.appendChild(s);