gpt4 book ai didi

javascript - Mustache.js 外部模板(没有 jQuery)

转载 作者:搜寻专家 更新时间:2023-11-01 04:40:57 24 4
gpt4 key购买 nike

我正在编写一个不依赖 jQuery 的组件,我希望找到一种无需 jQuery 即可加载外部 Mustache.js 模板的方法。使用 jQuery 的 $.get 方法 appears to work ,但我正尝试在 vanilla JS 中执行此操作。

我尝试使用 XMLHttpRequest 并将模板附加到正文,然后然后用我的 JSON 对其进行补水,但是当我的 JS 尝试将 JSON 放入模板中时, 模板不在那里被水合 (cannot read property innerHTML of null)。这是我的代码(在 CoffeeScript 中,test.js 是 mustache 模板):

req2 = new XMLHttpRequest()
req2.onload = ->
foo = document.getElementById('thatsmyjam')
templ = document.createTextNode(this.responseText)
foo.insertAdjacentHTML('beforeEnd', templ)
req2.open('GET', 'test.js', { async: false})
req2.responseType = 'document'
req2.send()

这会在 DOM 中添加文字文本 [object Text] 而不是将其视为 HTML,因此它似乎是在评估 HTML 字符串而不是将其渲染成这样。

可能有更好的方法。我基本上是在尝试将我的应用程序(获取 JSON)、mustache.js 和模板组合成一个串联的缩小文件,以便作为 UI 小部件进行分发。

我还调查了类似 Hogan.js 的内容预编译模板,但感觉很复杂,我无法在这个项目中使用 Node。

更新

如果我将上面的 CoffeeScript 更新为:

req2 = new XMLHttpRequest()
req2.onload = ->
foo = document.getElementById('thatsmyjam')
window.templ = document.createTextNode(this.responseText)
foo.insertAdjacentHTML('beforeEnd', templ)
req2.open('GET', 'test.js', { async: false})
req2.send()

然后在我尝试呈现模板的应用程序的相关部分将其视为字符串:

populateDom: =>
self = @
@request.addEventListener 'loadend', ->
if @status is 200 && @response
resp = self.responseAsJSON(@response)
# here, window.templ is a string returned from the XMLHttpRequest above,
# as opposed to an actual "template", so Mustache can't call render with it.
rendered = Mustache.render(window.templ, resp)
document.getElementById('thatsmyjam').innerHTML = rendered
self.reformatDate(resp)

所以 Mustache 对待字符串的方式与脚本标签内的模板不同。有没有办法让 Mustache 将该字符串识别为合法模板?

最佳答案

我想出了如何使用受 this SO answer 启发的实现来使用核心 JavaScript 检索外部模板.该过程实质上是创建一个新的 div,使用 XMLHttpRequest 检索模板,并填充创建的 divinnerHTML 与模板字符串。这是 CoffeeScript 中的实现:

class TemplateManager
templateUrl: '/path/to/template.mustache'
retrieveTemplate: ->
req = new XMLHttpRequest()
req.onload = ->
div = document.createElement('div')
div.innerHTML = this.responseText
window.mustacheTemplate = div
req.open('GET', @templateUrl, { async: false})
req.send()

然后你可以调用

rendered = Mustache.render(window.mustacheTemplate.innerHTML, resp)
document.getElementById('YOURDIV').innerHTML = rendered

使用您的 JSON 数据 resp 呈现模板。

关于javascript - Mustache.js 外部模板(没有 jQuery),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30960225/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com