Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Удалить <script> загруженный jqeru LOAD (https://javascript.ru/forum/jquery/35233-udalit-script-zagruzhennyjj-jqeru-load.html)

Nitro26 04.02.2013 18:40

Удалить <script> загруженный jqeru LOAD
 
Здравствуйте.
Есть проблема. Загружаю с помощью jqeru load div в котором находится <script>. После чего скрипта в диве нет, но он работает. Где он висит и как его удалить?

$("#fo_logo").load('../....../...../xxx.php',{},function(data){},'html');


содержимое php файла

echo <<<EOD
<div id="otvet">
	function xxx(){
		alert("1");
	}
</div>
EOD;


Вообще задача такая - необходимо с помощью jqeru load загрузить форму с скриптом js. После чего форму закрыть и удалить этот скрипт чтоб не висел.

Deff 04.02.2013 18:45

Цитата:

Сообщение от Nitro26
Вообще задача такая - необходимо с помощью jqeru load загрузить форму с скриптом js. После чего форму закрыть и удалить этот скрипт чтоб не висел.

На ссылку на скрипт глянуть можно ?

Nitro26 04.02.2013 18:53

$("#fo_logo").load('../xxx/owner/xxx.php',{},addd,'html');

Deff 04.02.2013 18:57

Nitro26,
Мне нужно реально на скрипт глянуть

Nitro26 04.02.2013 19:01

<?php
echo <<<EOD
<div id="otvet">
<script  id="sample">
$("#fo_add").click(function(){var scrt = document.getElementById('sample');
										alert(scrt);
										});
</script>
</div>
EOD;
?>

Deff 04.02.2013 19:06

$("#fo_add").click(function(){var scrt = document.getElementById('sample');
      alert(scrt);
});

Замените данный скрипт на такой:
$("#fo_add").bind('click',function(){
      var scrt = document.getElementById('sample');
      alert(scrt);
});

Тогда отключение будет выглядет так
<script>
$("#fo_add").ubind('click');
</script>

Nitro26 04.02.2013 19:10

Спасибо. Вот только интересно а если у меня там будет 10 или 20 событий назначено на разные элементы, это мне их придется все отключать? И еще хочется узнать где сам скрипт живет после load?

Deff 04.02.2013 19:13

Nitro26,
Отключать можно комбинированным селектором, через запятые
$("elem1,elem2, elem3, elem4").ubind('click');

Deff 04.02.2013 19:16

Цитата:

Сообщение от Nitro26
отключать? И еще хочется узнать где сам скрипт живет после load?

функции живут в памяти, простые строчные скрипты, чистятся через некоторое время из памяти
как работает .ubind с памятью - не выяснял, минималистически, - возможно заменяет функцию на пустую

Serg_pnz 05.02.2013 11:23

Deff,
ok, а если это он-лайн игрушка, с переходами по локациям, постоянным тырканием в инвентарь и т.д. Как чистить тогда? Или забить и сделать переходы с перезагрузкой страницы?

Deff 05.02.2013 11:36

Serg_pnz,
Ну есть две идеи:
1. Память периодически чистица сама "мусорщиком", большие объекты удалять принудительно через delete
2. Создавать динамический пустой iframe и выполнять основные деяния в нём(засовываем скрипты и необходимый контент внутрь), удаляя или пересоздавая новый фрейм для новых повторных действий
ассинхронный обмен с iframe удобно вести через LocalStorage + cобытие(к примеру программный клик кнопки

Serg_pnz 05.02.2013 15:44

Deff,
у меня при переходе по локациям контент внутри окна постоянно перезаписывается (подгружается динамически с полной заменой содержимого), правильно ли я думаю, что прежде, чем динамически подгрузить новый скрипт (и контент), надо найти все текущие элементы в контейнере и снести с них обработчики?

Deff 05.02.2013 17:40

Цитата:

Сообщение от Serg_pnz
у меня при переходе по локациям контент внутри окна постоянно перезаписывается (подгружается динамически с полной заменой содержимого), правильно ли я думаю, что прежде, чем динамически подгрузить новый скрипт (и контент), надо найти все текущие элементы в контейнере и снести с них обработчики?

Ну ежели ты удаляешь контент, обработчики ( не live) удаляются вместе с ним... ?

Serg_pnz 05.02.2013 18:03

Обработчики именно live ставлю, точнее
$(this).off().on()


А контент меняю
$('#globDIV').html(newcontent)


newcontent прилетает либо с json (тут расспихиваю контент, ставлю им обработчики), либо load (если скрипт заранее известен)

Deff 05.02.2013 18:33

Цитата:

Сообщение от Serg_pnz
тут расспихиваю контент, ставлю им обработчики)

Ню всё достаточно логично, наверно оставшаяся отладка в процессе завершения...

В принципе, я редко пользую новейшие библиотеки jQuery(нет доступа к движку) и работаю по старинке bind - ubind
Хотя имхо проще при переподгружаемом контенте и для автоудалении обработчика ставить типовые типо
$("Button").click(function () {

При изъятии или замене объекта даже на с тем же самым cелектором - обработчик автоудалится с изъятых и новых элементов с данным селектором
Вообщем такие вот варианты вместе с Вашими

Deff 05.02.2013 18:47

Цитата:

Сообщение от Serg_pnz
(подгружается динамически с полной заменой содержимого),

body.innerHTML = body.innerHTML удаляет обработчики( не live(или даже и live - забыл), Да, - нун тестировать скорость перерисовки body для конкретики, *у меня проекты текстовые с легкой графикой) - если я правильно понял высказывание про "с полной заменой "- то возможно можно сократить операции

Deff 05.02.2013 18:52

Цитата:

Сообщение от Deff (Сообщение 231807)
body.innerHTML = body.innerHTML удаляет обработчики( не live(или даже и live - забыл) - если я правильно понял высказывание про "с полной заменой "- то возможно можно сократить операции


Да, - нун тестировать скорость перерисовки body для конкретики, *у меня проекты текстовые с легкой графикой)

Serg_pnz 05.02.2013 20:35

Deff,
спасибо, спасибо, спасибо! Ну а плюсик "вобла" не дает поставить))

Я ж пишу за хобби, возможно скоро представлю игрушку в карты, но именно как самому хотелось: никаких перезагрузок, всё "по-правильному".

Serg_pnz 07.02.2013 11:02

И еще один способ стоит упомянуть - загрузить и сразу выполнить
$.getScript('js/room.js');

Deff 07.02.2013 12:50

Serg_pnz,
Ну без jQuery ранее, практически вызов всех обработчиков ставили в тег
А функция одна для всех Аякс подгрузок тегов с данным вызовом.
Сейчас часто впихивают контент скрипта в скрытый теxtаrеа на подгружаемой странице, затем создают новый элемент script и перезаписыват в body, предварительно всунув контент. (Обычно фунцией с именем и автозапуском, чтобы легко её удалить после отработки


Часовой пояс GMT +3, время: 11:19.