Почему я не могу добавить строку, содержащую тег script, в innerHTML в IE

Я пытаюсь сделать следующее (я использую библиотеку прототипов):

var div = document.createElement('div');
div.innerHTML = '<script src="somescript.js"></script>';
$('banner').insert(div);

В IE свойство div.innerHTML всегда равно "" после того, как я установил свойство во второй строке.

Этот фрагмент находится внутри функции, которая переопределяет document.write() во внешнем вендоре script, поэтому я делаю это так, а не создаю элемент script и добавляя его в элемент div непосредственно.

Любая помощь будет действительно оценена, это дает мне серые волосы!

Ответ 1

Вместо этого вы можете сделать что-то вроде этого:

function loadScript(src) {
       var script = document.createElement("script");
       script.type = "text/javascript";
       document.getElementsByTagName("head")[0].appendChild(script);
       script.src = src;
}

или do

..
div.innerHTML = "<script src=\"somescript.js\"></script>";
..

Ответ 2

У меня тоже затихли. Оказывается, что IE не позволяет вставлять JS напрямую через innerHTML, если вы не включите свойство defer (см. Второе звено ниже). Это свойство уникально для IE и, по-видимому, позволяет IE откладывать выполнение любого JS до тех пор, пока не будет загружена другая разметка. Предупреждение, хотя... если вы включаете два тега script (как и я), нет гарантии, что один будет выполняться первым, так как скрипты будут загружаться асинхронно. Это должно быть проблемой только в том случае, если ваши сценарии зависят друг от друга (как и мои).

Также существует дополнительная оговорка... вы должны вставлять разметку script в то же время, когда вы вставляете script. Мне не удалось вставить теги script самостоятельно, с или без свойства defer. Наконец, теги script должны быть размещены после того, как будет вставлена ​​вся другая разметка script. В противном случае теги script удаляются из вставленного HTML.

Вот несколько ссылок:

MS innerHTML Ссылка:

http://msdn.microsoft.com/en-us/library/ms533897%28v=vs.85%29.aspx

Справочник по свойствам MS Defer:

http://msdn.microsoft.com/en-us/library/ms533719%28v=vs.85%29.aspx

Пример script Вставка через код (да, это действительно работает):

http://samples.msdn.microsoft.com/workshop/samples/author/dhtml/refs/insertScript_2.htm

Мой тестовый код:

// I downloaded the MS example file above and tweaked their script a bit, 
// resulting in this.  Using the proper approach to the defer property 
// (namely: defer="defer") did not provide me with consistent results, so 
// sticking with 'DEFER' may be necessary.
// Note:  Try moving the 'sHTML' variable to the end of the script string.
function insertScript2()
{
    var sHTML="<input type=button onclick=" + "go2()" + " value='Click Me'><BR>";
    var sScript = sHTML + "<SCRIPT DEFER type='text/javascript'> function go2(){ alert('Hello from inserted script.') } </SCRIPT" + ">";
    ScriptDiv.innerHTML = sScript;
}

Ответ 3

Тег script, вероятно, может быть интерпретирован независимо. Попробуйте:

div.innerHTML = '<scr' + 'ipt src="somescript.js"></scr' + 'ipt>';

Ответ 5

Вы пытались добавить встроенную JS вместо загрузки .js файла? Я делал это в прошлом, и это работало отлично для меня. Не уверен, что это все равно будет работать с последними браузерами/программами безопасности.

НТН.