2010-08-01 6 views
6

Tengo una situación peculiar en la que solo se me da control de los contenidos del documento <cuerpo>. El anfitrión, supongo que en un esfuerzo por permanecer flexible, no está declarando un doctype que lanzará IE en el modo peculiar de inmediato. Con mi control limitado sobre el documento, ¿qué puedo hacer para forzar que IE renderice la página en modo estándar?¿Cómo puedes obligar a IE a renderizar en modo estándar si solo tienes control del contenido del cuerpo?

Respuesta

4

Creo que no puede hacer nada al respecto a menos que lo diga, reescriba el contenido de la página dinámicamente con JS e inserte forzosamente un doctype.

¿Puede entrar en detalles de cuánto control tiene sobre el <body>? ¿Se te permite hacer JS/scripting?

EDIT: Este es un intento pero no lo probé en IE. Puede darte ideas. I document.write()outerHTML de document.documentElement y convierte compatMode en CSS1Compat.

Es posible que tenga que quitar el bloque de script al reescribir. Como dije, que no recomendaría probar este ...

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

editar # 2: Parece que funciona sorprendentemente en IE6. Pero al actualizar, IE lo almacena en caché de alguna manera y permanece permanentemente en su forma .document.write() ed. Para contrarrestar eso, añádalo con una cadena de consulta, por ejemplo, ?203984234.

Una vez más, no estoy seguro de cuál es su situación, pero espero que esto le brinde ideas o ayuda.

EDIT # 3: Lo reescribí y atado el document.write al window.onload. Deberá agregar una cadena de consulta única cada vez que la visite para ver el efecto, ya que la almacena en la memoria caché después de .write.

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

Si necesita algo más instantánea es probable que pueda Jack función listo DOM de jQuery para volver a escribir antes de la carga de la ventana.


Notas Varios:

  • Probablemente se podría ocultar todo el documento HTML a través de CSS hasta que el document.write se invoca si visualmente importa
  • probablemente debería despojar a la <script> document.write antes de guardar outerHTML de manera que la página recién escrita no tiene el bloque script.
+0

Dudo que esto funcione. La página ya ha sido renderizada. Si agrega dinámicamente un tipo de documento, IE tendrá que detectarlo y elegir entregar la página. Si IE fuera capaz de hacerlo, creo que la propiedad 'document.documentMode' no sería de solo lectura. –

+0

Actualicé con un intento. –

+0

Interesante, parece que realmente funciona, por más aterrador que eso. Agregue un div con margen y relleno y mire cómo cambia de tamaño a medida que cambia el modelo de cuadro de IE. –

1

Eche un vistazo a este artículo Defining Document Compatibility en MSDN. Tal vez escribir la metaetiqueta X-UA-Compatible funcione.

+1

Tarde en la fiesta, pero probé la meta 'X-UA-Compatible' y funcionó. Tuve suerte cuando lo probé ... parece que tienes que ponerlo cerca del comienzo de tu etiqueta HEAD ("El encabezado X-UA-Compatible no distingue entre mayúsculas y minúsculas; sin embargo, debe aparecer en el encabezado de la página web (HEAD) sección) antes de todos los demás elementos, excepto el elemento de título y otros meta elementos. "http://goo.gl/xe3Ff). Además, IE "almacena en caché" el modo de renderización mientras la ventana del navegador esté abierta, así que intente cerrar y abrir su ventana. Sin embargo, tengo control sobre la etiqueta HEAD ... el cartel original no. – thirdender

0

Así es como logré resolverlo, based on meder's answer.

Primero intenté escribir la meta X-UA-Compatible pero eso no funcionó.

Al final del documento (o en la cabeza, pero que no tenía acceso a que tampoco):

<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> 

El interior if es evitar un bucle infinito. Probablemente sería mejor quitar el código en sí, digamos poniéndolo en una función y eliminando la función de llamada con string.replace(), pero no pude hacerlo funcionar, así que tuve que conformarme con esto.

Cuestiones relacionadas