如何使用jQuery提取动态加载的胡子模板的一部分
How do I use jQuery to extract part of a dynamically loaded mustache template
为了避免重复,我尝试在服务器端和客户端使用splash模板。我有一个模板,如下所示:
<html>
<head>...</head>
<body>
<table>
<tbody id="#this">
{{rows}}
<tr>{{row}}<tr>
{{/rows}}
</tbody>
</table>
</body>
</html>
这对我的服务器端模板非常有用。然而,在客户方面,我遇到了一些麻烦。我可以使用ajax成功地加载模板,但我不需要整个过程来更新表的行。
$(function () {
var template;
$.ajax('templates/thetemplate.mustache', {
success : function (data) {
template = $('#this', data).html();
},
dataType : 'html'
});
});
然而,当我使用上面的jQuery来获取#this
元素的内容时,{{rows}}
和{{/rows}}
行从结果中被剥离,而它们之间的<tr>{{row}}</tr>
被成功返回。如何获取全部内容?
我尝试过$('#this', data).contents();
,它给出了相同的结果,而$('#this', data).val();
返回了一个空字符串。相反,使用$(data).find('#this')
具有相同的三个结果。我还尝试将ajax调用的dataType设置为'text'
,但没有明显效果。
我意识到,通过使用部分模板,我可能可以实现我想要的(不复制部分模板供客户端和服务器端使用),而且它还有一个额外的好处,那就是避免将比我实际需要的更多的模板转移到客户端,只为了把它扔掉,但这并不能回答我的问题。(尽管很欣赏巧妙的解决方案)
感谢
问题已经发生在$('#this', data)
,它通过浏览器的HTML解析器发送data
,将其转换为DOM片段。由于具有容错性,HTML解析器对模板做了力所能及的处理,但这不是您想要的,因为模板本身不是有效的HTML。因此,$('#this', data).anythingYouLike()
或$(data).anythingYouLike()
将不起作用。
由于HTML在提交给浏览器的HTML解析器之前必须是有效的,因此除了在使用$(renderedHTML)
表达式将有效HTML提交给浏览器之前执行Mustache呈现之外,别无选择。
考虑到这一限制,关于事件的顺序有两个现实的选择:
- 将
data
剥离为仅<tbody ...>...</tbody>
(正则表达式),然后Mustache渲染,然后$tbody = $(renderedHTML)
- Mustache完全渲染
data
,然后渲染$tbody = $(renderedHTML).find('tbody')
据我所知,任何一种方法都可行。在这两种情况下,最终都会得到一个jQuery对象$tbody
,其中包含一个已填充的tbody节点,然后可以使用$tbody.appendTo($('#myTable'))
或类似的方法将其插入到DOM中。
首先,你的模板不是一个好的表结构(当然是couse,它是模板),在你做了$(data)之后,它会变成一个好表,类似这样:
[" {{rows}} {{row}} {{/rows}} ", <table>…</table>]
{{行}}不在表元素中,因此您无法通过$('#this',data).html()获得所需内容;
我的解决方案:
data.replace(/'n/g, '').match(/<tbody id="#this">(.*)<'/tbody>/g)[0]
- 仅重新加载网页的一部分
- 如何放置单独的ajax调用,使页面的一部分完全响应,而另一部分仍在加载
- 使用ajax加载页面的一部分
- 重新加载页面的一部分AJAX
- href没有在每次单击li的一部分时加载链接.使用javascript使整个li可以点击
- 如何在html5/JS中只预加载音频文件的一部分
- 通过Java加载XML并制作HTML DOM的一部分
- javascript:如何首先加载页面的一部分
- 如何每 30 秒加载一次页面的一部分
- Jquery 加载外部 HTML 的一部分
- VueJS - 初始化作为模板或$el属性的一部分加载的标签输入表单字段
- 当事件侦听器作为部分页面的一部分加载时,如何将事件侦听器添加到窗体中
- 如何在不正确重新加载整个页面的情况下更改网页的一部分
- 如何在对象标记中仅加载 HTML 页面的一部分,而不是整个 HTML 文档
- Yii2 中有什么方法可以在不重新加载的情况下动态更改 URL?来自 PJAX 的一部分
- 当通过require.js加载所有内容时,如何将挖空视图模型的一部分传递给组件
- 如何使用jQuery提取动态加载的胡子模板的一部分
- 我如何隐藏一个按钮在视图使用MVC 3当页面的某一部分加载?我浏览分类教科书
- IE问题:无法执行作为AJAX内容一部分加载的javascript
- 如何将存储的一部分加载到网格中