SlideShare une entreprise Scribd logo
1  sur  36
$.template
Why use a template?

• Render data as markup

• Separation of display logic from
  business logic

• Reusable markup (in theory)

• Maybe it’s cleaner?

• It’s definitely faster than...
The Other Options

• String Concatenation

• Array.join

• DOM Manipulation

• jQuery.append
String Concatenation
  var str = '';

str += '<p>Hello, <em>';
str += this.name;
str += '</em>!</p>';

body.innerHTML = str;
Array.join
 var arr = [];

 arr.push('<p>Hello, <em>');
 arr.push(this.name);
 arr.push('</em>!</p>');

 body.innerHTML = arr.join('');
DOM Manipulation
  var p     = document.createElement('P');

var hello = document.createTextNode('Hello, ');

var em    = document.createElement('EM');
var world = document.createTextNode(this.name + '!');

em.appendChild(world);

p.appendChild(hello);
p.appendChild(world);

body.appendChild(p);
jQuery.append
 $('<p>').append(
   'Hello, ',
   $('<em>').text(this.name + '!')
 ).appendTo('body');
JavaScript Templating
Libraries

• mustache.js

• HandlebarJS

• TrimPath JST

• Resig Micro-Templating

• jQuery.template
$.template

• jQuery plugin

• Modified Resig Micro-
  Templating

• Allows inline JavaScript

• Caching

• Ajax

• Faster
$.template Basics

• Converts a string into a function

• Caches the rendered function

• Function renders data as DOM/
  HTML
Writing a template
Scope (this)

• Rendered template function is executed in the scope of
  the data object

• Dropped with for performance, replaced with this
var str   = '<p>Hello, <em>{%= this.name %}!</em></p>';
Two Types of Tags

• Output tags pass their values to
  the returned output

• Functional tags execute
  arbitrary JavaScript, but do not
  output any value
Output Tags {%= ... %}
// Output is added to the output
{%= this.property %}

// Ternaries can be used for quick conditionals
{%= this.property ? this.property : "N/A" %}

// JavaScript is executed and added to output
{%= (new Date()).getTime() - (this.birthdate).getTime() %}
Functional Tags {% ... %}
// Value is not added to output
{% var pie = 22/7; }

// Semi-colons not required, but encouraged for best practice
{% var greeting = "Hello, " + this.name }
// WIN

// Double-quotes are STRICTLY REQUIRED
{% var greeting = 'Hello, ' + this.name }
// FAIL

// Single-quotes allowed in strings
{% var greeting = "I'm with " + this.name }
// WIN
Looping an Array
{% for (var i = 0, n = this.images.length; i < n; ++i) { %}
  {% var img = this.images[i]; }
  <img src="{%= img.src %}" alt="{%= img.description %}">
{% } %}
Conditionals
{% if (this.age > 21) { %}
  <a href="booze.html">Drink up!</a>
{% } else { %}
  <a href="music.html">Enjoy some tunes!</a>
{% } %}
Subtemplates
<h1>{%= this.name %}</h1>

{% function renderJob (job) { %}
  {% var verb = (job.end === "present") ? "work" : "worked"; %}

 I {%= verb %} at <strong>{%= job.company %}</strong> as a
 <em>{%= job.position %}</em>

{% } %}

<ul>
  {% for (var i = 0, n = this.jobs.length; i < n; ++i) { %}
     <li>{% renderJob(this.jobs[i]) %}</li>
  {% } %}
</ul>
Subtemplates
<h1>{%= this.name %}</h1>

{% function renderJob (job) { %}
  {% var verb = (job.end === "present") ? "work" : "worked"; %}

 I {%= verb %} at <strong>{%= job.company %}</strong> as a
 <em>{%= job.position %}</em> {% renderDate(job.start, job.end) %}

  {% function renderDate (start, end) { %}
    from {%= start %} {%= end === "present" ? "" : "to " + end %}.
  {% } %}
{% } %}

<ul>
  {% for (var i = 0, n = this.jobs.length; i < n; ++i) { %}
     <li>{% renderJob(this.jobs[i]) %}</li>
  {% } %}
</ul>
template + data = output
Template Input

• string

  • var

  • $.ajax (asynchronous)

• DOM (via $.fn.template)

• Ajax (synchronous)
Template Input (string)
var str   = '<p>Hello, <em>{%= this.name %}!</em></p>';

var data = { name: 'world' };

var func = $.template(str);
// anonymous()

var elem = $.template(str, data);
// [jquery:template]

