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?
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 savingouterHTML
so that the newly written page doesn't have thescript
block.
document.write
may be useful for something after all, eh? –
Cheesy 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. –
Cheesy Have a look at this Defining Document Compatibility article on MSDN. Perhaps writing out the X-UA-Compatible
meta tag will work.
X-UA-Compatible
meta and it worked. I got lucky when I tried it though… apparently you have to put it near the beginning of your HEAD tag ("The X-UA-Compatible header is not case sensitive; however, it must appear in the header of the webpage (the HEAD section) before all other elements except for the title element and other meta elements." goo.gl/xe3Ff). Also, IE "caches" the rendering mode for as long as the browser window is open, so try closing and opening your window. I have control over the HEAD tag though… original poster didn't. –
Classicism Here's how I managed to solve it, based on meder's answer.
I first tried writing out the X-UA-Compatible
meta but that didn't work.
At the end of the document (or in the head, but I didn't have access to that either):
<script type="text/javascript">
if (navigator.appName == 'Microsoft Internet Explorer'){
window.onload=function(){
if (document.documentMode == 5){
contents = document.documentElement.outerHTML;
newdoc = document.open("text/html", "replace");
newdoc.writeln('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">');
newdoc.write(contents);
newdoc.close();
}
};
}
</script>
The inner if
is to prevent an infinite loop. It would probably better to strip out the code itself, say by putting it in a function and removing the function call with string.replace()
, but I couldn't get that to work so had to settle for this.
© 2022 - 2024 — McMap. All rights reserved.
document.documentMode
property would not be read only. – Gleesome