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

Удаляет ли 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?

Если да, есть ли способ очистить это?

4b9b3361

Ответ 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);