Как сделать микрошаблоны Resig XHTML-совместимыми?

Я экспериментировал с микро-шаблоном Джона Ресига, который отлично работает. Однако разметка не пройдет проверку XHTML 1.0 Transitional. (Среди прочего, атрибуты id приводят к ошибкам.)

Замена идентификаторов тегов ‹,> на [[,]] проходит проверку. Таким образом, я создал js-скрипт, который во время загрузки (документ jQuery готов) преобразует квадратные скобки обратно в обычные маркеры. Это отлично работает в FF, но не в IE, Chrome и т. Д.

Скрипты, встроенные в теги CDATA, также проверяются.

Вопрос: Есть ли способ вставить микро-шаблон в скрипт и при этом пройти проверку XHTML? Моя идея заключалась в том, чтобы удалить теги CDATA после загрузки страницы. Но, наверное, есть более умные способы. (Примечание: я бы предпочел не внедрять HTML через js, так как разметку будет сложно поддерживать.)

PS: Я посмотрел на другие шаблоны js, но они либо не совместимы с XHTML, либо слишком громоздки.

TIA за любые подсказки.


person Community    schedule 25.06.2009    source источник
comment
Можем ли мы увидеть примеры ваших шаблонов, которые не проходят?   -  person razzed    schedule 25.06.2009


Ответы (3)


Почему вы пытаетесь изменить все методы, использующие микро-шаблон, вместо того, чтобы изменять сам микро-шаблон? Кажется, что загружать все определенным образом, а затем изменять все так, чтобы оно было совместимо со сценарием, - пустая трата времени.

Почему бы не изменить исходный сценарий, чтобы использовать теги [[ вместо тегов <%, которые были изначально предоставлены?

Вот как он определяет шаблоны

str
          .replace(/[\r\t\n]/g, " ")
          .split("<%").join("\t")
          .replace(/((^|%>)[^\t]*)'/g, "$1\r")
          .replace(/\t=(.*?)%>/g, "',$1,'")
          .split("\t").join("');")
          .split("%>").join("p.push('")
          .split("\r").join("\\'")
      + "');}return p.join('');");

Теперь измените <% на [[ и >% на ]]

str
          .replace(/[\r\t\n]/g, " ")
          .split("[[").join("\t")
          .replace(/((^|]])[^\t]*)'/g, "$1\r")
          .replace(/\t=(.*?)]]/g, "',$1,'")
          .split("\t").join("');")
          .split("]]").join("p.push('")
          .split("\r").join("\\'")
      + "');}return p.join('');"); 
person Ian Elliott    schedule 25.06.2009

Попробуйте использовать CDATA.

person Jeoff Wilks    schedule 12.04.2010

Вот версия, которая использует массивы для объединения строк (и проверяет, если data = null)

var _out = [];
// check if the data is null and create an empty object 
_out[_out.length] = ('if (typeof data === "undefined" || data == null){  data = {}; }   ');
_out[_out.length] = ('var out=[];');
_out[_out.length] = ("out[out.length] = ' " );
_out[_out.length] =   str.replace(/[\r\t\n]/g, " ")
   .replace(/'(?=[^%]*\]\])/g,"\t")
   .split("'").join("\\'")
   .split("\t").join("'")
   .replace(/\[\[=(.+?)\]\]/g, "'; out[out.length] = $1; out[out.length] = '")
   .split("\[\[").join("';")
   .split("\]\]").join("out[out.length] ='");

   _out[_out.length] = "'; return out.join('');";

var value = _out.join('');
return new Function("data", value );
person Jonathan Hendler    schedule 01.08.2011