LINUX.ORG.RU

[jQuery] Удалить скрипт из DOM полностью, в т.ч. из памяти

 


0

0

Всем привет! Есть такая ситуация: одна главная страница, на ней несколько ссылок. При клике на одну из этих ссылок с помощью load асинхронно подгружается соответствующая страничка в div на главной странице. Дочерние страницы используют очень большое количество различных скриптов, причем при подгрузке новой страницы эти скрипты остаются в памяти и в связи с их спецификой (они предназначены для обработки событий элементов с одинаковым классом в зависимости от контекста подгруженной страницы) начинают конфликтовать друг с другом. Можно ли каждый раз при подгрузке новой страницы очищать DOM от элементов script, причем так, чтобы они не оставались в памяти? remove() не подходит, empty() тоже.

заменить load на get, полученная страница будет в переменной, а не сразу загружена в DOM, отфильтруешь все лишнее и только тогда вставишь в DOM

sdio ★★★★★
()
Ответ на: комментарий от sdio

Проблема просто в том, что скрипты, которые я вставляю в DOM, необходимо будет заменять при загрузке новой страницы. Например, на одной странице обработчик клика на ссылке будет выглядеть так: $('a.glink').click(function(){ alert(«1»); }); а на другой странице $('a.glink').click(function(){ alert(«2»); }); То есть логика у этих скриптов разная, а их контекст зависит от страницы, которая их подгружает. Просто здесь get не поможет, потому что нужно будет заменить УЖЕ присутствующий в DOM скрипт.

eternity
() автор топика
Ответ на: комментарий от eternity

function loadScripts(id,scrCode) {
   var head = document.getElementsByTagName(«head»).item(0);
   if ($(«dynamic_script_»+id)!=undefined) {
      head.removeChild($(«dynamic_script_»+id));
      }
   scrHandle = document.createElement(«script»);
   scrHandle.type = «text/javascript»;
   scrHandle.id = «dynamic_script_»+id;
   scrHandle.text = scrCode;
   try { void(head.appendChild(scrHandle)); }
   catch (e) { alert(e) }
   }

anonymous
()
Ответ на: комментарий от anonymous

Кстати да, хорошая мысль, буду пробовать, большое всем спасибо.

eternity
() автор топика
Ответ на: комментарий от eternity

>Проблема просто в том, что скрипты, которые я вставляю в DOM, необходимо будет заменять при загрузке новой страницы. Например, на одной странице обработчик клика на ссылке будет выглядеть так: $('a.glink').click(function(){ alert(«1»); }); а на другой странице $('a.glink').click(function(){ alert(«2»); }); То есть логика у этих скриптов разная, а их контекст зависит от страницы, которая их подгружает. Просто здесь get не поможет, потому что нужно будет заменить УЖЕ присутствующий в DOM скрипт.

К слову, может это поможет, на элементы, созданные в процессе работы старые биндинги не распространяются (если не использовать jquery live).

anonymous
()
Ответ на: комментарий от anonymous

Да, отлично, это работает. Как оказалось, кроме скриптов конфликтовали еще и виджеты ui-dialog. Надо было отслеживать еще и их своевременное удаление.

eternity
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.