Удаляет ли jQuery.remove() загруженный javascript, когда он используется для удаления тега script?
Как говорится в заголовке, если я удаляю тег script из DOM, используя:
$('#scriptid').remove();
Является ли сам javascript в памяти или очищается?
Или... я полностью не понимаю, как браузеры обрабатывают javascript? Это вполне возможно.
Для тех, кто интересуется моей причиной, пожалуйста, см. ниже:
Я перемещаю некоторые обычные javascript-взаимодействия из статических script файлов в динамически сгенерированные в PHP. Которые загружаются по требованию, когда пользователь требует их.
Причина этого заключается в том, чтобы переместить логический сервер и запустить небольшой script, возвращенный с сервера, clientide. Вместо того, чтобы иметь большой script, который содержит огромное количество логики, clientide.
Это аналогичный подход к тому, что делает facebook...
Facebook обсуждает frontend javascript
Если мы возьмем простой диалог, например. Вместо того, чтобы генерировать html в javascript, добавляя его к dom, а затем используя виджет диалогового окна jqueryUI для его загрузки, я делаю следующее.
- Запрос Ajax выполняется в dialog.php
- Сервер создает html и javascript, специфичные для этого диалога, затем кодирует их как JSON
- JSON возвращается клиенту.
- HTML добавляется к
<body>
, а затем, когда это визуализируется, javascript также добавляется в DOM.
javascript выполняется автоматически при вставке и открывается динамический диалог.
Это уменьшило количество javasript на моей странице, но я обеспокоен очисткой вставленного javascript.
Очевидно, как только диалог был закрыт, он удаляется из DOM с помощью jQuery:
$('#dialog').remove();
javascript добавляется с идентификатором, и я также удаляю его из DOM с помощью того же метода.
Однако, как указано выше, использование jQuery.remove() действительно очищает javascript из памяти или просто удаляет элемент <script>
из DOM?
Если да, есть ли способ очистить это?
Ответы
Ответ 1
Нет. После загрузки script объекты и функции, которые он определяет, хранятся в памяти. Удаление элемента script не удаляет объекты, которые он определяет. Это контрастирует с CSS файлами, в которых удаление элемента удаляет указанные стили. Это потому, что новые стили можно легко переплавить. Можете ли вы представить себе, как сложно было бы определить, что создал тэг script и как его удалить?
EDIT: Однако, если у вас есть файл, который определяет myFunction
, то вы добавляете еще один script, который переопределяет myFunction
на что-то еще, новое значение будет сохранено. Вы можете удалить старый тег script
, если хотите, чтобы DOM был чистым, но все его удаление.
EDIT2: единственный реальный способ "очистить" функции, о которых я могу думать, это иметь JS файл, который в основном вызывает delete window.myFunction
для каждого возможного объекта и функции, которые могут определить ваши другие файлы script. По понятным причинам это действительно плохая идея.
Ответ 2
Если ваши скрипты уже выполнены, удаление элементов DOM не избавится от них. Перейдите на любую страницу с JavaScript, откройте свою предпочтительную консоль javascript и введите $( "script" ). Remove(). Все работает.
И это демонстрирует ответ @Kolink:
http://jsfiddle.net/X2mk8/2/
HTML:
<div id="output"></div>
<script id="yourDynamicGeneratedScript">
function test(n) {
$output = $("#output")
$output.append("test " + n + "<br/>")
}
test(1);
</script>
JavaScript:
$("script").remove();
// or $("#yourDynamicGeneratedScript").remove();
test(2);
test(3);
test(4);
function test(n) {
$output = $("#output")
$output.append("REDEFINED! " + n + "<br/>")
}
test(5);
test(6);
test(7);