Почему я не могу добавить строку, содержащую тег скрипта, в 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.