Estoy tratando de obtener el HTML de un objeto seleccionado con jQuery. Soy consciente de la .html()
función; El problema es que necesito el HTML que incluye el objeto seleccionado (una fila de tabla en este caso, donde .html()
solo devuelve las celdas dentro de la fila).
He buscado alrededor y he encontrado algunos métodos de tipo muy 'hack' para clonar un objeto, agregarlo a un div recién creado, etc., etc., pero esto parece realmente sucio. ¿Hay alguna manera mejor, o la nueva versión de jQuery (1.4.2) ofrece algún tipo de outerHtml
funcionalidad?
$('div')[0].outerHTML
.Respuestas:
Edición de 2014: la pregunta y esta respuesta son de 2010. En ese momento, no había una solución mejor disponible. Ahora, muchas de las otras respuestas son mejores: las de Eric Hu o Re Capcha, por ejemplo.
Este sitio parece tener una solución para usted: jQuery: outsideHTML | Yelotofu
fuente
outerHTML
es compatible con Firefox desde la versión 11 (marzo de 2012).outerHTML
es un atributo patentado inventado por Microsoft, no un estándar W3C. (Dato curioso:innerHTML
está estandarizado solo desde HTML5 )el.outerHTML || document.createElement('div').appendChild( el.cloneNode( true ) ).parentNode.innerHTML
Creo que actualmente (5/1/2012), todos los principales navegadores admiten la función externalHTML. Me parece que este fragmento es suficiente. Yo personalmente elegiría memorizar esto:
EDITAR : estadísticas básicas de soporte para
element.outerHTML
fuente
No es necesario generar una función para ello. Solo hazlo así:
(La consola de su navegador mostrará lo que está registrado, por cierto. La mayoría de los navegadores más recientes desde alrededor de 2009 tienen esta característica).
La magia es esta al final:
El clon significa que en realidad no estás molestando al DOM. Ejecútalo sin él y verás
p
etiquetas insertadas antes / después de todos los hipervínculos (en este ejemplo), lo que no es deseable. Entonces, sí, usa.clone()
.La forma en que funciona es que toma cada
a
etiqueta, hace un clon de la misma en la RAM, la envuelve con lasp
etiquetas, obtiene la matriz (es decir, lap
etiqueta) y luego obtiene la etiquetainnerHTML
propiedad de la misma.EDITAR : tomó consejos y cambió
div
etiquetas ap
etiquetas porque es menos tipeado y funciona igual.fuente
¿Qué pasa con
prop('outerHTML')
:?Y para configurar:
Funcionó para mi.
PD : Esto se agrega en jQuery 1.6 .
fuente
Extienda jQuery:
Y úsalo así:
$("#myTableRow").outerHTML();
fuente
return $('<div>').append(this.clone()).html();
Es solo un poco más al grano.Estoy de acuerdo con Arpan (Dec 13 '10 5:59).
Su forma de hacerlo es en realidad una forma MUCHO mejor de hacerlo, ya que no usas clon. El método de clonación consume mucho tiempo, si tiene elementos secundarios, y a nadie más parece importarle que IE TENGA el
outerHTML
atributo (sí, IE en realidad tiene ALGUNOS trucos útiles bajo la manga).Pero probablemente crearía su guión un poco diferente:
fuente
clone()
ytextarea
's, necesitaba una solución no clonada, y esto fue perfecto.outerHTML
donde esté disponible, ya que es compatible con Chrome además de Internet Explorer.Para ser verdaderamente jQuery-esque, es posible que desee
outerHTML()
ser un getter y un setter y que su comportamiento sea lo más similarhtml()
posible:Esto nos permite pasar un argumento a
outerHTML
, que puede serfunction (index, oldOuterHTML) { }
- donde el valor de retorno se convertirá en el nuevo HTML para el elemento (a menos quefalse
se devuelva).Para obtener más información, consulte los documentos de jQuery para
html()
.fuente
También puede usar get (recuperar los elementos DOM que coinciden con el objeto jQuery).
p.ej:
Como método de extensión:
O
Opción múltiple y devolver el html externo de todos los elementos coincidentes.
regreso:
fuente
Para crear un complemento jQuery COMPLETO como
.outerHTML
, agregue el siguiente script a cualquier archivo js e incluya después de jQuery en su encabezado:¡Esto le permitirá no solo obtener el HTML externo de un elemento, sino incluso obtener una matriz de retorno de varios elementos a la vez! y se puede usar en ambos estilos estándar de jQuery como tales:
Para elementos múltiples
Ejemplos de fragmentos:
Mostrar fragmento de código
fuente
también puedes hacerlo de esta manera
donde id es el id del elemento que estás buscando
fuente
$("#" + id).attr("id")
Es increíblemente redundante. Si ya tiene la identificación en una variable, ¿por qué está usando un selector jquery para extraer el elemento del dom y luego consultar su atributo ID?Usé la solución de Jessica (que fue editada por Josh) para hacer que externalHTML funcionara en Firefox. Sin embargo, el problema es que mi código se estaba rompiendo porque su solución envolvió el elemento en un DIV. Agregar una línea más de código resolvió ese problema.
El siguiente código le proporciona el HTML externo dejando el árbol DOM sin cambios.
Y úselo así: $ ("# myDiv"). ExternalHTML ();
¡Espero que alguien lo encuentre útil!
fuente
Violín aquí: http://jsfiddle.net/ezmilhouse/Mv76a/
fuente
Si el escenario agrega una nueva fila dinámicamente, puede usar esto:
.myrow
es el nombre de clase de la<tr>
. Hace una copia de la última fila y la inserta como una última última fila. Esto también funciona en IE7 , mientras que el[0].outerHTML
método no permite asignaciones en ie7fuente
node.cloneNode () difícilmente parece un hack. Puede clonar el nodo y agregarlo a cualquier elemento padre deseado, y también manipularlo manipulando propiedades individuales, en lugar de tener que, por ejemplo, ejecutar expresiones regulares en él o agregarlo al DOM, y luego manipularlo después.
Dicho esto, también puede iterar sobre los atributos del elemento para construir una representación de cadena HTML del mismo. Parece probable que así es como se implementaría cualquier función externalHTML si jQuery añadiera una.
fuente
He usado la solución de Volomike actualizada por Jessica. Solo agregué un cheque para ver si el elemento existe, y lo volví en blanco en caso de que no exista.
Por supuesto, úsalo como:
fuente
Puede encontrar una buena opción .outerHTML () aquí https://github.com/darlesson/jquery-outerhtml .
A diferencia de .html () que solo devuelve el contenido HTML del elemento, esta versión de .outerHTML () devuelve el elemento seleccionado y su contenido HTML o lo reemplaza como método .replaceWith () pero con la diferencia que permite que el HTML reemplazado sea heredado por El encadenamiento.
También se pueden ver ejemplos en la URL anterior.
fuente
Tenga en cuenta que la solución de Josh solo funciona para un único elemento.
Podría decirse que HTML "externo" solo tiene sentido cuando tiene un solo elemento, pero hay situaciones en las que tiene sentido tomar una lista de elementos HTML y convertirlos en marcas.
Ampliando la solución de Josh, este manejará múltiples elementos:
Editar: otro problema con la solución de Josh solucionado, ver comentario arriba.
fuente
Otra solución similar con agregado
remove()
del objeto DOM temporal.fuente
He hecho esta prueba simple con externalHTML como solución de tokimon (sin clon), y externalHTML2 como solución de jessica (clone)
y el resultado en mi navegador de cromo (Versión 20.0.1132.57 (0)) fue
externalHTML: 81ms
externalHTML2: 439ms
pero si usamos la solución de tokimon sin la función externa externa HTML (que ahora es compatible con casi todos los navegadores)
obtenemos
externalHTML: 594ms
externalHTML2: 332ms
y habrá más bucles y elementos en ejemplos del mundo real, por lo que la combinación perfecta sería
por lo que el método de clonación es realmente más rápido que el método de ajuste / desempaquetado
(jquery 1.7.2)
fuente
Aquí hay un plugin externalHTML muy optimizado para jquery: ( http://jsperf.com/outerhtml-vs-jquery-clone-hack/5 => los otros 2 fragmentos de código rápido no son compatibles con algunos navegadores como FF <11)
@Andy E => No estoy de acuerdo contigo. outsideHMTL no necesita un captador Y un definidor: jQuery ya nos da 'replaceWith' ...
@mindplay => ¿Por qué te unes a todos los HTML externos? jquery.html devuelve solo el contenido HTML del PRIMER elemento.
(Lo siento, no tengo suficiente reputación para escribir comentarios)
fuente
Corto y dulce.
o evento más dulce con la ayuda de las funciones de flecha
o sin jQuery en absoluto
o si no te gusta este enfoque, verifica que
fuente
Esto es bastante simple con JavaScript vainilla ...
fuente
Esto es ideal para cambiar elementos en el dom, pero NO funciona, es decir, al pasar una cadena html a jquery de esta manera:
Después de alguna manipulación, he creado una función que permite que lo anterior funcione, es decir, para cadenas html:
fuente
$.html = el => $("<div>"+el+"</div>").html().trim();
fuente
Encontré esto mientras buscaba una respuesta a mi problema, que era que estaba tratando de eliminar una fila de la tabla y luego volver a agregarla en la parte inferior de la tabla (porque estaba creando dinámicamente filas de datos pero quería mostrar un 'Agregar nuevo Registro 'tipo fila en la parte inferior).
Tuve el mismo problema, ya que estaba devolviendo el innerHtml, por lo que me faltaban las etiquetas TR, que contenían la ID de esa fila y significaban que era imposible repetir el procedimiento.
La respuesta que encontré fue que la
remove()
función jquery en realidad devuelve el elemento, que elimina, como un objeto. Entonces, para eliminar y volver a agregar una fila, era tan simple como esto ...Si no está eliminando el objeto pero desea copiarlo en otro lugar, use la
clone()
función en su lugar.fuente
Complemento jQuery como abreviatura para obtener directamente el elemento HTML completo:
Y úsalo así:
$(".element").outerHTML();
fuente
Donde 'x' es el número de nodo, comenzando con 0 como el primero, debe obtener el nodo correcto que desea, si está intentando obtener uno específico. Sin embargo, si tiene nodos secundarios, realmente debería poner una ID en el que desea, sin embargo, para centrarse en ese. Usar esa metodología y no 'x' funcionó bien para mí.
fuente
.html()
elemento en el elemento dado. ESTO FUNCIONA y me gustaría una explicación de por qué no funciona.Solución simple.
fuente
Quizás no entiendo su pregunta correctamente, pero esto obtendrá el html del elemento padre del elemento seleccionado.
¿Es eso lo que buscas?
fuente