在jQuery中加载小胡子模板返回Document对象而不是原始字符串

时间:2011-11-06 04:45:37

标签: jquery lazy-loading mustache icanhaz.js

我正在使用icanhaz.js和小胡子来加载模板,我正在使用以下方法按需加载小胡子模板:

loadTemplate: function(name, callback) {
            if (!ich.templates[name+"_template"]) {
                jQuery.get("/js/templates/"+name+".mustache", function(data) {
                  window.ich.addTemplate(name+"_template", data);
                  callback();
                });
             } else {
                callback();
             }
        }

检查在调试器中返回的数据变量,但有时将作为Document对象返回,而不是我可以使用的原始字符串。我有时说,因为如果模板文件中的html在文件顶部没有嵌套的DOM元素,模板会按需加载。这是一种非常奇怪的行为,我很乐意帮助解释。

因此,例如,模板文件:

<div>
     <div>My name is {{name}}</div>
</div>

将在加载时作为Document对象返回。

然而,这个模板文件:

 <div></div>
 <div>
     <div>My name is {{name}}</div>
 </div>

根据需要作为原始字符串返回。

我不确定为什么没有任何孩子的顶级div应该对被识别为Document与字符串的模板产生影响。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

由于您没有向dataType提供$.get()参数,因此您正在以“智能猜测”模式运行。 related documentation说:

  

如果没有指定,jQuery将尝试根据MIME推断它   响应的类型(XML MIME类型将产生XML,在1.4 JSON中   将产生一个JavaScript对象,在1.4 script将执行脚本,   其他任何东西都将作为字符串返回。)

因此,您的服务器可能会将某些模板发送为text/html(或text/plain),其他模板则发送为text/xml。检查响应头(使用Fiddler或等效工具)来检查是否确实如此。

顺便说一句,指定请求的数据类型应该完全消除这个问题:

jQuery.get("/js/templates/" + name + ".mustache", function(data) {
    window.ich.addTemplate(name + "_template", data);
    callback();
}, "html");      // Always return HTML as plain text.