“Сценарий” должен отметить быть позволенным удалить себя?

У нас было обсуждение на нашем рабочем месте на этом с некоторыми для и некоторыми против поведения. Требуемый для слушания представлений от Вас парни:

<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]); в коде выше.

17
задан John Saunders 21 March 2010 в 07:34
поделиться

3 ответа

Если возникает вопрос, "следует ли разрешить тегу сценария удалить себя?" Я так думаю. В конце концов, тег сценария может заставить браузер перейти на другую страницу, и в этом случае вся страница (включая такой тег сценария) удаляется из памяти.

7
ответ дан 30 November 2019 в 13:40
поделиться

Примером, где может быть удобно самоудаление, является, например, некоторый длинный опрос методы , которые, несомненно, сделают DOM большим через несколько минут.

Фреймворки JavaScript добавляют и удаляют элементы сценария как часть своей повседневной жизни.

Например. getScript () в jQuery помещает тег скрипта в заголовок документа и удаляет его сразу после оценки.

Они делают это для того, чтобы модель DOM оставалась чистой - иначе теги просто накапливались бы без надобности. После оценки они больше не нужны.

Единственный недостаток, который я вижу в этом, - это отладка - например, Firefox с Firebug, похоже, не знает, где находятся такие сценарии, и не может найти исходные строки. (На момент написания этой статьи.)

8
ответ дан 30 November 2019 в 13:40
поделиться

Сценарий удаляет DIV из дерева DOM документа, и так получилось, что он удаляет само объявление сценария (после его загрузки). Поэтому я думаю, что это должно быть разрешено как функция.

Кроме того, тег script будет существовать до тех пор, пока он не будет загружен и Javascript не будет интерпретирован и выполнен. При выполнении, тег DIV (и SCRIPT) будут удалены из дерева DOM и будут существовать только как объекты, которые будут собраны в мусор.

EDIT

Я думаю, что основной момент здесь в том, что тег SCRIPT только создает объекты Javascript и помещает их в память механизма выполнения Javascript (который полностью отличается от DOM). Как только интерпретатор закончил чтение тега SCRIPT, он больше не нужен и может быть отброшен (удален из DOM).

Если интерпретатор получил указание (от JS-кода) создать ссылки на ДРУГИЕ объекты в DOM (например, как обработчик нажатия кнопки), то функция Javascript будет по-прежнему доступна. Любые функции, вызываемые из этого обработчика событий, также будут доступны. Таким образом, вы можете "пройтись" по стеку вызовов от кнопки->обработчика->других функций/переменных.

2
ответ дан 30 November 2019 в 13:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: