Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Очистка памяти

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Anguis
Отправлено: 03 Апреля, 2015 - 22:26:34
Post Id



Частый гость


Покинул форум
Сообщений всего: 253
Дата рег-ции: Июнь 2012  


Помог: 2 раз(а)




Всем привет.
Пишу аджаксовый сайтик. Новый контент подгружается в основной дивчик, при этом бошка и ноги остаются неизменными. В процессе разработки столкнулся с проблемой тормознутости скриптов.
Проблема такая, на подгружающихся страницах пристуствуют всякие плагины jquery типа datepicker Slider ckeditor и проч, которые подгружаются вместе с новым содержимимым. Т.е. если новое содержимое - форма с выбором даты, то подгружается и инициализируется datepicker, если с редактором - ckeditor, а бывает что просто текст и ни чего не подгружается.
При первом заходе на страницу любой впервые вызванный плагин работает четко, но когда вызываешь сначала datepicker а потом ckeditor, а потом опять datepicker, то datepicker уже начинает глючить... а если после этого вызвать вновь и ckeditor то слайдер начинает тормозить, datepicker вываливается вовсе, ckeditor отображается через анус.
Собсно очевидно что имеет место перегрузка страницы скриптами, так как при аяксовой подгрузке они загружаются в браузер и не выгружаются, когда происходит вызов новой страницы (хотя содержимое динамического div ессно уничтожается), то получается один и тот-же скрипт вызывается несколько раз, хотя он уже был проинициализирован.
Собсно, как можно выгрузить плагины и скрипты и переинициализировать их каждый раз будто они вызываются впервые?

Вот есть мыслишка. Плагины все jQuery-вские что если при вызове нового контента делать всегда
а потом вновь подгружать jQuery и плагины страницы? Фактически jQuery в кеше браузера и как таковой подгрузки не произойдет просто переинициализация... В общем, подскажите направьте как лучше тут поступить..
(Добавление)
Но такой метод вроде не отвяжет события от кнопок, и события будут заново переинициализированы.. Т.е. обновление не полное.. Хотя с событиями не критично, но желательно...
 
 Top
caballero
Отправлено: 03 Апреля, 2015 - 22:43:13
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




а в чем смысл писать на аяксе чтобы выгребать кучу проблем?
Думаешь пользователям сайта не пофиг аякс там или нет.


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Anguis
Отправлено: 03 Апреля, 2015 - 22:46:24
Post Id



Частый гость


Покинул форум
Сообщений всего: 253
Дата рег-ции: Июнь 2012  


Помог: 2 раз(а)




caballero,
решение проблемы как всегда Превосходно
 
 Top
caballero
Отправлено: 03 Апреля, 2015 - 23:03:09
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




не решение проблемы а устранение проблемы которой вообще не должно было быть если бы ее не придумал разработчик.

вот сам подумай - какую великую задачу ты решаешь аяксом, да еще и в таких количествах что память проседает?


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
DeepVarvar Супермодератор
Отправлено: 03 Апреля, 2015 - 23:09:52
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Пфф, это писать уметь надо.
УМВР, еще и похлеще твоих датапикеров-цкэдиторов.

Кароч тебе надо подгрузить скрипты единожды в "бошке" и повесить бинд на события интересующих элементов.
А не возвращать разметку с тегами <script> в аякс ответе.
Кроме того - нахрена ты аяксом куски хтмл-гамна гоняешь? Сантехник чтоли?
Аяксом надо JSON гонять, а генерить разметку на клиенте.
 
 Top
Anguis
Отправлено: 03 Апреля, 2015 - 23:19:53
Post Id



Частый гость


Покинул форум
Сообщений всего: 253
Дата рег-ции: Июнь 2012  


Помог: 2 раз(а)




DeepVarvar, согласен про json. Но для генерирования html нужно еще обертку писать, а на это ну совсем нет времени..
Согласен и с "повесить в хеад". Думал в эту сторону, мысль такая - Вот произошло событие вызова нового контента, ckeditor проинициализировался на элемент textarea.editor как при вызове нового контента выгрузить ckeditor с элемента при том что мы не вкурсе вообще что у нас было загружено, ckeditor, datepicker или что-то еще..
Что касается тормознутости, то едитор и пикер я привел просто ради примера, в жизни гоняются куда более массивные вещи. В основном это собственные скрипты, обработчики событий, валидаторы и т.д.
 
 Top
DeepVarvar Супермодератор
Отправлено: 03 Апреля, 2015 - 23:36:25
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Anguis пишет:
обертку писать

CODE (javascript):
скопировать код в буфер обмена
  1.  
  2.     function compileTemplate(templateString)
  3.     {
  4.         templateString = templateString
  5.             // trim and compact
  6.             .replace(/(^\s+|\s+$)/g, '')
  7.             .replace(/\s+/g, ' ')
  8.             // interpolation
  9.             .replace(/\{\{=([\s\S]+?)\}\}/g, function(m, v) {
  10.                 return "'+(" + v + "||'')+'";
  11.             })
  12.             // conditional
  13.             .replace(/\{\{\?(\?)?\s*([\s\S]*?)\s*\}\}/g, function(m, elif, code) {
  14.                 return elif
  15.                     ? ( code ? "';}else if(" + code + "){out+='" : "';}else{out+='" )
  16.                     : ( code ? "';if(" + code + "){out+='" : "';}out+='" );
  17.             })
  18.             // evaluate
  19.             .replace(/\{\{([\s\S]+?(\}?)+)\}\}/g, function(m, code) {
  20.                 return "';" + code + "out+='";
  21.             });
  22.         try {
  23.             return new Function('it', "var out='" + templateString + "';return out;");
  24.         } catch (e) {
  25.             return function() {
  26.                 return 'Template is not compiled';
  27.             }
  28.         }
  29.     }

