Должен ли тег "script" быть удален сам? - PullRequest
17 голосов
/ 21 марта 2010

Мы обсуждали это на нашем рабочем месте с некоторыми за, а некоторые против поведения. Хотели услышать мнение от вас, ребята:

<html>
<body>
<div>
Test!
<script> document.body.removeChild(document.getElementsByTagName('div')[0]); </script>
</div>
</body>
</html>

Должен ли вышеприведенный скрипт работать и делать то, что должен? Для начала посмотрим, что здесь происходит:

У меня есть JavaScript, который находится внутри элемента <div>. Этот javascript удалит дочерний узел внутри тела, в котором находится div, внутри которого существует сам скрипт.

Теперь вышеуказанный скрипт отлично работает в Firefox, Opera и IE8. Но IE6 и IE7 предупреждают, что не могут открыть страницу.

Давайте не будем спорить о том, как IE должен был это обработать (они приняли это как ошибку и, следовательно, исправили в IE8). Дело в том, что тег 'SCRIPT' сам по себе является частью DOM, следует ли ему разрешать делать что-то подобное? Должно ли оно вообще существовать после такой операции?

Редактировать :

Firefox, Opera, IE9 и т. Д. Не удаляют тег 'script', если я запускаю приведенный выше код. Но document.getElementsByTagName ('script'). Length возвращает 0!

Чтобы понять, что я имею в виду, добавьте alert(document.getElementsByTagName('script').length); до и после document.body.removeChild(document.getElementsByTagName('div')[0]); в коде выше.

Ответы [ 6 ]

8 голосов
/ 21 марта 2010

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

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

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

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

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

7 голосов
/ 21 марта 2010

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

5 голосов
/ 01 ноября 2012

На самом деле вы можете сделать это:

var currentScript;
currentScript = document.currentScript || document.scripts[document.scripts.length - 1];
currentScript.parentNode.removeChild(currentScript);
2 голосов
/ 21 марта 2010

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

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

EDIT

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

Если интерпретатор получил указание (с помощью кода JS) создать ссылки на OTHER объекты в DOM (например, в качестве обработчика для нажатия кнопки), тогда функция Javascript все равно будетдоступны.Любые функции, вызываемые из этого обработчика событий, также будут доступны.Таким образом, вы можете «пройти» стек вызовов из кнопки-> обработчик-> другие функции / переменные.

1 голос
/ 14 марта 2017

Да, это допустимое поведение, поскольку скрипт удаляет только DOM-представление самого себя.Это не удаляет себя таким образом.На самом деле, скрипт может заменить собственное текстовое представление на странице чем-то совершенно другим без повторного запуска.

Пример:

var s = document.createElement('script');
s.textContent = 'alert("Hello, world!");'+
                'document.currentScript.textContent="alert(1)";';
                // BTW, behavior is the same for innerHTML
document.body.appendChild(s);

Однако, практически нет веских причин для удаления скриптасам или изменить свой код, если вы не хотите держать вещи в DOM чистыми.Кроме того, это не скроет ваш код от тех, кто хочет на него смотреть.Обычно это означает, что вам нужно было добавить скрипт из какого-то другого кода, и лучше все равно использовать что-то вроде document.body.removeChild(s); из этого другого скрипта.

0 голосов
/ 04 ноября 2016

Использование JQuery (более 10.0.1) может сделать следующее:

<!-- you call first to jquery -->
<script id="autoremove">
      $(function(){
           //your operations
                //action
                //action
           //remove the script
           $("#autoremove").remove();
      });
</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...