Este es el guión de John Resig (ligeramente modificada), la de una tela de Rick Strahl (http://weblog.west-wind.com/posts/2008/Oct/13/Client-Templating-with-jQuery)
var _tmplCache = {}
this.tmpl= function(str, data) {
/// <summary>
/// Client side template parser that uses <#= #> and <# code #> expressions.
/// and # # code blocks for template expansion.
/// NOTE: chokes on single quotes in the document in some situations
/// use &rsquo; for literals in text and avoid any single quote
/// attribute delimiters.
/// </summary>
/// <param name="str" type="string">The text of the template to expand</param>
/// <param name="data" type="var">
/// Any data that is to be merged. Pass an object and
/// that object's properties are visible as variables.
/// </param>
/// <returns type="string" />
var err = "";
try {
var func = _tmplCache[str];
if (!func) {
var strFunc =
"var p=[],print=function(){p.push.apply(p,arguments);};" +
"with(obj){p.push('" +
// 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, " ")
.replace(/'(?=[^#]*#>)/g, "\t")
.split("'").join("\\'")
.split("\t").join("'")
.replace(/<#=(.+?)#>/g, "',$1,'")
.split("<#").join("');")
.split("#>").join("p.push('")
+ "');}return p.join('');";
//alert(strFunc);
func = new Function("obj", strFunc);
_tmplCache[str] = func;
}
return func(data);
} catch (e) { err = e.message; }
return "< # ERROR: " + err.htmlEncode() + " # >";
}
Puede ser utilizado como esto: tmpl ($ ('myHtmlTempl') .html(), datos);
Lo probé y funciona con "comillas simples" (ese fue mi problema principal hasta que encontré este). Esta versión está lista para trabajar con etiquetas < # #>.
Lo estoy usando ahora, es genial. Aunque me hizo escribir esta locura: $ ("input"). Each (function() { eval ("data." + $ (This) .attr ("id") + "= \" "+ $ (this) .val() + "\"; "); }); (Esto configura un objeto 'data' con valores de todos los campos de entrada, que luego paso a la función de plantilla, para que sea muy conveniente acceder a los valores de campo.) –
@Steve: 'var data = {}; $ ("input"). each (function() {data [this.id] = this.value}); 'Ver http://stackoverflow.com/questions/1184123/is-it-possible-to-add- dynamically-named-properties-to-javascript-object –
ew, ¿qué estaba pensando? Gracias. –