JavaScript выполняется «inline», то есть в том порядке, в котором он появляется в DOM (если бы это было не так, вы никогда не могли быть уверены, что какая-то переменная, определенная в другом скрипте, была видна, когда вы использовали ее в первый раз. ).
Теоретически это означает, что у вас может быть сценарий в начале страницы (т.е. первый <script>
элемент), который просматривает DOM и удаляет все <script>
элементы и обработчики событий внутри вашего <div>
.
Но в реальности все сложнее: загрузка DOM и скрипта происходит асинхронно. Это означает, что браузер гарантирует только то, что сценарий может видеть часть DOM, которая находится перед ним (то есть заголовок в нашем примере). Нет никаких гарантий ни на что сверх (это связано с document.write()
). Так что вы можете увидеть следующий тег скрипта, а может быть, и нет.
Вы могли onload
зафиксировать событие документа - что обеспечило бы получение всей DOM - но в то время вредоносный код мог уже выполняться. Ситуация ухудшается, когда другие сценарии манипулируют DOM, добавляя туда сценарии. Таким образом, вам также придется проверять каждое изменение DOM.
Итак, решение @cowls (фильтрация на сервере) - единственное решение, которое можно заставить работать во всех ситуациях.