IE Fires Onresize When Body Resizes
When a user resizes the browser window, I wanted to resize some elements on the page. So, I attached an onresize event handler to the window. I noticed it rather peculiar when Internet Explorer 6 kept locking up on me.
Turns out, IE6 fires the event even when the document body changes in size. Here's a quick example to demonstrate:
<script type="text/javascript">
var currheight = '';
window.onresize = function(){
alert('resized');
}
function expand()
{
var el = document.getElementById('test');
var div = document.createElement('div');
div.innerHTML = "a";
el.appendChild(div);
}
</script>
<input type="button" onclick="expand()" value="Expand">
<div id="test"></div>
Every time you hit the expand button, it fires the event. Ick. So, here is my IE6 fix:
var currheight;
window.onresize = function(){
if(currheight != document.documentElement.clientHeight)
{
alert('resized');
}
currheight = document.documentElement.clientHeight;
}
I just perform a check to determine the height of the viewport and if it changes, do the resize.
Update: Looks like I didn't test properly in IE7. It, too, suffers the same problem, firing the resize event when the body changes.
TIPS, TRICKS & BOOKMARKS on WEB DEVELOPMENT
Hi. I'm Jonathan Snook and I write about web development.
Conversation
yeah, found this one out myself... in an even more annoying way...
Double click the title bar... this maximizes/restores the window size...
which in IE7, fires 2 events, and in IE6, fires 3 events!!!!!
I can accept 2 events... (1 for horizontal, and 1 for vertical)... even though that would still be goofy, but 3 events?
When I last tested this, the size reported back by IE6, was the same for all 3 events... which caused weird issues... I'll try your code though, to see if I can filter out some of the extra events.
Cheers,
Steve
I was on a project a while back where this cropped up, I never found the solution. I'll know for next time, thanks!
If I'm not mistaken, this happens with IE7 also. I've been playing around with mootools animation and I came across the very same problem. I didn't realize it was a syptom of the body size changing, but after reading this it makes perfect sense. I have been fighting with this problem for about a week (only about an hours time, because it's my own site and I can only handle so much frustration on my own behalf).
Your timing is pretty good for me on this. Thanks.
@Daniel: so it does. I was pretty sure I tested this in IE7 but I apparently didn't test well enough. Indeed, IE7 suffers the same problem. The solution described above will work in IE7 as well.
yesterday I read about object.watch ( http://devguru.com/technologies/javascript/10770.asp )
may be you could watch document.documentElement.clientHeight ( or clientWidth). I haven't see any where to use watch, but I don't know the reason.
@RStankov: while theoretically that sounds like a great idea, Object.watch only works in Mozilla/Firefox.
You should read this:
http://ecmascript.stchur.com/2006/08/20/beating-the-ie-resize-bug/#more-23
I was driven insane by this problem when working with a resolution dependent layout. IE was flickering and running really slow everytime I toggled a container that would span over the fold as it fired IE into action due to the body resize.
@Charlie - Nice find.
I've also found that JavaScript expressions wrapped in a conditional comment can also work. (With the caveat that they're not that extra pretty and they have a little "bounce" after the resize occurs.)
A quick Google search turned up this example, which kind of illustrates the point:
http://blog.richnetapps.com/index.php?p=49&more=1&c=1&tb=1&pb=1
It's much more roundabout than simply pinging an element's width attribute, though. (But it still remains a nice standby for emulating min-width/max-width in IE6 and below).
What happens if you want Firefox to emulate IE? Not often this happens granted, but I was looking to resize an image to 100/100% of the body - using JS to keep the image ratio, so it doesnt start to look odd.
If you do this in Firefox you get a resize event after you have resized rather than during as in IE. resize v resized...Otherwise I'm just going to scale the image to the greatest extent that the browser can be in order to overcome the problem...
Thought I'd mention, I was having a similar problem and made my own test page. On my test page though I wasn't seeing the resize event being called for document body changes. Then I compared my test page and my problem page and it turns out this doesn't happen if you have a strict DTD. If you have a transitional DTD though it doesn't occur. The strict DTD page also had the XML declaration so it might be related to that.
@steve - Maybe it fires three events because of width, height, and zoom...
I had similar problem. I was adjusting the buttons width during onload, but that triggers on resize event in IE. My fix was: