Tengo una cadena HTML que representa un elemento: '<li>text</li>'
. Me gustaría agregarlo a un elemento en el DOM (a ul
en mi caso). ¿Cómo puedo hacer esto con Prototype o con métodos DOM?
(Sé que podría hacer esto fácilmente en jQuery, pero desafortunadamente no estamos usando jQuery).
javascript
dom
prototypejs
Omer Bokhari
fuente
fuente
var nodes = document.fromString("<b>Hello</b> <br>");
Respuestas:
Nota: la mayoría de los navegadores actuales admiten
<template>
elementos HTML , que proporcionan una forma más confiable de convertir elementos de creación a partir de cadenas. Vea la respuesta de Mark Amery a continuación para más detalles .Para navegadores más antiguos y node / jsdom : (que aún no admite
<template>
elementos en el momento de la escritura), use el siguiente método. Es lo mismo que hacen las bibliotecas para obtener elementos DOM de una cadena HTML ( con algo de trabajo adicional para que IE evite errores con su implementación deinnerHTML
):Tenga en cuenta que, a diferencia de las plantillas HTML, esto no funcionará para algunos elementos que legalmente no pueden ser hijos de a
<div>
, como<td>
s.Si ya está utilizando una biblioteca, le recomendaría que se adhiera al método aprobado por la biblioteca para crear elementos a partir de cadenas HTML:
update()
método .jQuery(html)
yjQuery.parseHTML
métodos.fuente
createElementFromHTML
es engañoso ya quediv.firstChild
devuelve unNode
que no es,HTMLElement
por ejemplo, no puedenode.setAttribute
. Para crear unElement
retornodiv.firstElementChild
de la función en su lugar.<div>
envoltura del HTML que agregué me.innerHTML
estaba molestando. Nunca pensé en usar.firstChild
.div
y la salida es[object SVGSVGElement]
mientras el registro de la consola me da el elemento DOM correcto. ¿Qué estoy haciendo mal?HTML 5 introdujo el
<template>
elemento que puede usarse para este propósito (como se describe ahora en la especificación WhatWG y los documentos MDN ).Un
<template>
elemento se utiliza para declarar fragmentos de HTML que se pueden utilizar en scripts. El elemento se representa en el DOM como unHTMLTemplateElement
que tiene una.content
propiedad deDocumentFragment
tipo, para proporcionar acceso a los contenidos de la plantilla. Esto significa que puede convertir una cadena HTML en elementos DOM configurandoinnerHTML
un<template>
elemento y luego buscando en la propiedadtemplate
's.content
.Ejemplos:
Tenga en cuenta que los enfoques similares que utilizan un elemento contenedor diferente, como un
div
no funcionan del todo. HTML tiene restricciones sobre qué tipos de elementos pueden existir dentro de qué otros tipos de elementos; por ejemplo, no puedes poner atd
como hijo directo de adiv
. Esto hace que estos elementos se desvanezcan si intenta establecer el valorinnerHTML
de adiv
para contenerlos. Ya que<template>
s no tienen tales restricciones en su contenido, esta deficiencia no se aplica cuando se usa una plantilla.Sin embargo,
template
no es compatible con algunos navegadores antiguos. A partir de enero de 2018, ¿puedo usar ... estima que el 90% de los usuarios de todo el mundo están usando un navegador que admitetemplate
s . En particular, ninguna versión de Internet Explorer los admite; Microsoft no implementó eltemplate
soporte hasta el lanzamiento de Edge.Si tiene la suerte de escribir código que solo está dirigido a usuarios en navegadores modernos, continúe y utilícelos ahora mismo. De lo contrario, es posible que tenga que esperar un tiempo para que los usuarios se pongan al día.
fuente
html.trim
sino del análisis interno de la configuración innerHTML. En mi caso, elimina espacios importantes como parte de un TextNode. :-(Utilice insertAdarestHTML () . Funciona con todos los navegadores actuales, incluso con IE11.
fuente
insertAdjacentHTML
funciona con todos los navegadores desde IE 4.0.innerHTML += ...
es que las referencias a elementos anteriores todavía están intactas utilizando este método.beforebegin
,afterbegin
,beforeend
,afterend
. Ver el artículo de MDN.Las implementaciones de DOM más nuevas tienen
range.createContextualFragment
, lo que hace lo que quiere de una manera independiente del marco.Es ampliamente compatible. Sin embargo, para estar seguro, verifique su compatibilidad en el mismo enlace MDN, ya que cambiará. A partir de mayo de 2017, esto es todo:
fuente
innerHTML
de un div; ciertos elementos, comotd
s, serán ignorados y no aparecerán en el fragmento resultante.No necesita ningún ajuste, tiene una API nativa:
fuente
<td>text</td>
. Esto se debe a queDOMParser
está intentando analizar un documento HTML completo y no todos los elementos son válidos como elementos raíz de un documento.Para ciertos fragmentos html como
<td>test</td>
, div.innerHTML, DOMParser.parseFromString y range.createContextualFragment (sin el contexto correcto) las soluciones mencionadas en otras respuestas aquí, no crearán el<td>
elemento.jQuery.parseHTML () los maneja correctamente ( extraje la función parseHTML de jQuery 2 en una función independiente que se puede usar en bases de código que no son jquery).
Si solo admite Edge 13+, es más simple usar la etiqueta de plantilla HTML5:
fuente
Aquí hay una manera simple de hacerlo:
fuente
Puede crear nodos DOM válidos a partir de una cadena usando:
document.createRange().createContextualFragment()
El siguiente ejemplo agrega un elemento de botón en la página tomando el marcado de una cadena:
fuente
DocumentFragment
objeto, todavía , para mi gran sorpresa, sufre el mismo defecto que la respuesta aceptada: si lo hacedocument.createRange().createContextualFragment('<td>bla</td>')
, obtendrá un fragmento que solo contiene el texto 'bla' sin el<td>
elemento. O al menos, eso es lo que observo en Chrome 63; No he profundizado en las especificaciones para averiguar si es el comportamiento correcto o no.Con Prototype, también puedes hacer:
HTML:
JS:
fuente
Estoy usando este método (funciona en IE9 +), aunque no analizará
<td>
ni a otros hijos directos no válidos del cuerpo:fuente
Para mejorar aún más el útil fragmento .toDOM () que podemos encontrar en diferentes lugares, ahora podemos usar backticks ( literales de plantilla ) de forma segura .
Entonces podemos tener comillas simples y dobles en la declaración foo html.
Esto se comporta como heredocs para aquellos familiarizados con el término.
Esto se puede mejorar además con variables, para hacer plantillas complejas:
Entonces, ¿por qué no usar directamente
.innerHTML +=
? Al hacerlo, todo el DOM está siendo recalculado por el navegador, es mucho más lento.https://caniuse.com/template-literals
fuente
Agregué un
Document
prototipo que crea un elemento a partir de una cadena:fuente
td
s.HTML5 y ES6
<template>
Manifestación
fuente
Tarde pero solo como una nota;
Es posible agregar un elemento trivial al elemento de destino como contenedor y eliminarlo después de usarlo.
// Probado en Chrome 23.0, Firefox 18.0, es decir, 7-8-9 y Opera 12.11.
fuente
La solución más rápida para representar DOM desde una cadena:
Y aqui puede verificar el rendimiento para la manipulación DOM React vs JS nativo
Ahora puedes simplemente usar:
Y, por supuesto, en un futuro próximo utilizará referencias de memoria porque el "elemento" es su nuevo DOM creado en su documento.
Y recuerda que "innerHTML =" es muy lento: /
fuente
Aquí está mi código, y funciona:
fuente
Por lo demás, pensé en compartir esto sobre un enfoque complicado pero simple que se me ocurrió ... Tal vez alguien encuentre algo útil.
fuente
¿Por qué no hacer con nativos js?
fuente
fuente
Puede usar la siguiente función para convertir el texto "HTML" al elemento
fuente
td
s.Use jnerator
fuente
Aquí está el código de trabajo para mí
Quería convertir la cadena ' Texto ' a elemento HTML
fuente
wwww
?var msg = "prueba" jQuery.parseHTML (msg)
fuente
Esto también funcionará:
Se siente más como una forma jquery con las llamadas de función encadenadas.
fuente