в первую очередь.что?это не имеет смысла:
var event = $('foobar').addEvent('click', function() {
alert(1);
});
это не сохраняет событие в локальную переменную, как вы, кажется, думаете.он сохраняет ссылку на foobar element object
в переменную event
- большинство методов элемента mootools возвращают this
для объединения в цепочку, которое является самим элементом, а не результатом метода (если это не метод получения, подобный '.getStyle').
это зависит от того, как вы избавитесь от элемента, что произойдет дальше.во-первых, element.destroy
, найденный здесь: https://github.com/mootools/mootools-core/blob/master/Source/Element/Element.js#L728
он удалит элемент из памяти и из памяти и очистит его безопасным способом.после очистки он будет зависеть от GC браузера, mootools не сделает для вас никакого впечатляющего GC для самого элемента, но он также выполняет специальную функцию clean
на дочерних узлах: var children = clean(this).getElementsByTagName('*');
.
метод clean также избавляет от любых обработчиков событий и хранилищ, прикрепленных к дочерним элементам div.
ТО.события, добавленные mootools, попадают в хранилище элементов.Хранение элемента находится в объекте за замыканием, которое использует элемент proto.Чтобы протестировать его, мы повторно реализуем его и сделаем его пунктируемым (глобальный объект, называемый хранилищем), чтобы мы могли проверить, что происходит со ссылкой после того, как родительский элемент пропал:
http://jsfiddle.net/dimitar/DQ8JU/
(function() {
var storage = this.storage = {}; // make it puncturable
var get = function(uid){
return (storage[uid] || (storage[uid] = {}));
};
Element.implement({
retrieve: function(property, dflt){
var storage = get($uid(this)), prop = storage[property];
if (dflt != null && prop == null) prop = storage[property] = dflt;
return prop != null ? prop : null;
},
store: function(property, value){
var storage = get($uid(this));
storage[property] = value;
return this;
},
eliminate: function(property){
var storage = get($uid(this));
delete storage[property];
return this;
}
});
})();
// read it.
var link = document.getElement("a");
var uid = link.uid; // will reference the mootools unique id for it
// add an event handler
link.addEvent("click", function(e) {
console.log("hi");
this.destroy();
// see what's left in storage for that element.
console.log(storage[uid]);
// storage should be empty.
console.log(storage);
});
link.getFirst().addEvent("mouseenter", function() {
console.log("over");
});
// check to see if it is there via element storage API.
console.log(link.retrieve("events").click);
// check to see if it's there via our puncture
console.log(this.storage[uid]);
// see all events in storage, inc child element:
console.info(this.storage);
Все это доказывает, что mootools убирает все, что вам нужно.до тех пор, пока вы не используете встроенные элементы onclick=
для элементов, с которыми вы работаете, все будет хорошо.Между сборкой мусора в mootools и браузером вы хорошо защищены.просто знайте, что вы можете сложить несколько событий на одном элементе, если обратные вызовы являются анонимными.