2011-09-25 16 views
7

Quiero insertar html en el rango actual (un Rango W3C).¿Por qué no hay un documento.createHTMLNode()?

Supongo que tengo que usar el método insertNode. Y funciona muy bien con el texto.

Ejemplo:

var node = document.createTextNode("some text"); 
range.insertNode(node); 

El problema es que quiero insertar html (podría ser algo así como "<h1> prueba </h1 > algo más de texto"). Y no hay createHTMLNode().

He intentado usar createElement ('div'), darle una identificación, y el html como innerHTML y luego tratar de reemplazarlo con su nodeValue después de insertarlo, pero me da errores DOM.

¿Hay alguna manera de hacer esto sin tener un elemento html adicional alrededor del html que quiero insertar?

+1

De acuerdo con [esto] (https://developer.mozilla.org/en/DOM/range .insertNode) puede insertar elementos DOM muy bien. Entonces, publique el código y los mensajes de error y lo ayudaremos a depurarlo ... –

+0

¿Podría proporcionar una demostración de jsFiddle (o el código en sí)? No he trabajado mucho con rangos, así que no estoy seguro de poder recrear tu situación ... –

Respuesta

6

Porque "<h1>test</h1>some more text" consiste en un elemento HTML y dos pedazos de texto. No es un nodo.

Si desea insertar HTML, utilice innerHTML.

¿Hay alguna manera de hacer esto sin tener un elemento html adicional alrededor del html que quiero insertar?

Cree un elemento (no lo agregue al documento). Establezca su innerHTML. A continuación, mueva todos sus nodos secundarios haciendo clic sobre foo.childNodes.

+0

Ah. Gran respuesta. Funciona como un encanto :) ¡Gracias! – Martin

3

En lugar de innerHTML simplemente use appendChild (elemento); this puede ayudarlo. Si quieres comentar aquí, y te daré un ejemplo.

+0

Absolutamente, y el mejor método para hacer esto. – Rob

4

En algunos navegadores (notablemente ninguna versión de IE), los objetos Range tienen originalmente createContextualFragment() no estándar que pueden ayudar. Es probable que las versiones futuras de navegadores como IE implementarán esto ahora que it has been standardized.

He aquí un ejemplo:

var frag = range.createContextualFragment("<h1>test</h1>some more text"); 
range.insertNode(frag); 
Cuestiones relacionadas