Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 05.07.2013, 12:18
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Утечка памяти
Вопросы:
1) Если мы удаляем элемент без jQuery, на котором был обработчик jQuery, то обработчик остается в памяти?

2) Удаляется ли обработчик если мы удаляем элемент с помощью jQuery?

3) Если обработчик записан в html в атрибуте, например, onclick надо ли мне как либо удалять обработчик, или при удалении элемента?
Ответить с цитированием
  #2 (permalink)  
Старый 05.07.2013, 12:26
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

1) да
2) да
3) сборщик мусора сожрёт
Ответить с цитированием
  #3 (permalink)  
Старый 05.07.2013, 12:46
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Спасибо!

А если элемент уже удален, и обработчик остался, его можно как-то удалить (касательно вопроса 1)?

И если кто работал с апи опенлейрс, надо ли снимать обработчики при рендоре фич (создаю и удаляю с помощью апи)? (например у нас слой с 1000 объектов каждые 3 секунды 100 или 200 из них рендорятся. На всех есть события клика и наведения, надо ли их снимать перед удалением?)

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

Если обработчик внутри большого объекта, то в памяти весь объект из-за замыкания?

Последний раз редактировалось tsigel, 05.07.2013 в 12:50.
Ответить с цитированием
  #4 (permalink)  
Старый 05.07.2013, 15:37
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от tsigel
А если элемент уже удален, и обработчик остался, его можно как-то удалить (касательно вопроса 1)?
конечно. обработчик - обычный метод объекта. можно и вручную удалять.
только для начала надо найти именно ЭТОТ обработчик среди кучи других.

Сообщение от tsigel
На всех есть события клика и наведения, надо ли их снимать перед удалением?)
тогда лучше с использоваем делегирования событий вешать по одному обработчику на каждое событие на <body> и не париться с их удалением

Сообщение от tsigel
И касательно второго вопроса: Если мы удаляем не напрямую элемент с обработчиком, а контейнер с кучей элементов в которых разные обработчики (с помощью jQuery), то он сначала снимет все обработчики у себя и у своих детей, или только у себя?
вопрос интересный и требует ковыряния в исходниках jQuery. я не знаю ответа, но если вам интересно, могу дать ссылку на исходники

Сообщение от tsigel
Если обработчик внутри большого объекта, то в памяти весь объект из-за замыкания?
если обработчик может получить доступ к объекту, то да.
Ответить с цитированием
  #5 (permalink)  
Старый 05.07.2013, 16:07
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Сообщение от melky
вопрос интересный и требует ковыряния в исходниках jQuery. я не знаю ответа, но если вам интересно, могу дать ссылку на исходники
Если Вам не трудно, то пожалуйста скиньте ссылочку. Для меня это очень важно. Наш софт должен работать неделю непрерывно без перезагрузки страницы. Сейчас он падает за сутки.


Сообщение от melky
тогда лучше с использоваем делегирования событий вешать по одному обработчику на каждое событие на <body> и не париться с их удалением
Для клика я так и сделал (правда вешал на document), но как быть с hover? Он же будет проверять каждый элемент при наведении, а их тысячи..
Ответить с цитированием
  #6 (permalink)  
Старый 05.07.2013, 16:11
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Как я назначаю события на клик:

var Handlers = {
    /**
     * Объект, ключи в котором - названия классов, в которых необходимо запускать события,
     * а значение - функция, которую надо выполнить
     */
    handlersData: {
        showModalWindow: showBlock,
        addServerTsoo: editServerTsooAdd,
        slideFadeGo: SlideFadeInit,
        eventFormyliarToggleTextSlide: eventFormyliarToggleTextSlide,
        turn: turnClick
    },
    /**
     * Вешаем общее событие на document
     */
    setHandlers: function () {
        var $ = $j;
        var that = this;
        $(document).on({
            'click': function (e) {
                var _class = event.target.className;

                if (_class != undefined) {
                    if (typeof _class == "string") {
                        var classArray = _class.split(' ');
                        for (var i in classArray) {
                            if (that.handlersData[classArray[i]] != undefined)
                                (that.handlersData[classArray[i]])();
                        }
                    }
                }

            }
        });
    }
}
Ответить с цитированием
  #7 (permalink)  
Старый 05.07.2013, 16:27
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

tsigel, делегирование событий уже встроено в jQuery. Смотри документацию (api.jquery.com)
Ответить с цитированием
  #8 (permalink)  
Старый 05.07.2013, 16:29
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

danik.js,
Спасибо
Ответить с цитированием
  #9 (permalink)  
Старый 05.07.2013, 16:38
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Но если использовать вариант
.on(events, [selector], [data], handler)
то получается 5 обработчиков вместо одного. Чем это лучше?

У них же есть events-map, чтобы вешать на разные события разные обработчики, но нет selector-map, чтобы назначить выполнение разных функций в одном событии.

Последний раз редактировалось tsigel, 05.07.2013 в 16:40.
Ответить с цитированием
  #10 (permalink)  
Старый 05.07.2013, 17:13
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от tsigel
то получается 5 обработчиков вместо одного. Чем это лучше?
А, ну смотри сам. Замечу что к DOM-элементу (через addEventListener) в любом случае будет прикреплен только один обработчик. Так что тут только вопрос удобства.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Утечка памяти и борьба новым способом) KupueIIIKo Элементы интерфейса 6 03.08.2012 11:55
утечка памяти и window.open Vovan222 Events/DOM/Window 2 27.12.2010 19:19
утечка памяти. $.post otvernu jQuery 16 17.08.2010 12:40
утечка памяти при создании DOM MadLord Общие вопросы Javascript 2 16.08.2010 12:01
Как происходит утечка памяти в даном случае? Yazla Общие вопросы Javascript 2 09.11.2009 13:02