[Greasemonkey] Re: Memory Leaks
Andre
gm at andrecgn.de
Wed Nov 9 16:26:31 EST 2005
Jeremy,
is 'unload' an event in FF 1.5? I am still on 1.0.7. *blush* I can hook
the event, but it never fires ...
Andre
----- Original Message -----
From: Andre <gm at andrecgn.de>
Sent: Mittwoch, 9. November 2005 15:46:20
Subject: Memory Leaks
> wow, thanks!!! I should have known there is an unload event. I was
> actually searching for the list of events that you (or somebody here on
> the list) had sent around a couple of weeks ago but it was under some
> other heading.
>
> My list is static, so it is easy.
>
> Thanks, again,
> Andre
>
> ----- Original Message -----
> From: Jeremy Dunck <jdunck at gmail.com>
> Sent: Mittwoch, 9. November 2005 15:36:14
> Subject: Memory Leaks
>
>> On 11/9/05, Andre <gm at andrecgn.de> wrote:
>>
>>> Hi,
>>>
>>> you are right. I add several event listeners for a newly created button.
>>> It is a div with:
>>>
>>> var trigger = document.createElement("div");
>>> trigger.addEventListener("mouseover", eh_onmouseover, false);
>>> trigger.addEventListener("mouseout", eh_onmouseout, false);
>>> trigger.addEventListener("click", eh_onclick, false);
>>>
>>> How would I remove them? The refresh is done by the page, not by my
>>> code.
>>
>>
>>
>> Assuming the handlers are closures over content, this is the bug in moz:
>> https://bugzilla.mozilla.org/show_bug.cgi?id=241518
>>
>> Note that it doesn't block 1.5, but it is being actively worked.
>>
>> As for how to unhook them, assuming your list is static, do something
>> like this:
>>
>> body.addEventListener("unload", unhooker, false);
>>
>> function unhook() {
>> //get a ref to your hooked elm;
>> trigger.removeEventListener("mouseover", eh_onmouseover, false);
>> trigger.removeEventListener("mouseout", eh_onmouseout, false);
>> trigger.removeEventListener("click", eh_onclick, false);
>> }
>>
>> If you hooked list is dynamic, stuff gets more complicated. You'll
>> need to keep your own list list of all event hooks.
>>
>> var hookers = {}
>>
>> function myAddEventListener(obj,ev,handler,cap) {
>> obj.addEventListener(ev, handler, cap);
>> hookers.append( { obj:obj,ev:ev,handler:handler,cap:cap} );
>> }
>>
>> //use that instead of obj.addEventListener.
>>
>> then define unhook like:
>> function unhook() {
>> for (hooker in hookers) {
>> hooker.obj.removeEventListener(hooker.ev, hooker.handler,
>> hooker.cap);
>> }
>> }
>>
>> and hook body.unload as before.
More information about the Greasemonkey
mailing list