var html = $.template(str, data, true);
// <p>Hello, <em>world!</em></p>
Template Input (DOM)
<script id="tpl" type="text/html">
Hello, {%= this.name %}!
</script>

var data = { name: 'world' };

var func = $('#tpl').template();
// anonymous()

var elem = $('#tpl').template(data);
// [jquery:template]

var html = $('#tpl').template(data, true);
// <p>Hello, <em>world!</em></p>
Template Input (Ajax)
var url   = 'hello.tpl';

var data = { name: 'world' };

var func = $.template(url);
// anonymous()

var elem = $.template(url, data);
// [jquery:template]

var html = $.template(url, data, true);
// <p>Hello, <em>world!</em></p>
Data Input

• Object

• Array (of objects)
Data Input (Object)
var str   = '<p>Hello, <em>{%= this.name %}!</em></p>';

var data = { name: 'world' };

var html = $.template(str, data, true);
// <p>Hello, <em>world!</em></p>
Data Input (Array of objects)
var str     = '<p>Hello, <em>{%= this.name %}!</em></p>';

var    data = [
   {   name: 'world' },
   {   name: 'Dolly' },
   {   name: 'mom' }
];

var html = $.template(str, data, true);
// <p>Hello, <em>world!</em></p>
// <p>Hello, <em>Dolly!</em></p>
// <p>Hello, <em>mom!</em></p>
Output

• function

• DOM (as a jQuery instance)

• HTML (as a string)
Output (function)
// This template...
var str = '<p>Hello, <em>{%= this.name %}</em>!</p>';
var func = $.template(str);

// becomes...
function anonymous() {
  var __ = [];
  __.push("<p>Hello, <em>", this.name, "!</em></p>");
  return __.join("");
}

// which can be used as...
var elem = func(data);

// or...
var html = func(data, true);
Output (function)
<p>Hello, <em>
{% if (this.name) { %}
 {%= this.name %}
{% } else { %}
  stranger
{% } %}
!</em></p>

function anonymous() {
  var __ = [];
  __.push("<p>Hello, <em>");
  if (this.name) {
    __.push("", this.name, "");
  } else {
    __.push("stranger");
  }
  __.push("!</em></p>");
  return __.join("");
}
Output (DOM)

DOM output is wrapped in <jquery:template/> to allow
jQuery manipulation and to protect leading and trailing
fragments and elements
<jquery:template>
  <p>Hello, <em>world!</em></p>
  <p>Hello, <em>Dolly!</em></p>
  <p>Hello, <em>mom!</em></p>
</jquery:template>

Hello, <em>world!</em>
// FAIL <em>world!</em>

<em>Goodbye</em>, cruel world!
// FAIL <em>Goodbye</em>
Output (DOM)

Attempted a patch to jQuery to wrap leading and trailing
fragments as text nodes, but then
var elem = $(tpl, obj).appendTo('body').hide();
// FAIL

would require rewrite of all of jQuery's DOM functions :(
Output (DOM)

Still breaks in some instances where markup is too invalid
$.template('<tr><td>{%= this.name %}</td></tr>', data)
  .appendTo('<table/>');

<jquery:template>
  <tr>
    <td>Hello, world!</td>
    <td>Hello, Dolly!</td>
    <td>Hello, mom!</td>
  </tr>
</jquery:template>
<table/>
// FAIL
// Invalid markup squirts out of the target element
Output (HTML)

Fix: use true to render as HTML
var html = $.template('<tr><td>{%= this.name %}</td></tr>',
data, true);

// <tr>
//   <td>Hello, world!</td>
//   <td>Hello, Dolly!</td>
//   <td>Hello, mom!</td>
// </tr>

$('<table/>').append(html);
Known Issues

• Does not properly extract DOM
  text in IE (fix on the way)

• Breaks in some cases where
  markup is invalid
Thanks!

• http://github.com/furf/jquery-template

Contenu connexe

Tendances

Tendances (20)

[ HackFest.pl 2012] Testing - what for and how
[ HackFest.pl 2012] Testing - what for and how[ HackFest.pl 2012] Testing - what for and how
[ HackFest.pl 2012] Testing - what for and how
 
Pre-Bootcamp introduction to Elixir
Pre-Bootcamp introduction to ElixirPre-Bootcamp introduction to Elixir
Pre-Bootcamp introduction to Elixir
 
Oop php 5
Oop php 5Oop php 5
Oop php 5
 
A Short Introduction To jQuery
A Short Introduction To jQueryA Short Introduction To jQuery
A Short Introduction To jQuery
 
