A: 

"use a different browser!!1"

But seriously, dig into the debug version of jquery, pull out firebug, and debug line for line.

Janie
Which version of Firebug works on IE6?
Kevin Panko
Firebug lite: getfirebug.com/lite/ie.html
voyager
A: 

The best debugger available for IE6 is Visual Studio. (Even the free edition will work.) As Janie mentions, if your problem is only happening on IE6 you'll want to debug on IE6, paying special attention to code that only runs there.

DDaviesBrackett
I'm not sure why we can assume the problem is with IE-specific code in jquery... This is a browser flaw that jquery will need to work around but currently doesn't.
Michael Haren
good point. That was what I'd intended; I guess it wasn't clear.
DDaviesBrackett
+2  A: 

This problem is either in a IE6-only part of jQuery, or in a general part of jQuery that is lacking IE6 especific code (as noted in the comments). Either way, it's still a bug in jQuery that needs addressing. about:blank You'll either have to dig yourself into jQuery or file a bug ticket. If you manage to fix it, don't forget to attach a diff to the bugtracker, so the project gets a little bit better. ;)

If I get some spare time, I'll try to help you with this.

Edit

Ok, so the problem seems unsurmountable.

The leak you are facing is an IE 6 SP 0 only problem, a leak caused by IE's approach to DOM. Doesn't matter what JS framework you use, it refuses to work correctly.

So, your current options are:

  • Die trying to get your users to upgrade IE 6 to a newer version/Service Pack,
  • Die (as in leak) in IE (loosing customers) or
  • Die trying to work on IE.

But that doesn't necesarily means you can't work this out. What about just trying to side pass the wole thing?

Show every non IE 6 SP 0 user the jQuery datepicker, and only IE 6 SP 0 another more resilient (and probably basic) datepicker with IE's conditional comments. This way you can keep the eye candy/functionality in your software, and allow IE 6 users to have the same basic functionality.

It might not be such a clean option, but you'd still be able to use what you want, and IE6 will still be able to work without leaking.

The only problem will be that you'll have a bigger burden, by having to degug two distinct datepickers. But you'll have to debug IE 6 anyway so, it may be your best bet at the moment.

voyager
Thanks for the suggestion. Filed: http://dev.jqueryui.com/ticket/4644
Michael Haren
I'm not sure why we can assume the problem is with IE-specific code in jquery... This is a browser flaw that jquery will need to work around but currently doesn't.
Michael Haren
Of course it is a IE flaw, but that's the reason that one uses JQuery on the first place. I don't want to seem ungrateful but it's still a bug in JQuery. It may be an IE bug impossible to fix with javascript, but it's still a problem for JQuery and JQuery users. Personally, I'd love to see IE6 dye a painfull, slow, messy and bloody death.
voyager
I think you misunderstood me. You said it's most likely a problem with jquery's *IE-specific* code. I'm saying that we have no reason to assume that. I bet instead that it's actually IE's crummy garbage collector choking on code that works fine with most other browsers
Michael Haren
to echo Michael, it's most likely not in any existing IE-specific code, but instead in the fact that there _should_be_ some IE6-specific code which isn't currently there...
Stobor
+1  A: 

The problem with IE 6 is that it has two garbage collectors. One for JavaScript and one for the DOM. So for example if you attach a function to a DOM event and then delete the DOM element the function will still exist in memory.

Check out this slide show. It's a bit tongue in cheek but it's good information.

They fixed this issue in IE 7. I tried your page in IE8 in windows 7 and I'm not seeing a memory leak.

gradbot
very interesting to know - is this across all versions of IE?
dplante
I'm not sure let me dig a bit on google. I know it's the case with IE 6.
gradbot
Looks like they fixed it in IE 7. I'll update my answer. http://www.quirksmode.org/blog/archives/2006/04/ie_7_and_javasc.html
gradbot
I'm sorry gradbot, bit this doesn't really help me.
Michael Haren
I'll have to take a stab at it when I get some free time this weekend. I've been burning my free time with Project Euler problems as of late.
gradbot
+2  A: 

try deleting these objects after destroying the datepicker object:

$.datepicker = null;
$.fn.datepicker = null;
djspark
@Michael Haren: can you try adding this into your window.unload handler from update 4?
Stobor
I will try that
Michael Haren
Sorry, it still leaks. It might be slightly slower, but it still leaks 500-1000kb per refresh. Thanks for the suggestion, though.
Michael Haren
This won't stop the leak because it is the HTML content dynamically added to the DOM that isn't being collected when the page refreshes.
Keith
A: 

Can you try this demo here. It uses the same method as dojo implements to remove elements from the dom. Some quick testing it seems to ease the leaks, not fully but much better.

UPDATE After spending a little time on this I am convinced it is nothing to do with the datepicker itself.

