В каких браузерах тег <script>, добавленный к документу, оценивается автоматически? - PullRequest
2 голосов
/ 02 августа 2009

Во многих браузерах, если я это сделаю:

var x = document.createElement("SPAN");
x.innerHTML = "<script>alert(1);</script>";   
document.body.appendChild(x);

оповещений не будет.

Есть ли браузеры, для которых это произойдет? Если да, то какие?

Ответы [ 3 ]

2 голосов
/ 02 августа 2009

Отсутствует. innerHTML не запускает элементы скрипта (если они не имеют атрибута defer, но я не думаю, что это универсально).

Я не проверял следующее, но оно должно быть универсально поддерживаемым среди браузеров, которые поддерживают DOM и JS.

var script = "alert(1)";
var script_node = document.createTextNode(script);
var script_element = document.createElement('script');
script_element.type = "text/javascript";
script_element.appendChild(script_node);
document.body.appendChild(script_element);
0 голосов
/ 04 августа 2009

Добавление скрипта через innerHTML не работает ни в одном из известных мне браузеров. Добавление узла скрипта через dom не работает в IE. Если у вас есть HTML-строка, содержащая теги сценария, которые вы хотите вставить на страницу, лучше всего извлечь содержимое тега сценария и проверить его. Библиотека прототипов имеет удобную функцию evalScripts для выполнения именно этого (а также другие функции для вставки html и eval-скриптов и т. Д.).

0 голосов
/ 03 августа 2009

Как отметил Дэвид, использование .innerHTML не сработает.

Думал, что большинство людей думают, что добавление в DOM - это путь, этот метод не работает в Safari 2.0.

Лучший способ, используемый в scriptaculous , это использовать document.write():

// inserting via DOM fails in Safari 2.0, so brute force approach
document.write('<script type="text/javascript">alert("hi");<\/script>');
...