Должен ли тег "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]);
в приведенном выше коде.
Ответы
Ответ 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>