Элементы скрипта, записанные с помощью document.write в окне, открытом с помощью window.open, не выполняются в IE8 в Windows 7 - PullRequest
7 голосов
/ 25 июня 2010

Я столкнулся с проблемой, которая, кажется, появляется только в 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 и проверил наличие переменных в первом файле перед загрузкой второго файла.

Ответы [ 3 ]

6 голосов
/ 05 июля 2010

Попробуйте что-то вроде этого (не проверено):

var s=document.createElement('script');
s.type = "text/javascript";
s.src = "test.js";
document.body.appendChild(s);
1 голос
/ 27 июня 2010

Возможно, вы захотите обернуть вызовы предупреждений в определения функций в импортированных js-файлах, а затем добавить onLoad в тег body windowHTML, который вызывает функцию

EDIT:

<!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>
0 голосов
/ 02 июля 2010

Я не уверен, какова ваша цель вызова всплывающего окна ... если нет необходимости иметь отдельное окно, вы можете вместо этого попытаться создать наложенный слой на существующей странице ... некоторые люди называют это осветителя.

Функция window.open в некоторых браузерах первоначально будет предлагать пользователю «принять всплывающее окно» (что я считаю раздражающим), если вам не нужно всплывающее окно и вы можете реализовать все на той же странице, вы можете использовать Вместо этого используйте функцию jQuery .load для загрузки содержимого в контейнер (без перезагрузки страницы).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...