Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Утечка памяти (https://javascript.ru/forum/misc/39602-utechka-pamyati.html)

tsigel 05.07.2013 12:18

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

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

3) Если обработчик записан в html в атрибуте, например, onclick надо ли мне как либо удалять обработчик, или при удалении элемента?

melky 05.07.2013 12:26

1) да
2) да
3) сборщик мусора сожрёт

tsigel 05.07.2013 12:46

Спасибо!

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

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

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

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

melky 05.07.2013 15:37

Цитата:

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

конечно. обработчик - обычный метод объекта. можно и вручную удалять.
только для начала надо найти именно ЭТОТ обработчик среди кучи других.

Цитата:

Сообщение от tsigel
На всех есть события клика и наведения, надо ли их снимать перед удалением?)

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

Цитата:

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

вопрос интересный и требует ковыряния в исходниках jQuery. я не знаю ответа, но если вам интересно, могу дать ссылку на исходники

Цитата:

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

если обработчик может получить доступ к объекту, то да.

tsigel 05.07.2013 16:07

Цитата:

Сообщение от melky
вопрос интересный и требует ковыряния в исходниках jQuery. я не знаю ответа, но если вам интересно, могу дать ссылку на исходники

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


Цитата:

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

Для клика я так и сделал (правда вешал на document), но как быть с hover? Он же будет проверять каждый элемент при наведении, а их тысячи..

tsigel 05.07.2013 16:11

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

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]])();
                        }
                    }
                }

            }
        });
    }
}

danik.js 05.07.2013 16:27

tsigel, делегирование событий уже встроено в jQuery. Смотри документацию (api.jquery.com)

tsigel 05.07.2013 16:29

danik.js,
Спасибо

tsigel 05.07.2013 16:38

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

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

danik.js 05.07.2013 17:13

Цитата:

Сообщение от tsigel
то получается 5 обработчиков вместо одного. Чем это лучше?

А, ну смотри сам. Замечу что к DOM-элементу (через addEventListener) в любом случае будет прикреплен только один обработчик. Так что тут только вопрос удобства.


Часовой пояс GMT +3, время: 03:43.