I think a lot of plugins have this problem but most people aren't
creating and deleting them a lot. My splitter has this issue but I
solved that problem because I was too lazy to support splitters being
destroyed. See, the real problem is that you have a "destroy"
option!  :-)

Since $this and other vars like $cluetip are being used within several
of the event handlers by closure, the jQuery (and DOM) objects they
contain are kept alive. You can't delete or null them out because
they're used while the cluetip is active. Those handlers would need to
be rewritten to use the local "this" instead and I think the handlers
need to be declared outside the .each() function scope. You'd have to
do the same with all the other cached variables like $cluetip as well.
In addition to destroy detaching all the event handlers, it should
remove any .data() or .metadata() that was put onto the element. The
jQuery UI widgets have a destroy pattern, you can see how they do it.

I also see a leak like the one discussed here:

http://groups.google.com/group/jquery-dev/browse_frm/thread/2b1981f7530dedde#

If you use any "modifying" operation in a chain and save the later
part of the chain in a variable, the older part of the chain is still
referenced by jQuery's .prevObject property. I can see some of those
in the cluetip plugin:

 $dropShadow = $([]);
 for (var i=0; i < dropShadowSteps; i++) {
   $dropShadow = $dropShadow.add($('<div></div>').css({zIndex:
cluezIndex-1, opacity:.1, top: 1+i, left: 1+i}));
 };

The .add() method creates a new object each time through the loop but
the older objects are retained as a chain of .prevObject properties
leading from the jQuery object held by the final $dropShadow variable.
As long as the $dropShadow variable goes out of scope when the
function is done at the end of the .each() call to that function, it
should be reclaimed. At the moment $dropShadow is kept alive by the
cluetipshow event handler so the whole chain can't be garbage
collected.

Reply via email to