#jquery #lazy-loading #mustache #icanhaz.js
#jquery #отложенная загрузка #усы #icanhaz.js
Вопрос:
Я использую icanhaz.js и mustache для загрузки шаблонов, и я загружаю шаблоны mustache по требованию, используя следующий метод:
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();
}
}
Однако при проверке переменной data, которая возвращается в отладчике, она иногда возвращается как объект Document, а не как необработанная строка, которую я могу использовать. Я говорю иногда, потому что шаблон загружается по желанию, если html в файле шаблона не имеет вложенного элемента DOM в верхней части файла. Это очень странное поведение, которое я бы хотел, чтобы мне помогли объяснить.
Так, например, файл шаблона:
<div>
<div>My name is {{name}}</div>
</div>
будет возвращен как объект Document при загрузке.
Принимая во внимание, что этот файл шаблона:
<div></div>
<div>
<div>My name is {{name}}</div>
</div>
возвращается по мере необходимости в виде необработанной строки.
Я не уверен, почему наличие этого верхнего div без каких-либо дочерних элементов должно иметь значение для того, чтобы шаблон идентифицировался как документ или строка. Есть идеи?
Ответ №1:
Поскольку вы не предоставляете dataType
аргумент $.get()
, вы работаете в режиме «интеллектуального предположения». В соответствующей документации говорится:
Если ничего не указано, jQuery попытается вывести его на основе MIME-типа ответа (
XML
MIME-тип выдаст XML, в версии 1.4JSON
выдаст объект JavaScript, в версии 1.4script
выполнит скрипт, а все остальное будет возвращено в виде строки).
Таким образом, ваш сервер может отправлять некоторые шаблоны как 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.