2011-12-31 5 views
5
var newDoc = document.implementation.createHTMLDocument('someTitle'); 
// swap newDoc with document 

DOMImplementation.createHTMLDocument¿Cómo se reemplaza el documento en una ventana?

  • ¿Es posible cambiar el documento actual para un nuevo documento?
  • ¿Hay alguna razón razonable para hacer esto?
+0

Probablemente no pueda. 'window.document' en sí mismo es de solo lectura y no hay métodos en' window' para cambiar su 'document' vinculado. Sin embargo, no pude encontrar ninguna fuente para justificar mi suposición. – copy

+0

Pensé lo mismo, pero podría haber algo por ahí. Quiero decir, ¿cuál es el sentido de crear un nuevo documento si no puedes inyectarlo en una ventana? Tal vez puede inyectarlo en una nueva ventana/iframe – Raynos

+1

Sí, puede insertarlo en un iframe, ese es el [ejemplo de MDN] (https://developer.mozilla.org/en/DOM/DOMImplementation.createHTMLDocument) para createHTMLDocument (__Update__: No directamente, pero puedes jugar con 'importNode' y' replaceChild (importedDocumentElement, document.documentElement) '). También se puede usar para analizar el HTML que obtienes de una solicitud http (y luego tienes una representación DOM de eso). – copy

Respuesta

5

No puede reemplazar el objeto de documento actual o cualquier objeto de documento con el objeto Document creado con el método createHTMLDocument.

El createHTMLDocument se introdujo por primera vez en uno de los borradores del DOM Level 2 Core, pero luego se eliminó de la recomendación final.

Más tarde se agregó a la especificación HTML5 ya que no había una forma programática para crear un documento HTML.

Algunos de los casos de uso previstas creación programática de un documento HTML eran,

  • Crear un documento HTML no enfoscado para cargar a través de XMLHttpRequest (en lugar de el envío de un documento XML).

  • Prueba de características del HTML DOM en el código de la biblioteca de forma que se garantice que evite los efectos secundarios en el documento mostrado.

  • crear un documento no procesada aislado de una rica área de edición de texto, por lo limpieza del lado del cliente se puede hacer antes de subir sin perturbar el vivo DOM que el usuario todavía puede seguir editando.

  • Implemente el algoritmo de análisis HTML5 en el lado del cliente en JavaScript para fines de prueba y comparación, o para la virtualización o la seguridad basada en la capacidad de objeto.

    Un iframe invisible se puede utilizar para la mayoría de estos propósitos, pero eso es más caro en términos de recursos. W3C mailing list

La conversación en listas de correo del W3C que trajeron el método de nuevo en la especificación, [Bug 7842] New: No programmatic way to make an HTML document - consider adding createHTMLDocument

1

Si serializar el documento a HTML se puede sustituir el documento de la página actual con document.open, document.write y document.close.

De hecho, puede incluso cambiar el modo Quirks al modo estándar agregando un <!doctype html>.

Por ejemplo: http://jsbin.com/anusul/2

<html>  
    <script> 
     alert('now in compatMode '+document.compatMode); 
     if (document.compatMode==='BackCompat') { 
      setTimeout(function() { 
     var markup= '<!DOCTYPE html>New Page'; 
       document.open(); 
       document.write(markup); 
       document.close(); 
      }, 0); 
     } 
    </script> 
</html>​​​​​​ 

no aconsejaría a usarlo tales engaños y sin un escenario de caso especial, pero funciona.

fuente: Javascript switch from quirksmode to standard + Need help with: jquery prepend doctype to html

+0

Eso no es muy interesante, porque tienes que usar una cadena HTML. Estaba más interesado en usar un elemento de documento – Raynos

+0

Cuando te refieres a la pregunta original, ciertamente le permite reemplazar un documento. Es comprensible si eso no era lo que estaba buscando en el contexto de la declaración 'DOMImplementation.createHTMLDocument' – William

2

Hay cosas en la document que no está muy relacionado con el árbol DOM que contiene, como document.cookie, location y URL. Es mucho más seguro si no podemos reemplazar objetos globales como window y document.

Pero lo que está buscando se puede lograr de manera efectiva mediante la sustitución de la principal document 's documentElement con los otros document' s documentElement. Se tendrá exactamente el mismo efecto que se busca. *

document.replaceChild(
    document.importNode(newdoc.documentElement, true), 
    document.documentElement 
); 

En cuanto a las razones para hacerlo, me he encontrado hasta ahora one que no se puede lograr con un iframe.

* Tenga en cuenta que si los doctypes son diferentes, tendría que reemplazar el nodo doctype del documento principal por el nodo doctype del otro documento por separado.

Cuestiones relacionadas