2012-02-17 15 views
5

¿Hay alguna forma de convertir la cadena de marcado al objeto nodo en JavaScript? En realidad, yo estoy buscando el subsitute para:Crear nodo a partir de la cadena de marcado

document.getElementById("divOne").innerHTML += "<table><tbody><tr><td><input type='text' value='0' /></td></tr></tbody></table>" 

algo así como

document.getElementById("divOne").appendChild(document.createNodeFromString("<table><tbody><tr><td><input type='text' value='0' /></td></tr></tbody></table>")) 

usando createNodeFromString en lugar de crear el elemento de la tabla a continuación, añadir sus elementos secundarios luego coloque sus respectivos atributos y valores!

+1

Tengo curiosidad por qué configurar innerHTML no funciona para usted. Después de configurar innerHTML puede obtener el elemento resultante al consultar su divOne. – akonsu

+0

@akonsu, supuestamente tiene en divOne y fuera de este div tiene un botón con onclick = innerHTML-method. Ahora, en FF10 e IE9 (con el modo de documento IE9) ingrese algo en el cuadro de texto y presione el botón, ¡el valor de la entrada se reiniciará! Estoy tratando de ver que pasaría lo mismo con appendChild. Por cierto, en el modo de compatibilidad IE8, el valor del elemento de entrada es persistente. –

+0

¿Está diciendo que si tiene un campo de entrada de texto y un botón, el valor del campo de entrada se borrará cuando presione el botón? ¿Podrías demostrar esto en, digamos, jsbin.com? – akonsu

Respuesta

15

No existe una función de explorador cruzado para esto. El siguiente método se puede utilizar para lograr el efecto deseado (utilizando un DocumentFragment para un rendimiento optimizado, basado en this answer):

function appendStringAsNodes(element, html) { 
    var frag = document.createDocumentFragment(), 
     tmp = document.createElement('body'), child; 
    tmp.innerHTML = html; 
    // Append elements in a loop to a DocumentFragment, so that the browser does 
    // not re-render the document for each node 
    while (child = tmp.firstChild) { 
     frag.appendChild(child); 
    } 
    element.appendChild(frag); // Now, append all elements at once 
    frag = tmp = null; 
} 

Uso (sangría para facilitar la lectura):

appendStringAsNodes(
    document.getElementById("divOne"), 
    "<table><tbody><tr><td><input type='text' value='0' /></td></tr></tbody></table>" 
); 
+0

¡Dandy! Gracias por esta excelente solución. –

2

Sí, se puede Haz eso.

var myNewTable = document.createElement("table"); 
myNewTable.innerHTML = "<tbody><tr><td><input type='text' value='0' /></td></tr></tbody>" 
document.getElementById("divOne").appendChild(myNewTable); 
+0

Las versiones anteriores de IE se quejarán de esto, porque no pueden manejar la configuración de la propiedad 'innerHTML' en algunos elementos, incluido'

'. Consulte también [este artículo] (http://support.microsoft.com/kb/239832). –

Cuestiones relacionadas