Покинул форум
Сообщений всего: 253
Дата рег-ции: Июнь 2012
Помог: 2 раз(а)
Всем привет.
Пишу аджаксовый сайтик. Новый контент подгружается в основной дивчик, при этом бошка и ноги остаются неизменными. В процессе разработки столкнулся с проблемой тормознутости скриптов.
Проблема такая, на подгружающихся страницах пристуствуют всякие плагины jquery типа datepicker Slider ckeditor и проч, которые подгружаются вместе с новым содержимимым. Т.е. если новое содержимое - форма с выбором даты, то подгружается и инициализируется datepicker, если с редактором - ckeditor, а бывает что просто текст и ни чего не подгружается.
При первом заходе на страницу любой впервые вызванный плагин работает четко, но когда вызываешь сначала datepicker а потом ckeditor, а потом опять datepicker, то datepicker уже начинает глючить... а если после этого вызвать вновь и ckeditor то слайдер начинает тормозить, datepicker вываливается вовсе, ckeditor отображается через анус.
Собсно очевидно что имеет место перегрузка страницы скриптами, так как при аяксовой подгрузке они загружаются в браузер и не выгружаются, когда происходит вызов новой страницы (хотя содержимое динамического div ессно уничтожается), то получается один и тот-же скрипт вызывается несколько раз, хотя он уже был проинициализирован.
Собсно, как можно выгрузить плагины и скрипты и переинициализировать их каждый раз будто они вызываются впервые?
Вот есть мыслишка. Плагины все jQuery-вские что если при вызове нового контента делать всегда
а потом вновь подгружать jQuery и плагины страницы? Фактически jQuery в кеше браузера и как таковой подгрузки не произойдет просто переинициализация... В общем, подскажите направьте как лучше тут поступить.. (Добавление)
Но такой метод вроде не отвяжет события от кнопок, и события будут заново переинициализированы.. Т.е. обновление не полное.. Хотя с событиями не критично, но желательно...
caballero
Отправлено: 03 Апреля, 2015 - 22:43:13
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
а в чем смысл писать на аяксе чтобы выгребать кучу проблем?
Думаешь пользователям сайта не пофиг аякс там или нет.
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
Пфф, это писать уметь надо.
УМВР, еще и похлеще твоих датапикеров-цкэдиторов.
Кароч тебе надо подгрузить скрипты единожды в "бошке" и повесить бинд на события интересующих элементов.
А не возвращать разметку с тегами <script> в аякс ответе.
Кроме того - нахрена ты аяксом куски хтмл-гамна гоняешь? Сантехник чтоли?
Аяксом надо JSON гонять, а генерить разметку на клиенте.
Покинул форум
Сообщений всего: 253
Дата рег-ции: Июнь 2012
Помог: 2 раз(а)
DeepVarvar, согласен про json. Но для генерирования html нужно еще обертку писать, а на это ну совсем нет времени..
Согласен и с "повесить в хеад". Думал в эту сторону, мысль такая - Вот произошло событие вызова нового контента, ckeditor проинициализировался на элемент textarea.editor как при вызове нового контента выгрузить ckeditor с элемента при том что мы не вкурсе вообще что у нас было загружено, ckeditor, datepicker или что-то еще..
Что касается тормознутости, то едитор и пикер я привел просто ради примера, в жизни гоняются куда более массивные вещи. В основном это собственные скрипты, обработчики событий, валидаторы и т.д.
DeepVarvar
Отправлено: 03 Апреля, 2015 - 23:36:25
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Покинул форум
Сообщений всего: 253
Дата рег-ции: Июнь 2012
Помог: 2 раз(а)
DeepVarvar, непонятно... шаблоны все сразу чтоли подгружать или вместе с json гонять? (Добавление)
Вернусь таки к начальной теме.
Вот редактор при инициализации, неважно, загрузился ли он ajaxом или был сразу в хеаде, он создает не просто хтмл код редактора и все его события, но так же он и хранит объект себя, через который возможно взаимодействовать с редактором, там например :
var editor = $("#input").editor()[0];//так инициализируемся
editor.updateFrame();//вызвали метод - обновили фрейм
Вот тут объект сохраняется в переменной, но если не сделать присваивания, то объект все равно сохранится как свойство window и будет доступен через $("#input").editor()[0]
Как уничтожить подобный объект? При том что мы не в курсе был ли он инициализирован при текущем запросе, или там был какой-то другой подобный объект и самое главное что мы не в курсе на какой элемент он был инициализирован.. (Добавление)
Вот нашел человек целую библиотеку замутил что бы эти траблы решить...
Очень не хочется еще и её подключат...ь
Anguis
Отправлено: 04 Апреля, 2015 - 12:18:28
Частый гость
Покинул форум
Сообщений всего: 253
Дата рег-ции: Июнь 2012
Помог: 2 раз(а)
Вот че накопал. Для тех кто еще озадачится сиим вопросом. Очень хорошая либа, аля include и include_once
Чутка её модифицировав можно проверять, это первая загрузка файла, или он достается из кэша. Что очень полезно для инициализации необходимых объектов единожды вот еще одна похожая либа правда, не такая грамотная как предидущая Хабр
tuareg
Отправлено: 04 Апреля, 2015 - 13:28:20
Участник
Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010
Помог: 69 раз(а)
А это чем не устроило? http://learn[dot]jquery[dot]com/code-org[dot][dot][dot]erreds/examples/
Но это не решит проблему.
Просто логика такая:
1 загрузка(подгрузка) пришел html в нем <script src="1.js" /> Он выполнится.
2 подгрузка html в нем <script src="1.js" /> Он снова выполнится.
Выход:
Сначала создать глобальный массив(см ссылку)
при получении ответа, искать теги script и проверять, если уже ранее грузились, то как-то их вырезать.
Как-то так ))
nerv
Отправлено: 04 Апреля, 2015 - 13:35:26
Посетитель
Покинул форум
Сообщений всего: 407
Дата рег-ции: Февр. 2013 Откуда: Россия
Anguis, у плагинов есть (должны быть) конструкторы и деструкторы. Подумай об этом.
----- Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Anguis
Отправлено: 04 Апреля, 2015 - 14:12:03
Частый гость
Покинул форум
Сообщений всего: 253
Дата рег-ции: Июнь 2012
Помог: 2 раз(а)
nerv, думал ессно. Но не у всех сторонних плагинов есть деструкторы. можно написать свою обертку с конструктором и деструктором, который будет загружать и выгружать плагины. И это вероятно самый верный выход. Но на это у меня времени нет пока. потом может озадачусь. Пока решил с помощью либы include с проверкой первого или не первого вызова..
DeepVarvar
Отправлено: 04 Апреля, 2015 - 17:18:54
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
nerv пишет:
напомнило
Это я из dot.js от Olado стибрил нужное и причесал. Там у неё код "страх и ненависть в лас-вегасе".
А в примере по твоей ссылке не кавайно - шаблон кажный раз компилится, у меня единожды и потом только данными его корми.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.