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

我正在使用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与字符串的模板产生影响.有任何想法吗?

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

If none is specified, jQuery will try to infer it based on the MIME
type of the response (an XML MIME type will yield XML, in 1.4 JSON
will yield a JavaScript object, in 1.4 script will execute the script,
and anything else will be returned as a string).

因此,您的服务器可能会将某些模板发送为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.
点赞