J'ai un tableau sur lequel je boucle. Chaque fois qu'une condition est vraie, je souhaite ajouter une copie du HTML
code ci-dessous à un élément conteneur avec certaines valeurs.
Où puis-je réutiliser ce code HTML de manière intelligente?
<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
la source
la source
Réponses:
Vous pouvez décider d'utiliser un moteur de création de modèles dans votre projet, tel que:
Si vous ne souhaitez pas inclure une autre bibliothèque, John Resig propose une solution jQuery , similaire à celle ci-dessous.
Les navigateurs et lecteurs d'écran ignorent les types de scripts non reconnus:
En utilisant jQuery, l'ajout de lignes basées sur le modèle ressemblerait à:
la source
Ancienne question, mais puisque la question demande "en utilisant jQuery", j'ai pensé fournir une option qui vous permet de faire cela sans introduire de dépendance au fournisseur.
Bien qu'il existe de nombreux moteurs de création de modèles, nombre de leurs fonctionnalités ont récemment été défavorisées, avec l'itération (
<% for
), les conditions (<% if
) et les transformations (<%= myString | uppercase %>
) considérées au mieux comme du microlangage, et au pire des anti-modèles. Les pratiques de création de modèles modernes encouragent simplement le mappage d'un objet à sa représentation DOM (ou autre), par exemple ce que nous voyons avec les propriétés mappées aux composants dans ReactJS (en particulier les composants sans état).Modèles dans HTML
Une propriété sur laquelle vous pouvez compter pour conserver le HTML de votre modèle à côté du reste de votre HTML consiste à utiliser un fichier non exécutable
<script>
type
, par exemple<script type="text/template">
. Pour votre cas:Lors du chargement du document, lisez votre modèle et jetez-le en utilisant un simple
String#split
Notez qu'avec notre token, vous l'obtenez au
[text, property, text, property]
format alterné . Cela nous permet de le mapper joliment en utilisant unArray#map
, avec une fonction de mappage:Où
props
pourrait ressembler{ url: 'http://foo.com', img: '/images/bar.png', title: 'Lorem Ipsum' }
.En supposant que vous avez analysé et chargé votre
itemTpl
comme ci-dessus, et que vous avez unitems
tableau dans la portée:Cette approche est également à peine jQuery - vous devriez être en mesure d'adopter la même approche en utilisant javascript vanilla avec
document.querySelector
et.innerHTML
.jsfiddle
Modèles dans JS
Une question à vous poser est: voulez-vous vraiment / avez-vous vraiment besoin de définir des modèles comme des fichiers HTML? Vous pouvez toujours composant + réutiliser un modèle de la même manière que vous réutiliseriez la plupart des choses que vous souhaitez répéter: avec une fonction.
Dans es7-land, en utilisant la déstructuration, les chaînes de modèle et les fonctions fléchées, vous pouvez écrire de jolies fonctions de composant qui peuvent être facilement chargées en utilisant la
$.fn.html
méthode ci-dessus.Ensuite, vous pouvez facilement le rendre, même mappé à partir d'un tableau, comme ceci:
Oh et note finale: n'oubliez pas de nettoyer vos propriétés passées à un modèle, si elles sont lues à partir d'une base de données, ou quelqu'un pourrait passer du HTML (puis exécuter des scripts, etc.) depuis votre page.
la source
Utilisez plutôt un modèle HTML!
Étant donné que la réponse acceptée représenterait une méthode de script de surcharge, je voudrais en suggérer une autre qui est, à mon avis, beaucoup plus propre et plus sûre en raison des risques XSS qui viennent avec la surcharge des scripts.
J'ai fait une démo pour vous montrer comment l'utiliser dans une action et comment injecter un modèle dans un autre, éditer puis ajouter au document DOM.
exemple html
exemple js
HTML <modèle>
+ Son contenu est effectivement inerte jusqu'à son activation. Essentiellement, votre balisage est masqué DOM et ne rend pas.
+ Tout contenu dans un modèle n'aura pas d'effets secondaires. Les scripts ne s'exécutent pas, les images ne se chargent pas, l'audio ne joue pas ... tant que le modèle n'est pas utilisé.
+ Le contenu est considéré comme ne faisant pas partie du document. L'utilisation de
document.getElementById()
ouquerySelector()
dans la page principale ne renvoie pas les nœuds enfants d'un modèle.+ Les modèles peuvent être placés n'importe où à l'intérieur de
<head>
,<body>
ou<frameset>
et peuvent contenir tout type de contenu autorisé dans ces éléments. Notez que «n'importe où» signifie qu'il<template>
peut être utilisé en toute sécurité dans des endroits que l'analyseur HTML interdit.Se retirer
La prise en charge du navigateur ne devrait pas être un problème, mais si vous souhaitez couvrir toutes les possibilités, vous pouvez effectuer une vérification facile:
Quelques informations sur la méthode de script de surcharge
<script>
balise l'adisplay:none
par défaut."text/javascript"
..innerHTML
. L'analyse des chaînes d'exécution des données fournies par l'utilisateur peut facilement conduire à des vulnérabilités XSS.Article complet: https://www.html5rocks.com/en/tutorials/webcomponents/template/#toc-old
Référence utile: https://developer.mozilla.org/en-US/docs/Web/API/Document/importNode http://caniuse.com/#feat=queryselector
CRÉATION DE COMPOSANTS WEB Tutoriel sur la création de composants Web personnalisés à l'aide de modèles HTML de Trawersy Media: https://youtu.be/PCWaFLy3VUo
la source
template
élément n'est pas pris en charge par Internet Explorer (à partir de 2018, IE11). Testé avec l'exemple 580 de w3c.github.io/html/single-page.html .<template>
, bien que je recommande d'utiliser les classes libéralement, donc il est clair quels accessoires sont définis sur quoi. Il faut encore quelques compétences js pour mapper correctement vos données dans le modèle, en particulier en utilisant une approche de type composants pour le mappage dans de grands ensembles de données. Personnellement, j'aime toujours simplement construire le HTML dans les fonctions, ou idéalement construire le DOM directement avec JS lui-même et renoncer complètement au HTML (par exemple, comment React le fait).Ajouter quelque part dans le corps
puis créez css
et ajoutez à vos js
la source
.children().clone()
que de le faire.html()
. La vitesse est d'environ 3: 1 pour un aléatoire<tr/>
que j'avais sur une page en utilisant ce codei=10000; time=performance.now(); while (--i) {$a.clone().append(0 ? $b.html() : $b.children().clone())} performance.now()-time
. Le rapport est en fait un peu plus exagéré car j'utilise $ a.clone (), mais essayer de le vider à chaque itération est plus un problème de performance que le clonage, donc je ne sais pas comment le rendre plus précis car les fonctions de chronométrage ont leur propre coût.Autre alternative: Pure
Je l'utilise et cela m'a beaucoup aidé. Un exemple montré sur leur site Web:
HTML
JSON
Résultat
la source
Afin de résoudre ce problème, je reconnais deux solutions:
Le premier va avec AJAX, avec lequel vous devrez charger le modèle à partir d'un autre fichier et l'ajouter à chaque fois que vous le souhaitez
.clone()
.Tenez compte du fait que l'événement doit être ajouté une fois que l'ajax est terminé pour être sûr que les données sont disponibles!
Le second serait de l'ajouter directement n'importe où dans le html d'origine, de le sélectionner et de le cacher dans jQuery:
Vous pouvez ensuite ajouter une nouvelle instance du modèle avec
Identique au précédent, mais si vous ne voulez pas que le template reste là, mais juste dans le javascript, je pense que vous pouvez utiliser (ne l'avez pas testé!) Au
.detach()
lieu de hide..detach()
supprime les éléments du DOM tout en gardant les données et les événements en vie (.remove () ne le fait pas!).la source
Très bonne réponse de DevWL sur l'utilisation de l' élément de modèle HTML5 natif . Pour contribuer à cette bonne question de l'OP, je voudrais ajouter comment utiliser cet
template
élément en utilisant jQuery, par exemple:Le contenu de
template
n'est pas html, mais simplement traité comme des données, vous devez donc envelopper le contenu dans un objet jQuery pour accéder aux méthodes de jQuery.la source