JavaScript виконується "вбудовано", тобто в тому порядку, в якому він відображається в DOM (якщо це не так, ви ніколи не можете бути впевнені, що якась змінна, визначена в іншому сценарії, була видимою, коли ви використовували її вперше ).
Це означає, що теоретично ви можете мати скрипт на початку сторінки (тобто перший <script>
елемент), який переглядає DOM і видаляє всі <script>
елементи та обробники подій усередині вашого <div>
.
Але реальність є більш складною: завантаження DOM і сценаріїв відбувається асинхронно. Це означає, що браузер гарантує лише те, що скрипт може бачити частину DOM, яка знаходиться перед ним (тобто заголовок до цього часу в нашому прикладі). Немає ніяких гарантій ні для чого іншого (це пов'язано з document.write()
). Тож ви можете побачити наступний тег сценарію, а може, ні.
Ви можете зафіксувати onload
подію документа - це переконається, що ви отримали весь DOM, - але на той момент шкідливий код міг уже виконуватися. Справа погіршується, коли інші сценарії маніпулюють DOM, додаючи туди сценарії. Тому вам також доведеться перевіряти кожну зміну DOM.
Отже, рішення @cowls (фільтрація на сервері) - єдине рішення, яке можна змусити працювати в будь-яких ситуаціях.