Почему внутри этого скрипта не работает innerHTML? [Дубликат]

Попробуйте добавить все ваши страницы в myPageList.

IEnumerable<MyPage> myPageList;

foreach(MyPage myPage in myPageList)
{
if (myPage != null)
    myPage.Data = this.data;
}
5
задан Maxingchi 15 November 2012 в 12:00
поделиться

3 ответа

Это было тривиально.

Как указано в spec ( 8.4 Анализ фрагментов HTML и 8.2.3.5 Другие флаги состояния синтаксического анализа ,) quote:

при использовании innerHTML браузер будет

  1. Создайте новый узел Document и отметьте его как документ HTML.
  2. Если есть элемент контекста, а Документ контекстного элемента находится в режиме quirks, то пусть Document находится в режиме quirks. В противном случае, если есть элемент контекста, а Документ контекстного элемента находится в режиме с ограниченным типом, то пусть Документ находится в режиме с ограниченным типом. В противном случае оставьте документ в режиме отсутствия-quirks.
  3. Создайте новый синтаксический анализатор HTML и свяжите его с только что созданным узлом документа. ...

и при синтаксическом анализе <script> внутри

Флаг сценария установлен на " включен ", если сценарий был включен для документа, с которым связан парсер, когда был создан парсер, и" отключен "в противном случае.

Флаг сценария может быть включен, даже если парсер был изначально создан для HTML

Таким образом, он не будет выполнен, если вы введете его с помощью innerHTML.

И использование innerHTML предотвратит выполнение элемента <script>, который будет выполнен постоянно.

Как указано в spec ( 4.3.1 Элемент script ,) quote:

Изменение атрибутов src, type, charset, async и defer динамически не имеет прямого эффекта; эти атрибуты используются только в определенное время, описанное ниже.

Заключение , описанного ниже , заключается в том, что он только анализирует атрибут src при введении <script> к document (независимо от того, какой, включая временный , созданный при использовании innerHTML.)

Итак, до тех пор, пока вы хотите вставить сценарий в документ и сделайте его выполненным, вы должны использовать script = document.createElement('script').

Задайте его атрибуты, такие как src и type, возможно, содержимое внутри (с помощью script.appendChild(document.createTextNode(content))), затем добавьте его в document.body.

16
ответ дан xiaoyi 18 August 2018 в 02:21
поделиться

Вы можете попробовать это:

var wrap = document.createElement('div');
var scr = document.createElement('script');
scr.src = scriptUrl;
scr.type = 'text/javascript';
wrap.appendChild(scr);
document.body.appendChild(wrap);

Создав тэг сценария явно, вы сообщаете JS, что innerHTML не является текстом, а вместо этого является исполняемым скриптом.

3
ответ дан inhan 18 August 2018 в 02:21
поделиться
  • 1
    Хе-хе, я знаю, что.если вы создаете тег сценария с document.createElement ('script'), он просто работает. and create with innerHTML - это то, как метод $ Zepto реализует это – Maxingchi 15 November 2012 в 05:46

Возможное решение, если у вас нет контроля над механизмом вставки, и вы вынуждены использовать innerHTML с маяками script, состоит в том, чтобы перестроить DOM-узлы из «призрачных».

Это повторяющаяся проблема в индустрии ad-tech, в которой многие автоматизированные системы дублируют произвольный HTML-код (например, adservers ^^).

отлично работает в Chrome:

var s = wrap.getElementsByTagName('script');
for (var i = 0; i < s.length ; i++) {
  var node=s[i], parent=node.parentElement, d = document.createElement('script');
  d.async=node.async;
  d.src=node.src;
  parent.insertBefore(d,node);
  parent.removeChild(node);
}

(вы можете проверить его в JSFiddle )

2
ответ дан Samuel_fr_29 18 August 2018 в 02:21
поделиться
  • 1
    если тег скрипта содержит javascript напрямую, вам необходимо назначить поле textContent вместо (или в дополнение) к полю src. В любом случае +1 для реального реального решения, которое работает для случая, когда javascript используется на стороне клиента на ранее существовавшем HTML-шаблоне, где вызов document.createElement невозможен. – Michael 13 April 2016 в 23:05
  • 2
    А также, конечно, если textContent используется, d.setAttribute('type','text/javascript') также требуется, чтобы убедиться, что текстовое содержимое оценивается как javascript. – Michael 13 April 2016 в 23:29
Другие вопросы по тегам:

Похожие вопросы: