Mam tablicę, przez którą przechodzę. Za każdym razem, gdy warunek jest spełniony, chcę dołączyć kopię HTML
poniższego kodu do elementu kontenera z pewnymi wartościami.
Gdzie mogę umieścić ten kod HTML w celu ponownego wykorzystania w inteligentny sposób?
<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
źródło
źródło
Odpowiedzi:
Możesz zdecydować się na użycie silnika szablonów w swoim projekcie, takiego jak:
Jeśli nie chcesz dołączać innej biblioteki, John Resig oferuje rozwiązanie jQuery , podobne do tego poniżej.
Przeglądarki i czytniki ekranu ignorują nierozpoznane typy skryptów:
Za pomocą jQuery dodawanie wierszy na podstawie szablonu wyglądałoby następująco:
źródło
Stare pytanie, ale ponieważ pytanie dotyczy „używania jQuery”, pomyślałem, że udostępnię opcję, która pozwoli ci to zrobić bez wprowadzania zależności od dostawcy.
Chociaż istnieje wiele silników tworzących szablony , wiele z ich funkcji zostało ostatnio zniechęconych, a iteracja (
<% for
), warunki warunkowe (<% if
) i transformacje (<%= myString | uppercase %>
) są postrzegane w najlepszym przypadku jako mikroling, a w najgorszym - anty-wzorce. Nowoczesne praktyki tworzenia szablonów zachęcają do prostego mapowania obiektu na jego reprezentację DOM (lub inną), np. To, co widzimy z właściwościami odwzorowanymi na komponenty w ReactJS (zwłaszcza komponenty bezstanowe).Szablony wewnątrz HTML
Jedną z właściwości, na której możesz polegać, aby zachować kod HTML swojego szablonu obok reszty kodu HTML, jest użycie niewykonującego się kodu
<script>
type
, np<script type="text/template">
. W Twoim przypadku:Podczas ładowania dokumentu przeczytaj swój szablon i stokenizuj go za pomocą prostego pliku
String#split
Zauważ, że z naszym tokenem otrzymujesz go w naprzemiennym
[text, property, text, property]
formacie. To pozwala nam ładnie zmapować go za pomocąArray#map
, z funkcją mapowania:Gdzie
props
mogłoby wyglądać{ url: 'http://foo.com', img: '/images/bar.png', title: 'Lorem Ipsum' }
.Składając to wszystko razem, zakładając, że przeanalizowałeś i załadowałeś swój
itemTpl
jak powyżej i maszitems
tablicę w zakresie:To podejście jest tylko ledwie jQuery - powinieneś być w stanie zastosować to samo podejście, używając zwykłego javascript z
document.querySelector
i.innerHTML
.jsfiddle
Szablony wewnątrz JS
Pytanie, które należy sobie zadać, brzmi: czy naprawdę chcesz / musisz definiować szablony jako pliki HTML? Zawsze możesz skomponować + ponownie użyć szablonu w taki sam sposób, w jaki używałbyś większości rzeczy, które chcesz powtórzyć: za pomocą funkcji.
W es7-land, używając destrukturyzacji, ciągów szablonów i funkcji strzałek, możesz napisać całkiem ładnie wyglądające funkcje składowe, które można łatwo załadować za pomocą
$.fn.html
powyższej metody.Wtedy możesz go łatwo wyrenderować, nawet zmapowany z tablicy, na przykład:
Aha i ostatnia uwaga: nie zapomnij oczyścić swoich właściwości przekazanych do szablonu, jeśli są odczytywane z bazy danych lub ktoś może przekazać HTML (a następnie uruchomić skrypty itp.) Ze strony.
źródło
Zamiast tego użyj szablonu HTML!
Ponieważ zaakceptowana odpowiedź reprezentowałaby metodę skryptową przeciążającą, chciałbym zasugerować inną, która moim zdaniem jest znacznie czystsza i bezpieczniejsza ze względu na ryzyko XSS, które wiąże się z przeciążaniem skryptów.
Zrobiłem demo, aby pokazać, jak użyć go w akcji i jak wstrzyknąć jeden szablon do drugiego, edytować, a następnie dodawać do dokumentu DOM.
przykład html
przykład js
HTML <szablon>
+ Jego zawartość jest efektywnie obojętna, dopóki nie zostanie aktywowana. Zasadniczo twój znacznik jest ukryty DOM i nie renderuje się.
+ Żadna zawartość w szablonie nie będzie miała skutków ubocznych. Skrypty nie działają, obrazy się nie ładują, dźwięk nie jest odtwarzany ... do momentu użycia szablonu.
+ Uważa się, że treść nie znajduje się w dokumencie. Użycie
document.getElementById()
lubquerySelector()
na stronie głównej nie zwróci węzłów potomnych szablonu.+ Szablonów mogą być umieszczone w dowolnym miejscu wewnątrz
<head>
,<body>
albo<frameset>
i może zawierać dowolny rodzaj zawartości, który pozostawia się w tych elementach. Zauważ, że „wszędzie” oznacza, że<template>
można go bezpiecznie używać w miejscach, na które parser HTML nie zezwala.Spadać
Obsługa przeglądarki nie powinna stanowić problemu, ale jeśli chcesz objąć wszystkie możliwości, możesz łatwo sprawdzić:
Kilka spostrzeżeń na temat metody skryptu przeciążania
<script>
tag madisplay:none
domyślnie."text/javascript"
..innerHTML
. Analiza ciągów znaków w czasie wykonywania danych dostarczonych przez użytkownika może łatwo doprowadzić do luk w zabezpieczeniach XSS.Cały artykuł: https://www.html5rocks.com/en/tutorials/webcomponents/template/#toc-old
Przydatne źródła: https://developer.mozilla.org/en-US/docs/Web/API/Document/importNode http://caniuse.com/#feat=queryselector
TWORZENIE KOMPONENTÓW INTERNETOWYCH Samouczek dotyczący tworzenia niestandardowych komponentów internetowych przy użyciu szablonów HTML firmy Trawersy Media: https://youtu.be/PCWaFLy3VUo
źródło
template
Element nie jest obsługiwany przez program Internet Explorer (począwszy od roku 2018, IE11). Przetestowano na przykładzie 580 witryny w3c.github.io/html/single-page.html .<template>
, chociaż zalecałbym swobodne używanie klas, więc jest jasne, jakie rekwizyty są ustawiane na co. Nadal potrzeba pewnych umiejętności js, aby poprawnie odwzorować dane w szablonie, szczególnie przy użyciu podejścia opartego na komponentach do mapowania w dużych zbiorach danych. Osobiście nadal lubię po prostu budować HTML w funkcjach lub najlepiej budować DOM bezpośrednio za pomocą samego JS i całkowicie rezygnować z HTML (np. Jak to robi React).Dodaj gdzieś w ciele
następnie utwórz css
i dodaj do swojego js
źródło
.children().clone()
niż.html()
. Szybkość wynosi około 3: 1 dla losowej strony,<tr/>
którą miałem na stronie używającej tego kodui=10000; time=performance.now(); while (--i) {$a.clone().append(0 ? $b.html() : $b.children().clone())} performance.now()-time
. Współczynnik jest właściwie nieco bardziej przesadzony, ponieważ używam $ a.clone (), ale próba opróżnienia go w każdej iteracji jest bardziej uderzeniem wydajnościowym niż klonowaniem, więc nie jestem pewien, jak zwiększyć dokładność, ponieważ funkcje czasowe mają swój własny koszt.Inna alternatywa: Pure
Używam go i bardzo mi to pomogło. Przykład pokazany na ich stronie internetowej:
HTML
JSON
Wynik
źródło
Aby rozwiązać ten problem, poznaję dwa rozwiązania:
Pierwsza dotyczy AJAX, za pomocą której będziesz musiał załadować szablon z innego pliku i dodawać go za każdym razem, gdy chcesz
.clone()
.Weź pod uwagę, że zdarzenie powinno zostać dodane po zakończeniu AJAX, aby mieć pewność, że dane są dostępne!
Drugim byłoby dodanie go bezpośrednio w dowolnym miejscu w oryginalnym html, zaznaczenie go i ukrycie w jQuery:
Możesz po dodaniu nowej instancji szablonu za pomocą
Tak samo jak poprzedni, ale jeśli nie chcesz, aby szablon tam pozostał, ale tylko w javascript, myślę, że możesz użyć (nie testowałem tego!)
.detach()
Zamiast hide..detach()
usuwa elementy z DOM, zachowując przy życiu dane i zdarzenia (.remove () nie!).źródło
Bardzo dobra odpowiedź od DevWL na temat używania natywnego elementu szablonu HTML5 . Aby przyczynić się do tego dobrego pytania z PO, chciałbym dodać, jak używać tego
template
elementu za pomocą jQuery, na przykład:Treść
template
nie jest html, ale jest traktowana jako dane, więc musisz opakować zawartość w obiekt jQuery, aby uzyskać dostęp do metod jQuery.źródło