My tests show that by just reloading a dummy page every 1 second sees ie leaking memory. If you then include jquery on this page the leaks increase slightly (overhead of parsing the script) If you then add jquery-ui into the mix then again there is another slight increase in memory leakage.

To prove this if you avoid reloading the page and instead have a button that just adds an input, creates the datepicker on it then removes it, you see very little if any leaks.

redsquare
Running my test page without binding the datepicker **does not leak**. Memory usage goes up a little but levels off. Once I add the .datepicker() line, it leaks like crazy.
Michael Haren
+14  A: 

I hate to say this, your approach is correct and professional, but I'd be tempted to just leave it.

The consequences of not fixing this is that IE6 users will notice their machine getting slower and slower and ultimately either crashing completely or more likely crashing IE6.

So what?

Really - why is this your problem?

Yours definitely won't be the only site they visit with this leak, and they will see IE6 crash regularly regardless of what you do, because that's what it does.

It's unlikely that anyone still on IE6 could even point out your application as one that leaks.

Finally when IE6 does crash it reports IE6 as the culprit - you can legitimately point out that this is a bug in IE6 that Microsoft have fixed in a new release.

Your expensive time is better spent on improving the application for the users not trapped in legacy hell - your app should basically work for IE6 users, but this sort of issue can suck away all of your time and not fix their problem. IE6 is still going to be an unsupported, crash ridden, security hole of a browser.

I suspect the jQuery devs take a similar view to me. Also you have to do some really ugly stuff to get round this bug in IE6, including hacky DOM work that stops the leak but is actually much slower.


Update

Ok, this isn't an easy problem to fix - MS describe the IE6 bug (and provide advice on how to fix it) here: http://msdn.microsoft.com/en-us/library/bb250448(VS.85).aspx

Basically this isn't a problem with javascript or jQuery - the actual issue is with the IE6 DOM - when HTML elements are added to the page (by javascript, rather than being in the page when it loads) IE can't garbage collect them unless they are created in a very specific way.

This is back to front from how jQuery UI builds elements (see DOM insertion order bug in the link above) and so this isn't something that either the jQuery devs or you can easily fix.

So how do you fix the issue? Well, you can stick with the legacy pop-up calendar for IE6 or you can write your own one.

I would recommend the former, but if you really want to built the latter there are some basic rules to follow:

  1. Always add elements top-down - for instance if you want to built a table add the <table> element into the page's DOM, then add <tr> then <td> and so on. This is back to front as it's much quicker to build the entire table and then add it to the DOM - unfortunately that's where IE6 loses track of it.

  2. Only use CSS and HTML 3.2 attributes - sounds dumb, but IE6 creates extra objects to store the extra attributes (or 'expando' properties) and these also leak.

  3. Kinda related to (2), but as @gradbot mentions IE6 has problems garbage collecting javascript variables - if they reference a DOM element inside an event fired from that element you can get problems. This is also compounded by javascript references to DOM elements that have 'expando' properties.

If you have a look around online there may already be a drop-down DHTML calendar that sticks to these rules - it won't be as pretty, quick or configurable as the jQuery UI one, but I'm sure I've seen it done without leaking in IE6.

I think the best bet is to keep as much static as possible - for instance you could load the calendar grid (week numbers and day column headings) with the page and then dynamically load in the numbers (and nothing else). Create the day numbers as links, with javascript in the href - not best practice normally but far less likely to leak in IE6.

