Вставка кода Javascript в HTML через Javascript

Я пытаюсь вставить код Javascript в HTML через Javascript.

Вставка этого кода в HTML не работает, код не выполняется:

<script>

function callAlert(){
alert('test');
}

</script>

Этот код выполняется:

<img src="xxx" onerror="alert('test')">

Это не вызывает функцию, поэтому предупреждение не выполняется:

<img src="xxx" onerror="callAlert();">

Почему предупреждение об ошибке выполняется, а функция вызова onerror - нет?


person Tadeas J    schedule 07.01.2018    source источник
comment
Ваш сценарий находится в голове или теле вашей страницы?   -  person Chris Riebschlager    schedule 07.01.2018
comment
У меня работает нормально. Проверьте сеть инструментов разработчика браузера и посмотрите, какой сервер возвращает для этого запроса.   -  person charlietfl    schedule 07.01.2018
comment
У меня тоже работает. См. этот онлайн-компилятор. repl.it/repls/ForthrightCloudyCock . Функция не сработает, если в вашем скрипте есть ошибки, поэтому проверьте консоль.   -  person pastaleg    schedule 07.01.2018
comment
Код Javascript вставляется в DOM с помощью Javascript, а страница уже загружена, вы, вероятно, пропустили эту часть.   -  person Tadeas J    schedule 07.01.2018
comment
Затем вы должны предоставить свой код, который вставляет код JS.   -  person Alohci    schedule 07.01.2018
comment
Возможно, вам следует изменить то, что вы предупреждаете. Вы могли перепутать callAlert() с предупреждением   -  person Nicholas Smith    schedule 08.01.2018


Ответы (2)


Вы больше не можете вставлять тег <script> с помощью el.innerHTML. Это проблема безопасности, которая была добавлена ​​относительно недавно.

Перейдите на эту страницу: https://developer.mozilla.org/en-US/docs/Web/API/Element/innerHTML

и прокрутите вниз до раздела Соображения безопасности.

В нем упоминается, что вы не можете добавить тег <script>, но это не является надежным. Такие вещи, как вы описываете, могут по-прежнему запускать скрипт:

const name = "<img src='x' onerror='alert(1)'>";
el.innerHTML = name; // shows the alert

Если вам действительно нужно добавить новый JavaScript из существующего JavaScript, вам нужно будет сделать что-то вроде следующего:

var s = document.createElement('script');
s.textContent = 'function callAlert(){alert(\'test\');}';
document.head.appendChild(s);
callAlert();

person Intervalia    schedule 10.01.2018

Попробуйте поместить скрипт в шапку страницы, возможно, функция выполняется до ее защиты.

Если это не работает, сообщите, какую ошибку возвращает ваша консоль.

person Matthew    schedule 07.01.2018
comment
В моей ситуации это невозможно. - person Tadeas J; 07.01.2018