distill
distilldistill
distill
 
Anko試食会
Anko試食会Anko試食会
Anko試食会
 
8時間耐久CakePHP2 勉強会
8時間耐久CakePHP2 勉強会8時間耐久CakePHP2 勉強会
8時間耐久CakePHP2 勉強会
 
Introduction to Web Components
Introduction to Web ComponentsIntroduction to Web Components
Introduction to Web Components
 
Drupal Lightning FAPI Jumpstart
Drupal Lightning FAPI JumpstartDrupal Lightning FAPI Jumpstart
Drupal Lightning FAPI Jumpstart
 
Smarty Template
Smarty TemplateSmarty Template
Smarty Template
 
Smarty Template
Smarty TemplateSmarty Template
Smarty Template
 
[PL] Jak nie zostać "programistą" PHP?
[PL] Jak nie zostać "programistą" PHP?[PL] Jak nie zostać "programistą" PHP?
[PL] Jak nie zostać "programistą" PHP?
 
Virtual Madness @ Etsy
Virtual Madness @ EtsyVirtual Madness @ Etsy
Virtual Madness @ Etsy
 
Componentization css angular
Componentization css angularComponentization css angular
Componentization css angular
 
Convidar para page !!
Convidar para page !!Convidar para page !!
Convidar para page !!
 
Php
PhpPhp
Php
 
Bag Of Tricks From Iusethis
Bag Of Tricks From IusethisBag Of Tricks From Iusethis
Bag Of Tricks From Iusethis
 
Biglietti, prego! A ticket for the (command) bus
Biglietti, prego! A ticket for the (command) busBiglietti, prego! A ticket for the (command) bus
Biglietti, prego! A ticket for the (command) bus
 
Learning the basics of the Drupal API
Learning the basics of the Drupal APILearning the basics of the Drupal API
Learning the basics of the Drupal API
 
7 reasons why developers should love Joomla!
7 reasons why developers should love Joomla!7 reasons why developers should love Joomla!
7 reasons why developers should love Joomla!
 

Similaire à $.Template

C A S Sample Php
C A S Sample PhpC A S Sample Php
C A S Sample Php
JH Lee
 
R57shell
R57shellR57shell
R57shell
ady36
 
PHP and Rich Internet Applications
PHP and Rich Internet ApplicationsPHP and Rich Internet Applications
PHP and Rich Internet Applications
elliando dias
 
Remy Sharp The DOM scripting toolkit jQuery
Remy Sharp The DOM scripting toolkit jQueryRemy Sharp The DOM scripting toolkit jQuery
Remy Sharp The DOM scripting toolkit jQuery
deimos
 
Advance Techniques In Php
Advance Techniques In PhpAdvance Techniques In Php
Advance Techniques In Php
Kumar S
 

Similaire à $.Template (20)

Cheap frontend tricks
Cheap frontend tricksCheap frontend tricks
Cheap frontend tricks
 
Jquery
JqueryJquery
Jquery
 
Symfony2 Building on Alpha / Beta technology
Symfony2 Building on Alpha / Beta technologySymfony2 Building on Alpha / Beta technology
Symfony2 Building on Alpha / Beta technology
 
JavaScript on Rails 튜토리얼
JavaScript on Rails 튜토리얼JavaScript on Rails 튜토리얼
JavaScript on Rails 튜토리얼
 
Views notwithstanding
Views notwithstandingViews notwithstanding
Views notwithstanding
 
C A S Sample Php
C A S Sample PhpC A S Sample Php
C A S Sample Php
 
TDC 2014 - JavaScript de qualidade: hoje, amanhã e sempre!
TDC 2014 - JavaScript de qualidade: hoje, amanhã e sempre!TDC 2014 - JavaScript de qualidade: hoje, amanhã e sempre!
TDC 2014 - JavaScript de qualidade: hoje, amanhã e sempre!
 
Unit testing with zend framework tek11
Unit testing with zend framework tek11Unit testing with zend framework tek11
Unit testing with zend framework tek11
 
Unit testing with zend framework PHPBenelux
Unit testing with zend framework PHPBeneluxUnit testing with zend framework PHPBenelux
Unit testing with zend framework PHPBenelux
 
JQuery Presentation
JQuery PresentationJQuery Presentation
JQuery Presentation
 
Introduction to jQuery
Introduction to jQueryIntroduction to jQuery
Introduction to jQuery
 
R57shell
R57shellR57shell
R57shell
 
Framework
FrameworkFramework
Framework
 
PHP
PHP PHP
PHP
 
PHP and Rich Internet Applications
PHP and Rich Internet ApplicationsPHP and Rich Internet Applications
PHP and Rich Internet Applications
 
Remy Sharp The DOM scripting toolkit jQuery
Remy Sharp The DOM scripting toolkit jQueryRemy Sharp The DOM scripting toolkit jQuery
Remy Sharp The DOM scripting toolkit jQuery
 
Unittests für Dummies
Unittests für DummiesUnittests für Dummies
Unittests für Dummies
 
Maintaining your own branch of Drupal core
Maintaining your own branch of Drupal coreMaintaining your own branch of Drupal core
Maintaining your own branch of Drupal core
 
Moodle Quick Forms
Moodle Quick FormsMoodle Quick Forms
Moodle Quick Forms
 
Advance Techniques In Php
Advance Techniques In PhpAdvance Techniques In Php
Advance Techniques In Php
 

Dernier

+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Victor Rentea
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 

Dernier (20)

Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 

$.Template

  • 2. Why use a template? • Render data as markup • Separation of display logic from business logic • Reusable markup (in theory) • Maybe it’s cleaner? • It’s definitely faster than...
  • 3. The Other Options • String Concatenation • Array.join • DOM Manipulation • jQuery.append
  • 4. String Concatenation var str = ''; str += '<p>Hello, <em>'; str += this.name; str += '</em>!</p>'; body.innerHTML = str;
  • 5. Array.join var arr = []; arr.push('<p>Hello, <em>'); arr.push(this.name); arr.push('</em>!</p>'); body.innerHTML = arr.join('');
  • 6. DOM Manipulation var p = document.createElement('P'); var hello = document.createTextNode('Hello, '); var em = document.createElement('EM'); var world = document.createTextNode(this.name + '!'); em.appendChild(world); p.appendChild(hello); p.appendChild(world); body.appendChild(p);
  • 7. jQuery.append $('<p>').append( 'Hello, ', $('<em>').text(this.name + '!') ).appendTo('body');
  • 8. JavaScript Templating Libraries • mustache.js • HandlebarJS • TrimPath JST • Resig Micro-Templating • jQuery.template
  • 9. $.template • jQuery plugin • Modified Resig Micro- Templating • Allows inline JavaScript • Caching • Ajax • Faster
  • 10. $.template Basics • Converts a string into a function • Caches the rendered function • Function renders data as DOM/ HTML
  • 12. Scope (this) • Rendered template function is executed in the scope of the data object • Dropped with for performance, replaced with this var str = '<p>Hello, <em>{%= this.name %}!</em></p>';
  • 13. Two Types of Tags • Output tags pass their values to the returned output • Functional tags execute arbitrary JavaScript, but do not output any value
  • 14. Output Tags {%= ... %} // Output is added to the output {%= this.property %} // Ternaries can be used for quick conditionals {%= this.property ? this.property : "N/A" %} // JavaScript is executed and added to output {%= (new Date()).getTime() - (this.birthdate).getTime() %}
  • 15. Functional Tags {% ... %} // Value is not added to output {% var pie = 22/7; } // Semi-colons not required, but encouraged for best practice {% var greeting = "Hello, " + this.name } // WIN // Double-quotes are STRICTLY REQUIRED {% var greeting = 'Hello, ' + this.name } // FAIL // Single-quotes allowed in strings {% var greeting = "I'm with " + this.name } // WIN
  • 16. Looping an Array {% for (var i = 0, n = this.images.length; i < n; ++i) { %} {% var img = this.images[i]; } <img src="{%= img.src %}" alt="{%= img.description %}"> {% } %}
  • 17. Conditionals {% if (this.age > 21) { %} <a href="booze.html">Drink up!</a> {% } else { %} <a href="music.html">Enjoy some tunes!</a> {% } %}
  • 18. Subtemplates <h1>{%= this.name %}</h1> {% function renderJob (job) { %} {% var verb = (job.end === "present") ? "work" : "worked"; %} I {%= verb %} at <strong>{%= job.company %}</strong> as a <em>{%= job.position %}</em> {% } %} <ul> {% for (var i = 0, n = this.jobs.length; i < n; ++i) { %} <li>{% renderJob(this.jobs[i]) %}</li> {% } %} </ul>
  • 19. Subtemplates <h1>{%= this.name %}</h1> {% function renderJob (job) { %} {% var verb = (job.end === "present") ? "work" : "worked"; %} I {%= verb %} at <strong>{%= job.company %}</strong> as a <em>{%= job.position %}</em> {% renderDate(job.start, job.end) %} {% function renderDate (start, end) { %} from {%= start %} {%= end === "present" ? "" : "to " + end %}. {% } %} {% } %} <ul> {% for (var i = 0, n = this.jobs.length; i < n; ++i) { %} <li>{% renderJob(this.jobs[i]) %}</li> {% } %} </ul>
  • 20. template + data = output
  • 21. Template Input • string • var • $.ajax (asynchronous) • DOM (via $.fn.template) • Ajax (synchronous)
  • 22. Template Input (string) var str = '<p>Hello, <em>{%= this.name %}!</em></p>'; var data = { name: 'world' }; var func = $.template(str); // anonymous() var elem = $.template(str, data); // [jquery:template] var html = $.template(str, data, true); // <p>Hello, <em>world!</em></p>
  • 23. Template Input (DOM) <script id="tpl" type="text/html"> Hello, {%= this.name %}! </script> var data = { name: 'world' }; var func = $('#tpl').template(); // anonymous() var elem = $('#tpl').template(data); // [jquery:template] var html = $('#tpl').template(data, true); // <p>Hello, <em>world!</em></p>
  • 24. Template Input (Ajax) var url = 'hello.tpl'; var data = { name: 'world' }; var func = $.template(url); // anonymous() var elem = $.template(url, data); // [jquery:template] var html = $.template(url, data, true); // <p>Hello, <em>world!</em></p>
  • 25. Data Input • Object • Array (of objects)
  • 26. Data Input (Object) var str = '<p>Hello, <em>{%= this.name %}!</em></p>'; var data = { name: 'world' }; var html = $.template(str, data, true); // <p>Hello, <em>world!</em></p>
  • 27. Data Input (Array of objects) var str = '<p>Hello, <em>{%= this.name %}!</em></p>'; var data = [ { name: 'world' }, { name: 'Dolly' }, { name: 'mom' } ]; var html = $.template(str, data, true); // <p>Hello, <em>world!</em></p> // <p>Hello, <em>Dolly!</em></p> // <p>Hello, <em>mom!</em></p>
  • 28. Output • function • DOM (as a jQuery instance) • HTML (as a string)
  • 29. Output (function) // This template... var str = '<p>Hello, <em>{%= this.name %}</em>!</p>'; var func = $.template(str); // becomes... function anonymous() { var __ = []; __.push("<p>Hello, <em>", this.name, "!</em></p>"); return __.join(""); } // which can be used as... var elem = func(data); // or... var html = func(data, true);
  • 30. Output (function) <p>Hello, <em> {% if (this.name) { %} {%= this.name %} {% } else { %} stranger {% } %} !</em></p> function anonymous() { var __ = []; __.push("<p>Hello, <em>"); if (this.name) { __.push("", this.name, ""); } else { __.push("stranger"); } __.push("!</em></p>"); return __.join(""); }
  • 31. Output (DOM) DOM output is wrapped in <jquery:template/> to allow jQuery manipulation and to protect leading and trailing fragments and elements <jquery:template> <p>Hello, <em>world!</em></p> <p>Hello, <em>Dolly!</em></p> <p>Hello, <em>mom!</em></p> </jquery:template> Hello, <em>world!</em> // FAIL <em>world!</em> <em>Goodbye</em>, cruel world! // FAIL <em>Goodbye</em>
  • 32. Output (DOM) Attempted a patch to jQuery to wrap leading and trailing fragments as text nodes, but then var elem = $(tpl, obj).appendTo('body').hide(); // FAIL would require rewrite of all of jQuery's DOM functions :(
  • 33. Output (DOM) Still breaks in some instances where markup is too invalid $.template('<tr><td>{%= this.name %}</td></tr>', data) .appendTo('<table/>'); <jquery:template> <tr> <td>Hello, world!</td> <td>Hello, Dolly!</td> <td>Hello, mom!</td> </tr> </jquery:template> <table/> // FAIL // Invalid markup squirts out of the target element
  • 34. Output (HTML) Fix: use true to render as HTML var html = $.template('<tr><td>{%= this.name %}</td></tr>', data, true); // <tr> // <td>Hello, world!</td> // <td>Hello, Dolly!</td> // <td>Hello, mom!</td> // </tr> $('<table/>').append(html);
  • 35. Known Issues • Does not properly extract DOM text in IE (fix on the way) • Breaks in some cases where markup is invalid

Notes de l'éditeur