Tengo una matriz que estoy recorriendo. Cada vez que una condición es verdadera, quiero adjuntar una copia delHTML
código a continuación a un elemento contenedor con algunos valores.
¿Dónde puedo poner este HTML para reutilizarlo de forma inteligente?
<a href="#" class="list-group-item">
<div class="image">
<img src="" />
</div>
<p class="list-group-item-text"></p>
</a>
JQuery
$('.search').keyup(function() {
$('.list-items').html(null);
$.each(items, function(index) {
// APPENDING CODE HERE
});
});
javascript
jquery
json
Patrick Reck
fuente
fuente
Respuestas:
Puede decidir hacer uso de un motor de plantillas en su proyecto, como:
Si no desea incluir otra biblioteca, John Resig ofrece una solución jQuery , similar a la que se muestra a continuación.
Los navegadores y lectores de pantalla ignoran los tipos de secuencia de comandos no reconocidos:
Usando jQuery, agregar filas basadas en la plantilla se parecería a:
fuente
Pregunta antigua, pero como la pregunta es "usar jQuery", pensé en proporcionar una opción que le permita hacer esto sin introducir ninguna dependencia del proveedor.
Si bien hay muchos motores de plantillas, muchas de sus características han caído en desuso recientemente, con iteración (
<% for
), condicionales (<% if
) y transformaciones (<%= myString | uppercase %>
) vistos como microlenguaje en el mejor de los casos y como antipatrones en el peor. Las prácticas modernas de creación de plantillas fomentan la simple asignación de un objeto a su representación DOM (u otra), por ejemplo, lo que vemos con las propiedades asignadas a los componentes en ReactJS (especialmente los componentes sin estado).Plantillas dentro de HTML
Una propiedad en la que puede confiar para mantener el HTML de su plantilla junto al resto de su HTML es mediante el uso de un código no ejecutable
<script>
type
, por ejemplo<script type="text/template">
. Para tu caso:Al cargar el documento, lea su plantilla y conviértala en token con un simple
String#split
Tenga en cuenta que con nuestro token, lo obtiene en
[text, property, text, property]
formato alterno . Esto nos permite mapearlo muy bien usando anArray#map
, con una función de mapeo:Dónde
props
podría verse{ url: 'http://foo.com', img: '/images/bar.png', title: 'Lorem Ipsum' }
.Poniéndolo todo junto asumiendo que has analizado y cargado tu
itemTpl
como arriba, y tienes unaitems
matriz dentro del alcance:Este enfoque también es apenas jQuery: debería poder adoptar el mismo enfoque usando javascript vanilla con
document.querySelector
y.innerHTML
.jsfiddle
Plantillas dentro de JS
Una pregunta que debe hacerse es: ¿realmente desea / necesita definir plantillas como archivos HTML? Siempre puede componenteizar + reutilizar una plantilla de la misma manera que reutilizaría la mayoría de las cosas que desea repetir: con una función.
En es7-land, usando desestructuración, cadenas de plantilla y funciones de flecha, puede escribir funciones de componentes de aspecto francamente bonito que se pueden cargar fácilmente usando el
$.fn.html
método anterior.Entonces podría renderizarlo fácilmente, incluso mapeado desde una matriz, así:
Ah, y nota final: no se olvide de desinfectar sus propiedades pasadas a una plantilla, si se leen desde una base de datos, o si alguien podría pasar HTML (y luego ejecutar scripts, etc.) desde su página.
fuente
¡Utilice plantilla HTML en su lugar!
Dado que la respuesta aceptada representaría un método de script de sobrecarga, me gustaría sugerir otro que, en mi opinión, es mucho más limpio y seguro debido a los riesgos de XSS que vienen con los scripts de sobrecarga.
Hice una demostración para mostrarte cómo usarlo en una acción y cómo inyectar una plantilla en otra, editar y luego agregar al documento DOM.
ejemplo html
ejemplo js
HTML <plantilla>
+ Su contenido es efectivamente inerte hasta que se activa. Esencialmente, su marcado es DOM oculto y no se procesa.
+ Cualquier contenido dentro de una plantilla no tendrá efectos secundarios. Los scripts no se ejecutan, las imágenes no se cargan, el audio no se reproduce ... hasta que se usa la plantilla.
+ Se considera que el contenido no está en el documento. El uso de
document.getElementById()
oquerySelector()
en la página principal no devolverá los nodos secundarios de una plantilla.+ Las plantillas se pueden colocar en cualquier lugar dentro de
<head>
,<body>
o<frameset>
y pueden contener cualquier tipo de contenido que esté permitido en esos elementos. Tenga en cuenta que "en cualquier lugar" significa que<template>
se puede utilizar de forma segura en lugares que el analizador HTML no permite.Retroceder
La compatibilidad con el navegador no debería ser un problema, pero si desea cubrir todas las posibilidades, puede realizar una verificación sencilla:
Algunas ideas sobre el método de script de sobrecarga
<script>
etiqueta tienedisplay:none
de forma predeterminada."text/javascript"
..innerHTML
. El análisis de cadenas en tiempo de ejecución de los datos proporcionados por el usuario puede conducir fácilmente a vulnerabilidades XSS.Articulo completo: https://www.html5rocks.com/en/tutorials/webcomponents/template/#toc-old
Referencia útil: https://developer.mozilla.org/en-US/docs/Web/API/Document/importNode http://caniuse.com/#feat=queryselector
CREACIÓN DE COMPONENTES WEB Tutorial de creación de componentes web personalizados utilizando plantillas HTML de Trawersy Media: https://youtu.be/PCWaFLy3VUo
fuente
template
elemento no es compatible con Internet Explorer (a partir de 2018, IE11). Probado con el ejemplo 580 de w3c.github.io/html/single-page.html .<template>
, aunque recomendaría usar las clases generosamente, por lo que está claro qué accesorios se están configurando para qué. Todavía se necesitan algunas habilidades de js para mapear sus datos en la plantilla correctamente, especialmente usando un enfoque de estilo de componentes para mapear grandes conjuntos de datos. Personalmente, todavía me gusta simplemente construir el HTML en funciones, o idealmente construir el DOM directamente con JS y renunciar al HTML por completo (por ejemplo, cómo lo hace React).Agregar en algún lugar del cuerpo
luego crea css
y agrega a tu js
fuente
.children().clone()
lugar de hacerlo.html()
. La velocidad es de aproximadamente 3: 1 para un aleatorio<tr/>
que tuve en una página usando este códigoi=10000; time=performance.now(); while (--i) {$a.clone().append(0 ? $b.html() : $b.children().clone())} performance.now()-time
. La proporción es en realidad un poco más exagerada porque estoy usando $ a.clone (), pero intentar vaciarlo en cada iteración es más un impacto en el rendimiento que la clonación, por lo que no estoy seguro de cómo hacerlo más preciso porque las funciones de cronometraje tienen su propio costo.Otra alternativa: pura
Lo uso y me ha ayudado mucho. Un ejemplo que se muestra en su sitio web:
HTML
JSON
Resultado
fuente
Para resolver este problema, reconozco dos soluciones:
El primero va con AJAX, con el que tendrás que cargar la plantilla desde otro archivo y solo agregar cada vez que quieras
.clone()
.¡Tenga en cuenta que el evento debe agregarse una vez que se haya completado el ajax para asegurarse de que los datos estén disponibles!
El segundo sería agregarlo directamente en cualquier lugar del html original, seleccionarlo y ocultarlo en jQuery:
Después puede agregar una nueva instancia de la plantilla con
Igual que el anterior, pero si no desea que la plantilla permanezca allí, pero solo en el javascript, creo que puede usar (¡no lo he probado!) En
.detach()
lugar de ocultar..detach()
elimina elementos del DOM mientras mantiene vivos los datos y eventos (.remove () no lo hace).fuente
Muy buena respuesta de DevWL sobre el uso del elemento de plantilla HTML5 nativo . Para contribuir a esta buena pregunta del OP, me gustaría agregar cómo usar este
template
elemento usando jQuery, por ejemplo:El contenido
template
no es html, sino que solo se trata como datos, por lo que debe envolver el contenido en un objeto jQuery para luego acceder a los métodos de jQuery.fuente