[英]Vanilla JS: Rendering a <template> tag with a Javascript object
[英]Compiling and rendering handlebars template with vanilla JS
我正在編寫一個使用handlebars.js的應用程序,但他們網站上的示例代碼使用JQuery以及許多其他在線資源。 但是,我想簡單地使用香草js編譯並渲染車把模板。
這是HTML模板
<script id="entry-template" type="text/x-handlebars-template">
<div class="entry">
<h1>{{title}}</h1>
<div class="body">
{{body}}
</div>
</div>
</script>
我在編譯時使用的JS在下面,如此處對類似問題的回答中所建議的那樣, 把手是否需要jQuery
var source = document.getElementById('entry-template').innerHTML;
var template = Handlebars.compile(source);
假設我的JSON存儲在名為myData的變量中。
使用JQuery呈現模板時,您只需
$('#data-section').append(template(myData));
但是我想使用香草JS,所以我這樣做:
var compiledHTML = template(myData);
var dataContainer = document.getElementById('data-section');
dataContainer.appendChild(compiledHTML);
但是我得到了錯誤
Uncaught TypeError: Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'.
我該如何工作?
調用已編譯模板的輸出是字符串,而不是DOM樹。 您可能要改用innerHTML
。
dataContainer.innerHTML = compiledHTML;
您可以使用跨瀏覽器友好的Element.insertAdjacentHTML
方法。
在此處查看文檔: https : //developer.mozilla.org/zh-CN/docs/Web/API/Element/insertAdjacentHTML
如何將已編譯的模板插入DOM有四個選項:
在我的情況下,我將模板附加到body標簽的末尾,因此看起來就像document.getElementsByTagName('body')[0].insertAdjacentHTML("beforeend", myHbsTemplate(VM));
問題似乎在於事實,即變量compedHTML是字符串。 我使用的解決方案是使用DOMparser,它使我可以將字符串轉換為DOM節點,然后將其傳遞給appendChild。
我正在使用的代碼是這樣
var parser = new DOMParser();
var convertedHtml = parser.parseFromString(compiledHTML, 'text/xml');
dataContainer.appendChild(convertedHtml.documentElement);
我必須使用documentElement,因為解析產生的HTML會產生HierarchyRequestError錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.