05.07.2013, 12:18
|
Профессор
|
|
Регистрация: 12.12.2012
Сообщений: 1,398
|
|
Утечка памяти
Вопросы:
1) Если мы удаляем элемент без jQuery, на котором был обработчик jQuery, то обработчик остается в памяти?
2) Удаляется ли обработчик если мы удаляем элемент с помощью jQuery?
3) Если обработчик записан в html в атрибуте, например, onclick надо ли мне как либо удалять обработчик, или при удалении элемента?
|
|
05.07.2013, 12:26
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
1) да
2) да
3) сборщик мусора сожрёт
|
|
05.07.2013, 12:46
|
Профессор
|
|
Регистрация: 12.12.2012
Сообщений: 1,398
|
|
Спасибо!
А если элемент уже удален, и обработчик остался, его можно как-то удалить (касательно вопроса 1)?
И если кто работал с апи опенлейрс, надо ли снимать обработчики при рендоре фич (создаю и удаляю с помощью апи)? (например у нас слой с 1000 объектов каждые 3 секунды 100 или 200 из них рендорятся. На всех есть события клика и наведения, надо ли их снимать перед удалением?)
И касательно второго вопроса: Если мы удаляем не напрямую элемент с обработчиком, а контейнер с кучей элементов в которых разные обработчики (с помощью jQuery), то он сначала снимет все обработчики у себя и у своих детей, или только у себя?
Если обработчик внутри большого объекта, то в памяти весь объект из-за замыкания?
Последний раз редактировалось tsigel, 05.07.2013 в 12:50.
|
|
05.07.2013, 15:37
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
Сообщение от tsigel
|
А если элемент уже удален, и обработчик остался, его можно как-то удалить (касательно вопроса 1)?
|
конечно. обработчик - обычный метод объекта. можно и вручную удалять.
только для начала надо найти именно ЭТОТ обработчик среди кучи других.
Сообщение от tsigel
|
На всех есть события клика и наведения, надо ли их снимать перед удалением?)
|
тогда лучше с использоваем делегирования событий вешать по одному обработчику на каждое событие на <body> и не париться с их удалением
Сообщение от tsigel
|
И касательно второго вопроса: Если мы удаляем не напрямую элемент с обработчиком, а контейнер с кучей элементов в которых разные обработчики (с помощью jQuery), то он сначала снимет все обработчики у себя и у своих детей, или только у себя?
|
вопрос интересный и требует ковыряния в исходниках jQuery. я не знаю ответа, но если вам интересно, могу дать ссылку на исходники
Сообщение от tsigel
|
Если обработчик внутри большого объекта, то в памяти весь объект из-за замыкания?
|
если обработчик может получить доступ к объекту, то да.
|
|
05.07.2013, 16:07
|
Профессор
|
|
Регистрация: 12.12.2012
Сообщений: 1,398
|
|
Сообщение от melky
|
вопрос интересный и требует ковыряния в исходниках jQuery. я не знаю ответа, но если вам интересно, могу дать ссылку на исходники
|
Если Вам не трудно, то пожалуйста скиньте ссылочку. Для меня это очень важно. Наш софт должен работать неделю непрерывно без перезагрузки страницы. Сейчас он падает за сутки.
Сообщение от melky
|
тогда лучше с использоваем делегирования событий вешать по одному обработчику на каждое событие на <body> и не париться с их удалением
|
Для клика я так и сделал (правда вешал на document), но как быть с hover? Он же будет проверять каждый элемент при наведении, а их тысячи..
|
|
05.07.2013, 16:11
|
Профессор
|
|
Регистрация: 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]])();
}
}
}
}
});
}
}
|
|
05.07.2013, 16:27
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
tsigel, делегирование событий уже встроено в jQuery. Смотри документацию (api.jquery.com)
|
|
05.07.2013, 16:29
|
Профессор
|
|
Регистрация: 12.12.2012
Сообщений: 1,398
|
|
danik.js,
Спасибо
|
|
05.07.2013, 16:38
|
Профессор
|
|
Регистрация: 12.12.2012
Сообщений: 1,398
|
|
Но если использовать вариант
.on(events, [selector], [data], handler)
то получается 5 обработчиков вместо одного. Чем это лучше?
У них же есть events-map, чтобы вешать на разные события разные обработчики, но нет selector-map, чтобы назначить выполнение разных функций в одном событии.
Последний раз редактировалось tsigel, 05.07.2013 в 16:40.
|
|
05.07.2013, 17:13
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Сообщение от tsigel
|
то получается 5 обработчиков вместо одного. Чем это лучше?
|
А, ну смотри сам. Замечу что к DOM-элементу (через addEventListener) в любом случае будет прикреплен только один обработчик. Так что тут только вопрос удобства.
|
|
|
|