Пример шаблона:
CODE (html):
скопировать код в буфер обмена
  1.  
  2.     {{ for(var key in it.values) { }}
  3.         <option value="{{=key}}"{{? key == it.current_value }} selected="selected"{{?}}>{{=it.values[key]}}</option>
  4.     {{ } }}

Использование:
CODE (javascript):
скопировать код в буфер обмена
  1.  
  2. // скомпилить ОДИН РАЗ!
  3. var drawOptions = compileTemplate('строка шаблона указанная выше');
  4. // вызывать в любом месте сколько угодно раз
  5. $('select#xxx').html(drawOptions({
  6.     current_value: 'c',
  7.     values: {
  8.         a: 'AAA',
  9.         b: 'BBB',
  10.         c: 'CCC',
  11.         d: 'DDD'
  12.     }
  13. }));
 
 Top
Anguis
Отправлено: 03 Апреля, 2015 - 23:47:51
Post Id



Частый гость


Покинул форум
Сообщений всего: 253
Дата рег-ции: Июнь 2012  


Помог: 2 раз(а)




DeepVarvar, непонятно... шаблоны все сразу чтоли подгружать или вместе с json гонять?
(Добавление)
Вернусь таки к начальной теме.
Вот редактор при инициализации, неважно, загрузился ли он ajaxом или был сразу в хеаде, он создает не просто хтмл код редактора и все его события, но так же он и хранит объект себя, через который возможно взаимодействовать с редактором, там например :
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. var editor = $("#input").editor()[0];//так инициализируемся
  3. editor.updateFrame();//вызвали метод - обновили фрейм
  4.  

Вот тут объект сохраняется в переменной, но если не сделать присваивания, то объект все равно сохранится как свойство window и будет доступен через $("#input").editor()[0]
CODE (htmlphp):
скопировать код в буфер обмена
  1. $("#input").editor()[0].updateFrame();

Как уничтожить подобный объект? При том что мы не в курсе был ли он инициализирован при текущем запросе, или там был какой-то другой подобный объект и самое главное что мы не в курсе на какой элемент он был инициализирован..
(Добавление)
Вот нашел человек целую библиотеку замутил что бы эти траблы решить...
Очень не хочется еще и её подключат...ь
 
 Top
Anguis
Отправлено: 04 Апреля, 2015 - 12:18:28
Post Id



Частый гость


Покинул форум
Сообщений всего: 253
Дата рег-ции: Июнь 2012  


Помог: 2 раз(а)




Вот че накопал. Для тех кто еще озадачится сиим вопросом.
Очень хорошая либа, аля include и include_once
Чутка её модифицировав можно проверять, это первая загрузка файла, или он достается из кэша. Что очень полезно для инициализации необходимых объектов единожды
вот еще одна похожая либа правда, не такая грамотная как предидущая
Хабр
 
 Top
tuareg
Отправлено: 04 Апреля, 2015 - 13:28:20
Post Id


Участник


Покинул форум
Сообщений всего: 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 и проверять, если уже ранее грузились, то как-то их вырезать.
Как-то так ))
 
 Top
nerv
Отправлено: 04 Апреля, 2015 - 13:35:26
Post Id



Посетитель


Покинул форум
Сообщений всего: 407
Дата рег-ции: Февр. 2013  
Откуда: Россия


Помог: 9 раз(а)




DeepVarvar пишет:
CODE (javascript):

напомнило http://ejohn[dot]org/blog/javascript[dot][dot][dot]icro-templating/

Anguis, у плагинов есть (должны быть) конструкторы и деструкторы. Подумай об этом.


-----
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
 
 Top
Anguis
Отправлено: 04 Апреля, 2015 - 14:12:03
Post Id



Частый гость


Покинул форум
Сообщений всего: 253
Дата рег-ции: Июнь 2012  


Помог: 2 раз(а)




nerv, думал ессно. Но не у всех сторонних плагинов есть деструкторы. можно написать свою обертку с конструктором и деструктором, который будет загружать и выгружать плагины. И это вероятно самый верный выход. Но на это у меня времени нет пока. потом может озадачусь. Пока решил с помощью либы include с проверкой первого или не первого вызова..
 
 Top
DeepVarvar Супермодератор
Отправлено: 04 Апреля, 2015 - 17:18:54
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




nerv пишет:
напомнило
Это я из dot.js от Olado стибрил нужное и причесал. Там у неё код "страх и ненависть в лас-вегасе".
А в примере по твоей ссылке не кавайно - шаблон кажный раз компилится, у меня единожды и потом только данными его корми.
 
 Top
nerv
Отправлено: 05 Апреля, 2015 - 12:45:04
Post Id



Посетитель


Покинул форум
Сообщений всего: 407
Дата рег-ции: Февр. 2013  
Откуда: Россия


Помог: 9 раз(а)




DeepVarvar пишет:
А в примере по твоей ссылке не кавайно

это блог создателя jQuery Улыбка

DeepVarvar пишет:
шаблон кажный раз компилится

там кеш


-----
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« JavaScript & VBScript »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB