<сценарий> в коде JavaScript document.write ()

Я получил часть кода JavaScript, встроенного в HTML (сгенерированный на стороне сервера), который похож на это:

function winWriteMail2(){
  var win = open('','wininfo', 'width=400,height=300,scrollbars=yes,resizable=yes');
  win.document.open();
  win.document.write('<HTML><HEAD><META http-equiv="Content-type" content="text/html; charset=iso-8859-2"><LINK rel="stylesheet" type="text/css" href="/css/main.css">');
  win.document.write('<scr' + 'ipt language="javascript" type="text/javascript" src="/js/JSFILE.js"></scr' + 'ipt>');
  win.document.write('</HEAD><BODY BGCOLOR="#f7f3e7">');
  <!-- window content goes here -->
  win.document.write('</BODY></HTML>');
  win.document.close();
}

Этот код выполнен по щелчку элемента.

Проблематичная часть для меня является включением файла JavaScript - это работает хорошо в Firefox и Chrome, но IE (7 и 8, когда я протестировал) ведет себя странный. Со строкой, содержащей JSFILE там, окно по щелчку открыто, но пусто, ЦП на 100% занят, и только путь состоит в том, чтобы уничтожить IE.

Кто-либо может помочь с решением этой проблемы? Возможно, я должен использовать некоторый другой способ вставить файлы JavaScript там?

Я попробовал, вместо win.document.write(), DOM-метод-обработки, помещая эту часть кода после win.document.close():

h = win.document.getElementsByName('head')[0];
js = document.createElement('script');
js.src = '/js/JSFILE.js';
h.appendChild(js);

но тогда код не загружается, даже в Firefox (и осматривающий с поджигателем не показывает, что он даже видит его).


После некоторых проверок я узнал, что проблема вызывается <script> элементы с a src= атрибут определяется. Если я добавляю встроенный сценарий, как:

<script type='text/javascript'>alert('foo')</script>

в моем document.write(), окно открывается, окно предупреждений обнаруживается, и все в порядке.

Но использование a

<script type='text/javascript' src='/js/foo.js'></script>

Остановы IE при открытии нового окна, продолжают использовать 100% ЦП.

9
задан kender 4 January 2010 в 07:20
поделиться

4 ответа

Этот код работал на меня:

function winWriteMail2(){
    var win = open('','wininfo', 'width=400,height=300,scrollbars=yes,resizable=yes');
    win.document.open();
    win.document.write('<HTML><HEAD><META http-equiv="Content-type" content="text/html; charset=iso-8859-2"><LINK rel="stylesheet" type="text/css" href="/css/main.css">');
    win.document.write('</HEAD><BODY BGCOLOR="#f7f3e7">');
    win.document.write('this is the body content');
    win.document.write('</BODY></HTML>');
    win.document.close();

    var h = win.document.getElementsByTagName("head")[0];
    var js = win.document.createElement("script");
    js.type = "text/javascript";
    js.src = "js/scriptfile.js";
    h.appendChild(js);
}

Вот что мне нужно было изменить в вашем коде, чтобы он заработал:

//From
var js = document.createElement("script");
//To
var js = win.document.createElement("script");

Вам нужно создать элемент скрипта в том же документе, который вы прилагаете.

6
ответ дан 4 December 2019 в 14:28
поделиться

Google Analytics делает это следующим образом:

var _gat, gaJsHost = (("https:" == документ.местоположение.протокол) ? "https://ssl." : "http://www."); document.write(unescape("%3Cscript src='' + gaJsHost + "google-analytics.com/ga.js type='text/javascript'%3E%3C/script%3E"));

5
ответ дан 4 December 2019 в 14:28
поделиться

Думаю, ваш код, основанный на DOM, в порядке, но попробуйте (а) использовать абсолютный URL скрипта, (б) установить тип скрипта и (в) обновить src после добавления, это должно сделать его более надежным:

var head = document.getElementsByTagName("head")[0];
var script = document.createElement("script");
script.type = "text/javascript";
head.appendChild(script);
script.src = "http://host.tld/js/JSFILE.js";

Надеюсь, это поможет.

EDIT

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

// most browsers
script.onload = callback;
// IE
script.onreadystatechange = function() {
   if(this.readyState == "loaded"  || this.readyState == "complete") {
      callback();
   }
}

Здесь обратный вызов - это буквально выполняемая функция.

.
1
ответ дан 4 December 2019 в 14:28
поделиться
[

] Посмотрите на [] writeCapture.js[][

]. [
] [

] Утилита, помогающая Ajax загружать HTML, содержащий теги сценариев, которые используют document.write[

]. [
]
1
ответ дан 4 December 2019 в 14:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: