Подтвердить что ты не робот

Должен ли тег "script" удалять себя?

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

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

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

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

Теперь выше script отлично работает в 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]); в приведенном выше коде.

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

Ответ 3

Собственно вы можете это сделать:

var currentScript;
currentScript = document.currentScript || document.scripts[document.scripts.length - 1];
currentScript.parentNode.removeChild(currentScript);

Ответ 4

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

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

ИЗМЕНИТЬ

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

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

Ответ 5

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

Пример:

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);

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

Ответ 6

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

<!-- you call first to jquery -->
<script id="autoremove">
      $(function(){
           //your operations
                //action
                //action
           //remove the script
           $("#autoremove").remove();
      });
</script>