Есть некоторый код, подгруженный скажем тегом script в документе.
Происходит аджакс запрос, подгружается данные другой страницы, а с ней требуется еще и js кода обработчиков подгрузить, нужно избежать конфликтов этих обработчиков от предыдущего к следующему переходу (перезагрузки страницы не происходит, это аджакс — только частичная загрузка)
Как удалить код? Просто удалить из дерева документа script
Если да, есть ли какие-нибудь решения, что бы они как-нибудь сами удалялись по требованию, и загружались тоже, прямо в коде JS без работы с html, вроде include ну и наверное какой-нибудь unLoad.
Удалять js со страницы мне кажется очень странным костылем.
Пересекающийся код решается замыканиями. Пересекающиеся селекторы решаются префиксами (либо принудительным unbind).
А вообще это очень странная проблема, растущая, скорее, из неправильной организации кода на клиенте.
Спасибо unbind как раз то что надо, а переподписываться на новые обработчики оно будет каждый раз при определенном действии. Надеюсь я правильно вас понял.
Вот он, страх перед ужасным eval. Поражаюсь на какие извращения идут разработчики, что бы не использовать эту функцию.
Как это делается в вашем случаи:
— Вместо добавления тега script прогоняете, полученный с сервера, код через eval. По сути действия это одно и тоже, только eval быстрее.
— Разбиваете код скрипта на отдельные управляющие функции (с отдельными функциями включения/выключения нужной части кода).
— Передаёте с сервера только управляющие конструкции.
Да, JS-код можно загружать без конструкции eval, только работать это будет точно так же как eval. Быстрее eval выполнение кода производят только методы apply и call, но они требуют более сложной логики сервера.
Но суть не в скорости выполнения, не прозрачности кода, а логике приложения, которое получается в конце. Используя костыли, заменяющие eval, вы в итоге получаете нелогичный код с проблемами, как у автора вопроса. Используя eval можно, напротив, избавиться от лишних конструкций организовав прозрачную и простую связь между клиентом и сервером.
Кстати, вы категорически ошибаетесь на счёт скорости исполнения. Для кода в eval нету прокомпиляции и кучи других оптимизаций, потому он однозначно медленнее.
Не надо использовать костыли заменяющие eval и не надо использовать eval. Надо построить правильную архитектуру приложения.
И да, вас минусуют не потому что чего-то не понимают, а потому-что вы чего-то не понимаете.
TheShock, я знаю вашу позицию очень хорошо. Понятно дело, что в идеальном fullajax-приложении всё строится на методах call и apply, но это требует лишних заморочек с архитектурой сервера и клиента.
Я же рассуждаю чисто практически: пусть код пришедший с сервера выполняется в 4 раза медлее (пользователь всё равно не уловит эти 0.004 сек), но зато я могу просто отправлят управляющие конструкции, не заботясь об обёртках и передачи параметров.
«Для кода в eval нету прокомпиляции и кучи других оптимизаций, потому он однозначно медленнее»
— Зачем нужна прокомпиляция и оптимизация для управляющих команд?
Она не нужна. Вы путаете данную ситуацию с случаем использования «костылей», когда из-за «ломанной» логики приложения передаётся код функций.
может тогда уж не чистый eval а new Function([code])?
потом и удалить можно и область видимости будет ограничена, да и отработка будет по выполнении.
тогда и чистить мусор за собой можно.
Беда остается только в том, что помимо кода, еще мусора дофига останется. И если всё это оставить без контролируемой области — память забьется и не этим мусором. (Банально орда замыканий и в конце где-нить завязка на DOM элементе, из-за которого нельзя будет вызвать полное удаление из памяти фрагмента матрицы DOM элементов.)
Чтобы не было конфликтов, надо правильно писать яваскрипт-код. Чтобы в подгруженной через AJAX странице скрипты выполнялись, вроде бы достаточно ее вставить через $(frame).html(pageContent); jQuery сам найдет и выполнит скрипты.
api.jquery.com/delegate/ Советую ознакомиться. bind и unbind в вашем случае ужасный костыль, и я совсем не соверую его использовать и перейти на делегирование. Спасете себе нервы и код улучшите.