Я использую следующий код для получения каталога файлов с определенным расширением. Выдает ошибку, что у вас нет прав администратора. Посоветуйте пожалуйста как это исправить. se.setAttribute ('type', 'text / javascript'); se.innerHTML = 'alert (1)'; ...
Я хочу динамически добавить javascript к существующему элементу сценария, например:
var se = document.createElement('script');
se.setAttribute('type', 'text/javascript');
se.innerHTML = 'alert(1)';
document.getElementsByTagName('head').item(0).appendChild(se);
Интересная часть: se.innerHTML = 'alert (1)';
и допустимо ли это? Если нет, то как я могу сделать это правильно?
Это не добавление JavaScript к существующему элементу сценария, а создание нового элемента сценария и добавление его в документ.
Это работает в современных браузерах, но обычно вы бы этого не сделали, если бы у вас не было некоторого кода в переменной, который вам действительно нужно было выполнить в глобальном контексте (поэтому вы не могли использовать new Function()
или eval
внутри функции).
Каков вариант использования? Ты действительно должен это делать?
Если вы попытаетесь изменить содержимое скрипта, записав текстовое содержимое , которое уже было в документе, это не приведет к запуску нового содержимого скрипта, это приведет к просто измените содержимое DOM. Точные обстоятельства того, что вызывает запуск нового скрипта при манипулировании элементом
, различаются от браузера к браузеру (хотя HTML5 пытается стандартизировать его); пока лучше не делать ничего, кроме простого создания и добавления нового скрипта. (И даже лучше вообще избегать написания скриптов
, если это возможно.)
Настройка innerHTML
будет работать; Однако метод RoToRa с createTextNode
лучше. Для в HTML-документе старой школы
innerHTML
фактически сделает то же самое, что и createTextNode
, поскольку — это элемент CDATA, который не может содержать разметку.Однако это имеет значение для XHTML-served-as-XML, и в целом лучше избегать
innerHTML
и его проблем с экранированием, когда вы просто хотите установить обычный текст.
Кроме того, вы можете использовать [0]
вместо item(0)
(это определено как часть привязки JavaScript DOM), и в целом вам следует избегать getAttribute
/ установить атрибут
; вместо этого используйте свойства HTML DOM, такие как se.type=...
, которые более читабельны и содержат меньше ошибок в IE (хотя ошибки IE не повлияют на атрибут type
).
Все браузеры в настоящее время поддерживают свойство javascript текст и будут оценивать текст при добавлении в документ нового элемента сценария (без атрибута src).
innerHTML или добавление дочерних узлов к элементу сценария не оценивают сценарий во всех браузерах.
function addCode(code){
var JS= document.createElement('script');
JS.text= code;
document.body.appendChild(JS);
}
//тестовый пример
var s= 'document.body.ondblclick=function(e){\n'+
'e=window.event? event.srcElement:e.target;\n'+
'alert(e.id || e.tagName);\n'+
'}\nalert("ready to double click!");';
addCode(s);
Использование innerHTML
сломается, если текст содержит что-либо, что может быть интерпретировано как HTML, например, <
. Было бы лучше добавить один (или несколько) текстовых узлов:
var se = document.createElement('script');
se.setAttribute('type', 'text/javascript');
se.appendChild(document.createTextNode('alert(1)'));
document.getElementsByTagName('head').item(0).appendChild(se);