Загрузка шаблона mustache в jQuery возвращает объект Document вместо необработанной строки

#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.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.