Szukałem rozwiązania, ale nic nie było istotne, więc oto mój problem:
Chcę przeanalizować ciąg zawierający tekst HTML. Chcę to zrobić w JavaScript.
Wypróbowałem tę bibliotekę, ale wygląda na to, że analizuje ona HTML mojej bieżącej strony, a nie ciąg znaków. Ponieważ kiedy wypróbuję poniższy kod, zmienia tytuł mojej strony:
var parser = new HTMLtoDOM("<html><head><title>titleTest</title></head><body><a href='test0'>test01</a><a href='test1'>test02</a><a href='test2'>test03</a></body></html>", document);
Moim celem jest wyodrębnienie linków ze strony zewnętrznej HTML, którą czytam jak ciąg znaków.
Czy znasz interfejs API, aby to zrobić?
javascript
html
dom
html-parsing
etap
źródło
źródło
doc.getElementsByTagName('a')
do odczytania linków (lub nawetdoc.links
).Odpowiedzi:
Utwórz fikcyjny element DOM i dodaj do niego ciąg. Następnie możesz nim manipulować jak dowolnym elementem DOM.
Edycja: dodając odpowiedź jQuery, aby zadowolić fanów!
źródło
document.createElement('html');
zachować tagi<head>
i<body>
.parse()
rozwiązanie jest bardziej wielokrotnego użytku i eleganckie.To dość proste:
Według MDN , aby to zrobić w chrome, musisz parsować jako XML tak:
Obecnie nie jest obsługiwany przez webkit i musisz podążać za odpowiedzią Floriana, a w większości przypadków nie działa w przeglądarkach mobilnych.Edycja: teraz szeroko obsługiwany
źródło
documentURL
zwindow
, który najprawdopodobniej różni się od adresu URL ciągu.new DOMParser
raz, a następnie ponownie użyć tego samego obiektu w pozostałej części skryptu.parse()
rozwiązanie jest bardziej przydatne i specyficzne dla HTML. Jest to jednak przydatne, jeśli potrzebujesz dokumentu XML.EDYCJA: Poniższe rozwiązanie dotyczy tylko „fragmentów” HTML, ponieważ html, head i body są usuwane. Wydaje mi się, że rozwiązaniem tego pytania jest metoda parseFromString () DOMParsera.
W przypadku fragmentów HTML wymienione tutaj rozwiązania działają dla większości HTML, jednak w niektórych przypadkach nie będą działać.
Na przykład spróbuj parsować
<td>Test</td>
. Ten nie będzie działał z rozwiązaniem div.innerHTML ani DOMParser.prototype.parseFromString ani z range.createContextualFragment. Tag td znika i pozostaje tylko tekst.Tylko jQuery dobrze sobie z tym radzi.
Zatem przyszłym rozwiązaniem (MS Edge 13+) jest użycie tagu szablonu:
W przypadku starszych przeglądarek wyodrębniłem metodę parseHTML () jQuery do niezależnej listy - https://gist.github.com/Munawwar/6e6362dbdf77c7865a99
źródło
<template>
tag tagiem . To zależy od niestandardowych elementów, które mogą być również potrzebne do wypełniania . W rzeczywistości możesz po prostu użyć webcomponents.js, aby za jednym razem polifillować niestandardowe elementy, szablony, shadow dom, obietnice i kilka innych rzeczy.źródło
$
? Ponadto, jak wspomniano w połączonym duplikacie ,text/html
nie jest on obsługiwany bardzo dobrze i musi zostać zaimplementowany przy użyciu wypełniacza wielofunkcyjnego.DOMParser
żadna z nich nie działatext/html
w chrome, ta strona MDN daje obejście.Najszybszym sposobem na parsowanie HTML w Chrome i Firefox jest Range # createContextualFragment:
Poleciłbym utworzyć funkcję pomocnika, która używa createContextualFragment, jeśli jest dostępna, w przeciwnym razie wraca do innerHTML.
Benchmark: http://jsperf.com/domparser-vs-createelement-innerhtml/3
źródło
innerHTML
, to będzie wykonać<img>
„sonerror
.Zwróci następującą funkcję
parseHTML
:a,
Document
gdy plik zaczyna się od typu dokumentu.a
DocumentFragment
gdy plik nie zaczyna się od typu dokumentu.Kod :
Jak używać :
źródło
trim
metody na łańcuchach. Zobacz stackoverflow.com/q/2308134/3210837 .Jeśli jesteś otwarty na używanie jQuery, ma kilka ciekawych funkcji do tworzenia odłączonych elementów DOM z ciągów HTML. Można je następnie przesłać w zwykły sposób, np .:
Edytuj - właśnie widziałem odpowiedź @ Florian, która jest poprawna. Jest to w zasadzie dokładnie to, co powiedział, ale z jQuery.
źródło
Tylko poprawne dziecko
Node
w obrębie rodzicaNode
(początekRange
) zostanie przeanalizowane. W przeciwnym razie mogą wystąpić nieoczekiwane wyniki:źródło
za pomocą tego prostego kodu możesz to zrobić:
źródło