Загрузка шаблона усов в jQuery возвращает объект Document вместо необработанной строки - PullRequest
4 голосов
/ 06 ноября 2011

Я использую 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 Ответ

2 голосов
/ 06 ноября 2011

Поскольку вы не предоставляете dataType аргумент для $.get(), вы работаете в режиме «интеллектуального предположения». связанная документация гласит:

Если ничего не указано, 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.
...