Я столкнулся с проблемой, которая, кажется, появляется только в Windows 7. Похоже, она отлично работает в IE8 на другой версии Windows. По сути, я создаю новое окно с помощью 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. Однако, когда я пытаюсь сделать это в IE8 в Windows 7, он открывает пустую страницу, но никакие предупреждения не появляются (или иногда только одно).
Это какая-то временная проблема? Кто-нибудь еще видел это? Есть ли способ, которым я могу обойти это?
Edit:
Вот код, который я попробовал, который хотел увидеть Роб Куни. Опять же, это работает в других браузерах, но не в IE8 на Windows 7.
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 здесь .
Принятие обходного пути 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 и проверил наличие переменных в первом файле перед загрузкой второго файла.