Попробуйте добавить все ваши страницы в myPageList.
IEnumerable<MyPage> myPageList;
foreach(MyPage myPage in myPageList)
{
if (myPage != null)
myPage.Data = this.data;
}
Это было тривиально.
Как указано в spec ( 8.4 Анализ фрагментов HTML и 8.2.3.5 Другие флаги состояния синтаксического анализа ,) quote:
при использовании innerHTML
браузер будет
blockquote>
- Создайте новый узел Document и отметьте его как документ HTML.
- Если есть элемент контекста, а Документ контекстного элемента находится в режиме quirks, то пусть Document находится в режиме quirks. В противном случае, если есть элемент контекста, а Документ контекстного элемента находится в режиме с ограниченным типом, то пусть Документ находится в режиме с ограниченным типом. В противном случае оставьте документ в режиме отсутствия-quirks.
- Создайте новый синтаксический анализатор HTML и свяжите его с только что созданным узлом документа. ...
и при синтаксическом анализе
<script>
внутриФлаг сценария установлен на " включен ", если сценарий был включен для документа, с которым связан парсер, когда был создан парсер, и" отключен "в противном случае.
Флаг сценария может быть включен, даже если парсер был изначально создан для HTML
blockquote>Таким образом, он не будет выполнен, если вы введете его с помощью
innerHTML
.И использование
innerHTML
предотвратит выполнение элемента<script>
, который будет выполнен постоянно.Как указано в spec ( 4.3.1 Элемент script ,) quote:
Изменение атрибутов src, type, charset, async и defer динамически не имеет прямого эффекта; эти атрибуты используются только в определенное время, описанное ниже.
blockquote>Заключение , описанного ниже , заключается в том, что он только анализирует атрибут
src
при введении<script>
кdocument
(независимо от того, какой, включая временный , созданный при использованииinnerHTML
.)Итак, до тех пор, пока вы хотите вставить сценарий в документ и сделайте его выполненным, вы должны использовать
script = document.createElement('script')
.Задайте его атрибуты, такие как
src
иtype
, возможно, содержимое внутри (с помощьюscript.appendChild(document.createTextNode(content))
), затем добавьте его вdocument.body
.
Вы можете попробовать это:
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 не является текстом, а вместо этого является исполняемым скриптом.
Возможное решение, если у вас нет контроля над механизмом вставки, и вы вынуждены использовать 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 )
textContent
вместо (или в дополнение) к полю src
. В любом случае +1 для реального реального решения, которое работает для случая, когда javascript используется на стороне клиента на ранее существовавшем HTML-шаблоне, где вызов document.createElement невозможен.
– Michael
13 April 2016 в 23:05
textContent
используется, d.setAttribute('type','text/javascript')
также требуется, чтобы убедиться, что текстовое содержимое оценивается как javascript.
– Michael
13 April 2016 в 23:29