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

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

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

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

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

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

 Dmitriy Naumov01 апр. 2011 г., 17:03
(+1) хороший вопрос.

Ответы на вопрос(5)

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

НТН.

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

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

увидетьпочему экранирование / в javascript & lt; \ / script & gt;?

Возможно, ваш тег сценария может интерпретироваться независимо. Пытаться:

div.innerHTML = '<scr' + 'ipt src="somescript.js"></scr' + 'ipt>';
 01 июл. 2009 г., 13:17
Это распространенная проблема с использованием тегов скрипта в коде и, скорее всего, проблема здесь
 01 июл. 2009 г., 14:04
Довольно много браузеров исправляют очевидные инъекции скриптов, подобные этой. Тем не менее, обходной путь правильный - исправьте его самостоятельно, чтобы он все еще работал.
 bitsprint01 июл. 2009 г., 13:40
Это интересно. Можете ли вы уточнить?
 bitsprint01 июл. 2009 г., 14:10
Попробовал следующее в IE - используя IE8 в режиме IE7 и отладчик Tools Tools, значение не заканчивается в div: & lt; html & gt; & Л; тело & GT; & lt; div id = & quot; test & quot; & lt; / div & gt; & Lt; / тело & GT; & lt; тип скрипта = & quot; текст / javascript & quot; & gt; var div = document.createElement ("div"); div.innerHTML = & lt; scr ' + "ipt src =" somescript.js "& lt; / scr"; + 'ipt & gt;'; document.getElementById (& APOS; тест & APOS;). AppendChild (дела); & Lt; / сценарий & GT; & Lt; / HTML & GT;
 01 июл. 2009 г., 14:02
+1 Это звучит как проблема для меня.
Решение Вопроса

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

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>";
..
 01 июл. 2009 г., 13:28
У меня есть смутное ощущение, что проблема OP - это на самом деле функция безопасности на работе, и ваш первый ответ здесь - обычное (и не блокирующее!) Решение.
 01 июл. 2009 г., 13:22
+1 за первый вариант.
 bitsprint01 июл. 2009 г., 13:38
Согласен, именно так я обычно и поступаю, но, как я уже сказал, есть скрипт внешнего поставщика, который выполняет: document.write (& quot; ); Я не знаю, какой будет служба безопасности. Мы вызываем этот скрипт после частичного обновления страницы (ajax), и document.write отображает новую страницу, поэтому я перезаписываю document.write в своем скрипте, чтобы попытаться добавить скрипт на страницу, а не разрешить document.write для бывает. Я должен был быть яснее об обстоятельствах. Это все имеет смысл?
 01 июл. 2009 г., 13:24
Я также предпочитаю 1-й. Это намного чище и многоразово. Они вторые были просто "попробуй это" предложение, если он не хочет использовать 1-й подход :)
 bitsprint30 мар. 2011 г., 09:49
Я покинул компанию, где у меня была эта проблема. В конце концов, проблема была связана со сценарием внешнего поставщика, но если бы это было не так, я думаю, что первое решение было бы моим предпочтительным подходом к решению этой проблемы.

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

Также есть дополнительное предостережение ... вы должны вставлять разметку без сценария одновременно с вставкой сценария. Мне не удалось вставить теги сценария самостоятельно, с или без 'defer' apos; имущество. Наконец, теги сценария должны быть размещены после вставки всей другой разметки, не являющейся сценарием. В противном случае теги сценария удаляются из вставленного 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

Пример скриптовой вставки с помощью кода (да, он действительно работает):

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

Ваш ответ на вопрос