Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > JavaScript: Общие вопросы > Уничтожить обьект |
Автор: Kefir 27.4.2008, 15:53 | ||
В общем так. Есть класс Timeline (cделанный при помощи mootools). Это "временная прямая", на которой есть события. При каждом событии осуществляется fireEvent('onSwitch', eventId). Так вот, с определённой периодичностью скрипт обновляет расписание эвентов (получает Json от ПХП скрипта) - ф-ции запроса и обработки ответа следующие:
Как видите, всё просто с каждым ответом я создаю новый Timeline с обновлёнными switches (они же эвенты). Так вот проблема в том что я то новый таймлайн создаю, а старые где то там ещ остаются и тоже стреляют свои эвенты. Вопрос - что с ними сделать? delete this.timeline пробовал, this.timeline = null пробовал - не помогают. или нельзя стирать обьекты вообще? |
Автор: Itsys 27.4.2008, 17:11 |
Насколько я понимаю, для хранения и вызывания event-ов, используется какой-то конкретный объект в DOM модели, и присваивание ссылке на timeline null не удаляет этот объект, и, соответственно, надо в DOM отдельно заниматься удалением созданных при инициализации (new Timeline) объектов. ЗЫ Не смотрел библиотеку mootools, так что это только предположение. ЗЗЫ Посмотри, может они предусмотрели функцию-дестроер объекта, которую можно вызвать как-то так: this.timeline.destroy(); |
Автор: SelenIT 27.4.2008, 22:07 |
Если я верно понимаю, "расписание" это фактически устанавливает массив таймаутов? Тогда перед обnullением объекта надо бы пройтись по этим таймаутам и отclearTimeoutить их... |
Автор: Itsys 27.4.2008, 22:18 |
Будет фигово, если это вообще не массив, а просто задание таймаутов без внесения их в массив, тогда их фиг уберешь. ![]() Kefir, вообще надо смотреть, что присходит при инициализации объекта Timeline. |
Автор: Kefir 27.4.2008, 23:28 |
SelenIT, почти. на каждом эвенте ставится таймаут на следующий эвент, дабы не ставить много таймаутов. только суть вопроса не в этом - я понимаю, что JS - язык странный и не похожий на другие, но вот скажите - есть у меня обьект, у него свои переменные, свои эвенты какие то, на эти эвенты подписываются другие объекты. так вот вопрос - можно ли как то элиминировать этот обьект? я не спрашиваю можно ли сделать clearTimeout для каждого setTimeout - я и так знаю что это можно сделать. я спрашиваю есть ли способ полностью удалить / уничтожить / сжечь / трансклюкировать обьект (переменную)? это было первое что я проверил В) |
Автор: Itsys 27.4.2008, 23:45 |
Это не язык странный, а работа с объектами у него такая - при обнулении объекта - ты уничтожаешь все его внутренние переменные, но setTimeout запускается и исполняется не внутри объекта, а в глобальной области, в объекте хранится только ссылка на переменную (если вообще хранится), которая "уничтожает" setTimeout с помошью функции clearTimeout, при обнулении этой переменной остановка setTimeout не проиходит - поэтому единственный способ его остановить - это перед обнулением объекта послать команду на остановку. Тоже самое происходит при создании элементов внутри объекта, например функцией createElement, и добавлении их в DOM. |
Автор: MoZy 1.5.2008, 20:47 |
Может при обнулении диструктор вызывается? |