If you’ve ever wanted to have an iframe resize itself based on its (cross-domain) contents, you may have run into some problems.
I had to tackle this somewhat recently. The solution is silly, but it works.
The problem is that an iframe can’t communicate with its parent if they’re on different domains. For example, let’s say I put an iframe here on povert.com. The iframe could be pointing to, say, flappingcrane.com. Povert.com can’t access any useful information about the iframe, and vise-versa.
The solution is to have the iframed content (in this case flappingcrane.com) iframe something else from the original domain. So you could set up a file on povert.com called yaygo.html. Then flappingcrane.com iframes that, with a GET query. That GET query should contain any information you want to communicate to the parent (povert.com). Since yaygo.html is on povert.com, it can refer to povert.com with parent (though, since they’re different domains, it can’t do anything useful) and to flappingcrane.com with parent.parent. Because they’re on the same domain (even with the intermediate flappingcrane.com iframe), it can do something useful — like pass values from the GET query to a function:
parent.parent.setFunProps(iframeid, width, height, tacoflavor);
setFunProps() can then take those values and do what it wants with it (resize the iframe, whatever).
Another tidbit. If you give a name attribute to an iframe, that iframe’s contents can access the name with window.name. You can’t access window.id though, unfortunately. Either are handy for identifying to the parent document what iframe is requesting a resize, though there are other crappier ways to do it (passing its own url to match against iframe src, for example).
UPDATE (Oct 28, 2009): Looks like it doesn’t work in any version of IE now. It’s possible that Microsoft saw this as a security hole and fixed it.
UPDATE (Oct 18, 2011): jajasilver pointed out that the examples didn’t set a DOCTYPE (oops — thanks!). This has been corrected and the examples work again. Wow, I hadn’t looked at this for years.