![](/img/trans.png)
[英]How to convert from mixed HTML-string/DOM-elements to DOM-elements in Javascript?
[英]Extract elements from html-string in ClojureScript
對於ClojureScript
項目,我正在尋找一種簡潔的方法來從客戶端的外部HTML
文檔中提取內容。 實際上,該內容是通過Markdown
格式的ajax調用接收的,隨后將其解析為HTML
。 因此, HTML
字符串是出發點。
(def html-string "<p>Something, that <a>was</a> Markdown before</p>")
例如, Enlive
和Garden
庫使用向量來表達CSS選擇器,這在這里是必需的。 Enlive
有一個稱為Enfocus
的前端姐妹,它提供類似的語義。
這是一個enfocus
示例,該示例從當前DOM中提取一些內容:
(require '[enfocus.core :as ef])
(ef/from js/document.head :something [:title]
(ef/get-text))
;;{:something "My Title"}
如果有更多匹配,則:something
的值將成為向量。 我不知道如何在任意HTML
字符串上應用此功能。 我能得到的最接近的是使用此函數:
(defn html->node [h]
(doto (.createElement js/document "div")
(aset "innerHTML" h)))
接着:
(ef/from (html->node html-string) :my-link [:a]
(ef/get-text))
;;{:my-link "was"}
但是,這並不是很干凈,因為現在有一個div包裝了所有內容,這在某些情況下可能會引起麻煩。
在div
插入一些HTML內容可以自動評估您的任意HTML。 相反,您應該執行的操作是使用此類內容解析HTML字符串。
(defn parse-html [html]
"Parse an html string into a document"
(let [doc (.createHTMLDocument js/document.implementation "mydoc")]
(set! (.-innerHTML doc.documentElement) html)
doc
))
這是簡單明了的ClojureScript,如果您希望深入goog.dom命名空間或Google Closure API中的其他位置,使用Google Closure庫可能會更優雅。
然后,您解析HTML字符串:
(def html-doc (parse-html "<body><div><p>some of my stuff</p></div></body>"))
因此,您可以在文檔上調用Enfocus:
(ef/from html-doc :mystuff [:p] (ef/get-text))
結果:
{:mystuff "some of my stuff"}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.