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

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

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

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

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

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

5 ответов


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

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

или

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

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

существует также дополнительное предостережение...необходимо вставить разметку, отличную от сценария, одновременно с вставкой сценария. Я не смог вставить теги скрипта сами по себе, С или без свойства "отложить". Наконец, теги скриптов должны быть размещены после вставки всех других нескриптовых разметок. В противном случае теги скрипта будут удалены из вставленного HTML.

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

MS innerHTML ссылка:

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

MS Defer Property Reference:

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

пример вставки скрипта через Код (да, он действительно работает):

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;
}

ваш тег скрипта, вероятно, удается интерпретировать независимо. Попробуйте:

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

вам нужно использовать escape char для </script>

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

посмотреть почему экранирование / в javascript ' '?


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

HTH.