У нас было обсуждение на нашем рабочем месте на этом с некоторыми для и некоторыми против поведения. Требуемый для слушания представлений от Вас парни:
<html>
<body>
<div>
Test!
<script> document.body.removeChild(document.getElementsByTagName('div')[0]); </script>
</div>
</body>
</html>
Должен вышеупомянутый сценарий работать и делать то, что он, как предполагается, делает? Во-первых, давайте посмотрим то, что происходит здесь:
У меня есть JavaScript, который это в <div>
элемент. Этот JavaScript удалит дочерний узел в теле, которое, оказывается, содержит отделение внутри, которое существует сам сценарий.
Теперь, вышеупомянутый сценарий хорошо работает в Firefox, Opera и IE8. Но IE6 и IE7 дают предупреждение, говоря, что они не могут открыть страницу.
Давайте не дебатировать относительно того, как IE должен был обработать это (они приняли его как ошибку и следовательно зафиксировали его в IE8). Точка здесь, так как сам тег 'СЦЕНАРИЯ' является частью DOM, нужно позволить сделать что-то вроде этого? Это должно даже существовать после такой операции?
Править:
Firefox, Opera, IE9 и т.д. не удаляют тег 'сценария', если я выполняю вышеупомянутый код. Но, document.getElementsByTagName ('сценарий') .length возвращается 0!
Для понимания, что я имею в виду добавить alert(document.getElementsByTagName('script').length);
прежде и после document.body.removeChild(document.getElementsByTagName('div')[0]);
в коде выше.
Если возникает вопрос, "следует ли разрешить тегу сценария удалить себя?" Я так думаю. В конце концов, тег сценария может заставить браузер перейти на другую страницу, и в этом случае вся страница (включая такой тег сценария) удаляется из памяти.
Примером, где может быть удобно самоудаление, является, например, некоторый длинный опрос методы , которые, несомненно, сделают DOM большим через несколько минут.
Фреймворки JavaScript добавляют и удаляют элементы сценария как часть своей повседневной жизни.
Например. getScript ()
в jQuery помещает тег скрипта в заголовок документа и удаляет его сразу после оценки.
Они делают это для того, чтобы модель DOM оставалась чистой - иначе теги просто накапливались бы без надобности. После оценки они больше не нужны.
Единственный недостаток, который я вижу в этом, - это отладка - например, Firefox с Firebug, похоже, не знает, где находятся такие сценарии, и не может найти исходные строки. (На момент написания этой статьи.)
Сценарий удаляет DIV из дерева DOM документа, и так получилось, что он удаляет само объявление сценария (после его загрузки). Поэтому я думаю, что это должно быть разрешено как функция.
Кроме того, тег script будет существовать до тех пор, пока он не будет загружен и Javascript не будет интерпретирован и выполнен. При выполнении, тег DIV (и SCRIPT) будут удалены из дерева DOM и будут существовать только как объекты, которые будут собраны в мусор.
EDIT
Я думаю, что основной момент здесь в том, что тег SCRIPT
только создает объекты Javascript и помещает их в память механизма выполнения Javascript (который полностью отличается от DOM). Как только интерпретатор закончил чтение тега SCRIPT
, он больше не нужен и может быть отброшен (удален из DOM).
Если интерпретатор получил указание (от JS-кода) создать ссылки на ДРУГИЕ объекты в DOM (например, как обработчик нажатия кнопки), то функция Javascript будет по-прежнему доступна. Любые функции, вызываемые из этого обработчика событий, также будут доступны. Таким образом, вы можете "пройтись" по стеку вызовов от кнопки->обработчика->других функций/переменных.