views:

65

answers:

2

I have a peculiar situation where I am only given control of the contents of a document's <body>. The host, I assume in an effort to remain flexible, is not declaring a doctype which will throw IE into quirks mode immediately. With my limited control over the document, what can I do to force IE to render the page in standards mode?

+2  A: 

I believe you can't do anything about it unless you say, rewrite the contents of the page dynamically with JS and forcefully insert a doctype.

Can you go into specifics of how much control you have over the <body>? Are you allowed to do JS/scripting?

EDIT: Here's an attempt but I didn't test it in IE. It may give you ideas. I document.write() the outerHTML of document.documentElement and it turns the compatMode into CSS1Compat.

You may need to strip out the script block upon rewrite. Like I said, I wouldn't really recommend trying this...

http://medero.org/first-line.html

EDIT #2: It seems to surprisingly work in IE6. But upon refresh, IE caches it somehow and it permanently stays in its .document.write()ed form. To counter that, append it with a query string, eg ?203984234.

Again, I'm not sure what your situation is, but I hope this gives you ideas or helps.

EDIT #3: I rewrote it and bound the document.write to window.onload. You will need to append a unique query string every time you visit it to see the effect, because it caches it after it .write's it.

http://medero.org/rewrite.html?f30324433322111

If you need something more instantaneous you can probably jack jQuery's DOM ready function to rewrite it before the window loads.


Miscellaneous Notes:

  • You could probably hide the entire html document through CSS until the document.write is invoked if visually it matters
  • You should probably strip the <script> document.write before saving outerHTML so that the newly written page doesn't have the script block.
meder
I doubt this will work. The page has already rendered. If you dynamically add a doctype, IE will have to detect that and choose to rerender the page. If IE was capable of doing that, I would think it's `document.documentMode` property would not be read only.
Matt Greer
I updated with an attempt.
meder
Interesting, it looks like it actually works, as scary as that is. Add a div with margin and padding and watch it change size as IE's box model changes.
Matt Greer
Wow! Horrible, but magnificent! ;-)
Marcel Korpel
Turns out `document.write` may be useful for something after all, eh?
meder
That is one magnificent hack. I can do anything I want in the body, but unfortunately the html is being hosted in an iframe, and I have no control over the source URL, so querystring cache busting is out.
David Gouldin
I'm confused now. Please provide an example?
meder
Ah I see now, I should've actually tested it *in* IE before commenting. :) What is cached is the state I want so being able to control the url for cache busting is not necessary. Correct?
David Gouldin
For testing you'll need the query string to see the difference, but once the `document.write` is done the first time, it becomes cached om OE so in further refreshing it "sticks" so you don't need to do the query string anymore because the cached file now has the DOCTYPE.
meder
Ok, so I've come up with an example page that includes a show-stopper:http://gould.in:8081/quirks.htmlIn IE, $ (jQuery) will be undefined after the compatMode change.
David Gouldin
It's defined for me. Are you sure? Screenshot please.
meder
http://imgur.com/2RCnl.png You should see the "jQuery Lives" alert twice, with the original compatMode, once after. You'll notice you don't even get the 2nd compatMode alert because IE broke on jQuery before it got to it.
David Gouldin
A: 

Have a look at this Defining Document Compatibility article on MSDN. Perhaps writing out the X-UA-Compatible meta tag will work.

Douglas