Я получил часть кода 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% ЦП.
Этот код работал на меня:
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");
Вам нужно создать элемент скрипта в том же документе, который вы прилагаете.
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"));
Думаю, ваш код, основанный на 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();
}
}
Здесь обратный вызов - это буквально выполняемая функция.
.] Посмотрите на [] writeCapture.js[][
]. [] []] Утилита, помогающая Ajax загружать HTML, содержащий теги сценариев, которые используют document.write[
]. [