Keith
Incidentally the workaround involves building tables into the DOM in a completely different way - it would involve a complete re-write of the jQuery UI datepicker control and the new control would take a couple of seconds (of IE6 appearing to hang) to render.
Keith
The specific issue that causes this leak is here: http://msdn.microsoft.com/en-us/library/bb250448(VS.85).aspx and the problem is the DOM insertion order leak
Keith
@Keith: unfortunately, this is for a custom app written by my company. With 25% of my users running <IE6sp3, I do not have a choice as to what I support--trust me, I'd love to just force everyone to upgrade. I also understand that is sucks jquery has to work around IE's bug, but that's why I love jquery: it lets me stop worrying about browser problems and versions, etc. Or so I thought. If I can't fix the leak, I have to rip out jquery or at least whatever part of it leaks and do something else.
Michael Haren
My point is that you can just let the leak happen for those 25% users - their browser's gonna crash anyway. Your application will still basically work for them, and I'm not suggesting that you don't support them at all. You can't fix this leak with jQuery UI because of how the DatePicker builds the table that it displays. You could create your own one from scratch using specific IE6 only code, but that will still be slow for them. My own product's customer base is 20-25% IE6 and I think here I'd just drop the DatePicker for those users and ask them to type a date instead. Degrade gracefully.
Keith
@Keith: the company that hired me to create this site cannot/will not accept a solution like that. We had a datepicker system in place with an annoying old-school popup calendar which worked. I replaced it with the simpler, flashier datepicker hoping that it would *improve* things. For 75% of users, it has improved things, but I can't just ignore the other 25%. I like the idea of degrading for those 25%, though, I'll think about that.
Michael Haren
I think your best bet is to leave the IE6 users with the old calendar then. That way they don't lose anything while you still add value for the 75% of users who can take advantage of it. I find that while jQuery is mostly pretty good with IE anything in jQuery UI tends to just be too much for it. Even IE8 has appallingly poor performance when it comes to doing anything dynamic on the page. I find myself returning to the old design mantra of degrade gracefully regularly.
Keith
@Keith, thanks for the follow up--this is interesting information. I wish all signs weren't pointing to: "you're screwed", though.
Michael Haren
Yeah, sorry. This is why we didn't see the current trend for dynamic content years ago - you just couldn't do much with pages when browsers were so much weaker. The web has been waiting for IE6 (and 5) to finally die off - I think they have in the real world, but lots of corps are left with propriety intranet stuff that won't work in anything else.
Keith
@Keith - Voted down because of the elitist and unhelpful tone at the beginning of the answer. Your information in your edits is *very* helpful, however. Remove your initial post, and leave everything after "UPDATE", and I will remove my down vote.
GuyBehindtheGuy
@GuyBehindtheGuy - sorry that you feel that way, but it really wasn't intended to be elitist. Increasingly you're seeing this behaviour on the web - i.e. it should work in IE6 but they're basically second class citizens, just try browsing with IE6 and see how many "please upgrade" messages you get. I still think it would be the right tack had the memory leak been less frequent, as in most cases that I've seen it occur it hits only after hours of being on the same page (or other leaky pages, which are very common). Unfortunately in this case it's happening in minutes and so it's not appropriate
Keith
+4  A: 

It's obvious that the problems you've been describing stem from a flaw in IE6 that you can't subvert with a software fix (be it a jQuery update, a manual call to CollectGarbage, or some other JavaScript/DOM hack).

There are 3 options, in my mind, that would fix this problem.

  1. I would imagine that your customers/users are using IE6 SP0 because of some company standard or regulation, or even because some older web-app they still use doesn't support newer browsers. If it's not an option to upgrade to IE7 (or therefore IE8), you could get in contact with your customers' IT department and politely point out that updating IE6 with the latest service packs would not only fix a problem with an application that they are paying for, but also patch many security and performance flaws that undoubtedly exist in IE6 SP0. Admittedly, that might not be a comfortable situation, but it might solve the problems you are encountering, while still allowing them to work with a browser that require for whatever reason.

  2. If you can convince your customers' IT department that IE6 is antiquated, they may be willing to allow your users to upgrade to a newer browser. It's not a stretch to say that someone running an IT department would be more willing to force employees to upgrade a piece of software if they knew it was either a) riddled with flaws and security holes or b) approaching its end of support date (as IE6 SP0 is). IE6 SP0 on XP Pro SP2 is supported until July 13, 2010 - so it still has some time, but pointing that out, along with other flaws/limitations you could find might make them think seriously about upgrading sooner rather than later.

  3. If you can't convince anyone to upgrade their browsers either to IE6 SPX, or to IE7/8, then I don't know if you have a choice but to remove the offending control from your page, and pursue a different option until the user's browser permits it. There are assuredly many implementations of a date picker control available online which would suit your needs. It might not be as snazzy as the jQuery version, but you don't have many other options at this point.

I hope you find a solution!

Pwninstein
Keith
I agree they probably wouldn't work, but it's still an option one should look into so you could say "I've pursued and exhausted all other options." I think that the software you mentioned would fall under the category of "some company standard/regulation or some older web-app that doesn't support newer browsers." As far as IE6 Support... According to Microsoft, there are still several scenarios where it's still supported: http://support.microsoft.com/gp/lifesupsps/#Internet_Explorer
Pwninstein
+1  A: 

The problem here lies a bit deeper than 'just' jquery. Jquery along with many other browsers "leak" circular references between DOM objects and object listeners. Say you have an input field that has attached to it a listener, then you remove the element from the dom and do not have any reference to the listener in your code. Now any modern browser (>=ie7, ff, chrome, safari, opera) will live with that and garbage collect it, while IE6 will think that because there is a listener attached to a dom element it should not garbage collect the dom and the listener itself.

To get around that some folks use very complicated design patterns as highlighted for example in events code in Google Doctype. To fix the problem for IE6 you would really need to rewrite a portion of jquery to work around IE6 issue and/or switch to using a different library and/or not attach any event listeners in your application to DOM events.

Marcin
+1  A: 

http://dev.jqueryui.com/ticket/4644 says they will fix in 1.3.3 version. milestone 1.8 : http://dev.jqueryui.com/milestone/1.8

Cengiz Han
Yeah, I know...that's my bug report. I'm not very confident it will ultimately be included, though.
Michael Haren