Mam ciąg reprezentujący element HTML: '<li>text</li>'
. Chciałbym dołączyć go do elementu w DOM ( ul
w moim przypadku a). Jak mogę to zrobić za pomocą Prototypu lub metod DOM?
(Wiem, że mógłbym to zrobić w jQuery, ale niestety nie używamy jQuery.)
javascript
dom
prototypejs
Omer Bokhari
źródło
źródło
var nodes = document.fromString("<b>Hello</b> <br>");
Odpowiedzi:
Uwaga: większość obecnych przeglądarek obsługuje
<template>
elementy HTML , które zapewniają bardziej niezawodny sposób obracania tworzenia elementów z ciągów. Aby uzyskać szczegółowe informacje, zobacz odpowiedź Marka Amery poniżej .W przypadku starszych przeglądarek i węzła / jsdom : (który nie obsługuje jeszcze
<template>
elementów w momencie pisania), użyj następującej metody. To samo robią biblioteki, aby uzyskać elementy DOM z łańcucha HTML ( z dodatkową pracą dla IE do obejścia błędów związanych z implementacjąinnerHTML
):Zauważ, że w przeciwieństwie do szablonów HTML , nie będzie to działać w przypadku niektórych elementów, które nie mogą legalnie być dziećmi elementów
<div>
takich jak<td>
s.Jeśli już korzystasz z biblioteki, radzę trzymać się zatwierdzonej przez bibliotekę metody tworzenia elementów z ciągów HTML:
update()
metodę .jQuery(html)
andjQuery.parseHTML
metod.źródło
createElementFromHTML
wprowadza w błąd, ponieważdiv.firstChild
zwraca wartość,Node
która nie jestHTMLElement
npnode.setAttribute
. Nie może . Aby zamiast tego utworzyćElement
zwrotdiv.firstElementChild
z funkcji.<div>
pakowanie kodu HTML, który dodałem,.innerHTML
mnie denerwowało. Nigdy nie myślałem o użyciu.firstChild
.div
a wynik jest wyświetlany,[object SVGSVGElement]
gdy dziennik konsoli podaje poprawny element DOM. Co ja robię źle?W HTML 5 wprowadzono
<template>
element, który można wykorzystać do tego celu (jak teraz opisano w specyfikacji WhatWG i dokumentach MDN ).<template>
Element służy do deklarowania fragmenty HTML, który może być wykorzystywany w skryptów. Element jest reprezentowany w DOM jako element,HTMLTemplateElement
który ma.content
właściwośćDocumentFragment
typu, aby zapewnić dostęp do zawartości szablonu. Oznacza to, że można przekonwertować ciąg HTML do elementów DOM ustawiającinnerHTML
się z<template>
elementu, a następnie sięgając dotemplate
„s.content
nieruchomości.Przykłady:
Zauważ, że podobne podejścia, które wykorzystują inny element kontenera, np.
div
Nie całkiem działają. HTML ma ograniczenia co do tego, jakie typy elementów mogą istnieć, w których innych typach elementów; na przykład nie możesz umieścićtd
jako bezpośredniego dzieckadiv
. Powoduje to zniknięcie tych elementów, jeśli spróbujesz ustawićinnerHTML
a,div
aby je zawierał. Ponieważ<template>
nie mają takich ograniczeń dotyczących ich zawartości, to niedociągnięcie nie dotyczy korzystania z szablonu.Jednak
template
nie jest obsługiwany w niektórych starych przeglądarkach. Od stycznia 2018 r. Mogę używać ... szacuje, że 90% użytkowników na całym świecie korzysta z przeglądarki obsługującejtemplate
s . W szczególności żadna wersja programu Internet Explorer nie obsługuje ich; Microsoft nie wdrożyłtemplate
wsparcia do czasu wydania Edge.Jeśli masz szczęście pisać kod skierowany tylko do użytkowników w nowoczesnych przeglądarkach, skorzystaj z nich już teraz. W przeciwnym razie użytkownik może chwilę poczekać, aż nadrobią zaległości.
źródło
html.trim
ale o wewnętrzne analizowanie ustawienia innerHTML. W moim przypadku usuwa ważne spacje będące częścią textNode. :-(Użyj insertAdjacentHTML () . Działa ze wszystkimi aktualnymi przeglądarkami, nawet z IE11.
źródło
insertAdjacentHTML
działa ze wszystkimi przeglądarkami od IE 4.0.innerHTML += ...
tego jest to, że odniesienia do poprzednich elementów są nadal nienaruszone przy użyciu tej metody.beforebegin
,afterbegin
,beforeend
,afterend
. Zobacz artykuł MDN.Nowsze implementacje DOM mają to
range.createContextualFragment
, co chcesz w sposób niezależny od frameworka.Jest szeroko obsługiwany. Dla pewności sprawdź zgodność w tym samym łączu MDN, ponieważ będzie się on zmieniał. Od maja 2017 r. Jest to:
źródło
innerHTML
div; niektóre elementy, takie jaktd
s, zostaną zignorowane i nie pojawią się w powstałym fragmencie.Nie potrzebujesz żadnych poprawek, masz natywny interfejs API:
źródło
<td>text</td>
. Wynika to z tego, żeDOMParser
próbuje parsować pełny dokument HTML i nie wszystkie elementy są prawidłowe jako elementy główne dokumentu.W przypadku niektórych fragmentów HTML, takich jak
<td>test</td>
div.innerHTML, DOMParser.parseFromString i range.createContextualFragment (bez odpowiedniego kontekstu) rozwiązania wymienione w innych odpowiedziach tutaj nie utworzą<td>
elementu.jQuery.parseHTML () obsługuje je poprawnie (wyodrębniłem funkcję parseHTML jQuery 2 do niezależnej funkcji, która może być używana w bazach kodu nie-jquery).
Jeśli obsługujesz tylko Edge 13+, łatwiej jest po prostu użyć tagu szablonu HTML5:
źródło
Oto prosty sposób:
źródło
Możesz utworzyć prawidłowe węzły DOM z ciągu znaków, używając:
document.createRange().createContextualFragment()
Poniższy przykład dodaje element przycisku na stronie pobierając znacznik z ciągu:
źródło
DocumentFragment
obiekt, nadal - ku memu wielkiemu zdziwieniu - cierpi z powodu tej samej wady co przyjęta odpowiedź: jeśli to zrobiszdocument.createRange().createContextualFragment('<td>bla</td>')
, otrzymasz fragment zawierający po prostu tekst „bla” bez<td>
elementu. A przynajmniej tak obserwuję w Chrome 63; Nie zagłębiłem się w specyfikację, aby dowiedzieć się, czy jest to prawidłowe zachowanie, czy nie.Dzięki Prototype możesz także:
HTML:
JS:
źródło
Korzystam z tej metody (działa w IE9 +), chociaż nie będzie ona analizować
<td>
ani innych nieprawidłowych bezpośrednich elementów potomnych:źródło
Aby dodatkowo ulepszyć przydatny fragment kodu .toDOM (), który możemy znaleźć w różnych miejscach, możemy teraz bezpiecznie korzystać odwrócone, pojedyncze apostrofy ( literałów szablonów ).
Więc możemy mieć pojedyncze i podwójne cudzysłowy w deklaracji html foo .
Tak się zachowuje Zachowują heredoki dla osób zaznajomionych z tym terminem.
Można to dodatkowo ulepszyć o zmienne, aby tworzyć złożone szablony:
Dlaczego więc nie użyć bezpośrednio
.innerHTML +=
? W ten sposób przeglądarka oblicza cały DOM, co jest znacznie wolniejsze.https://caniuse.com/template-literals
źródło
Dodałem
Document
prototyp, który tworzy element z łańcucha:źródło
td
s.HTML5 i ES6
<template>
Próbny
źródło
Późno, ale dla przypomnienia;
Możliwe jest dodanie trywialnego elementu do elementu docelowego jako kontenera i usunięcie go po użyciu.
// Testowane na chrome 23.0, firefox 18.0, tj. 7-8-9 i opera 12.11.
źródło
Najszybsze rozwiązanie do renderowania DOM z ciągu:
I tutaj możesz sprawdzić wydajność manipulacji DOM React vs. natywny JS
Teraz możesz po prostu użyć:
I oczywiście w niedalekiej przyszłości będziesz używać referencji z pamięci, ponieważ var „element” to twoja nowo utworzona DOM w dokumencie.
I pamiętaj, że „innerHTML =” działa bardzo wolno: /
źródło
Oto mój kod i działa:
źródło
Cholera, myślałem, że podzielę się tym ze skomplikowanym, ale jednak prostym podejściem, które wymyśliłem ... Może ktoś znajdzie coś przydatnego.
źródło
Dlaczego nie zrobić z natywnym js?
źródło
źródło
Możesz użyć następującej funkcji do konwersji tekstu „HTML” na element
źródło
td
s.Użyj jneratora
źródło
Oto działający kod dla mnie
Chciałem przekonwertować ciąg „ Tekst ” na element HTML
źródło
wwww
?var msg = "test" jQuery.parseHTML (msg)
źródło
To też zadziała:
To bardziej przypomina jquery z połączonymi wywołaniami funkcji.
źródło