SlideShare a Scribd company logo
Scalable Vector Ember 
Death to HTML. Long live the DOM.
@mixonic 
httP://madhatted.com 
matt.beale@madhatted.com
201 Created 
We build õ-age apps with Ember.js. We take 
teams from £ to • in no time flat.
1 <svg> 
2 {{#each d in paths}} 
3 <path {{bind-attr d=d}} /> 
4 {{/each}} 
5 </svg>
http://emberjs.jsbin.com/woxes/10/edit 
1.7: http://emberjs.jsbin.com/woxes/9 
! 
1.8: http://emberjs.jsbin.com/woxes/10
Scalable vector ember
Preamble 
Vector Graphics
Scalable vector ember
Raster Graphic (PNG) 
w3.org
Benefits of Raster Graphics 
• Small file-size (photos) 
• Computationally simple to 
render
Vector Graphic (SVG) 
1 <?xml version="1.0" standalone="no"?> 
2 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
3 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 
4 <svg width="12cm" height="4cm" viewBox="0 0 1200 400" 
5 xmlns="http://www.w3.org/2000/svg" version="1.1"> 
6 <desc>Example rect01 - rectangle with sharp corners</desc> 
7 
8 <rect x="400" y="100" width="400" height="200" 
9 fill="yellow" stroke="navy" stroke-width="10" /> 
10 </svg> 
w3.org
Benefits of Vector Graphics 
• Small file-size (graphics) 
• Arbitrary resolution
Part I 
Scalable Vector Graphics
Why are we talking about this in 2014?
1998 Vector Markup Language proposed 
by Macromedia, Microsoft. PGML 
proposed by Adobe, Sun. W3C kick off 
SVG. 
2001 SVG 1.0 
2003 SVG 1.1
Benefits of SVG Standard 
• Easy-to-parse metadata 
• Links 
• Animation
1998 Vector Markup Language proposed 
by Macromedia, Microsoft. PGML 
proposed by Adobe, Sun. W3C kick off 
SVG. 
2001 SVG 1.0 
2003 SVG 1.1 
2004 Konqueror 3.2 support 
2005 Gecko (Firefox) support 
2006 WebKit (Chrome, Safari) support
5upmushroom.tumblr.com
1998 Vector Markup Language proposed 
by Macromedia, Microsoft. PGML 
proposed by Adobe, Sun. W3C kick off 
SVG. 
2001 SVG 1.0 
2003 SVG 1.1 
2004 Konqueror 3.2 support 
2005 Gecko (Firefox) support 
2006 WebKit (Chrome, Safari) support 
2011 IE9 is the last platform to support SVG
0.5% Woo! 
(almost) 
w3techs.com
( ๑‾̀◡‾́)σ» 
(´⊙ω⊙`) 
w3techs.com
3 ways to use SVG 
logo.svg 
<svg> 
document.createElementNS
3 ways to use SVG 
logo.svg 
<svg> 
document.createElementNS
Creating elements with a namespace 
1 var svg = document.createElementNS("http://www.w3.org/2000/svg", "svg"); 
2 svg.setAttribute("viewBox", "0 0 1200 400"); 
3 svg.setAttribute("width", "12cm"); 
4 svg.setAttribute("height", "4cm"); 
5 var path = document.createElementNS("http://www.w3.org/2000/svg", "path"); 
6 path.setAttribute("x", "400"); 
7 path.setAttribute("y", "100"); 
8 path.setAttribute("width", "400"); 
9 path.setAttribute("height", "200"); 
10 path.setAttribute("fill", "yellow"); 
11 path.setAttribute("stroke", "navy"); 
12 path.setAttribute("stroke-width", "10"); 
13 svg.appendChild(path); 
14 document.body.appendChild(svg);
Setting SVG attributes 
• Attributes are case sensitive 
1 var div = document.createElement("div"); 
2 div.setAttribute("someWacky", "foo"); 
3 div.getAttribute("someWacky"); // => "foo" 
4 div.getAttribute("somewacky"); // => "foo" 
5 
6 var svg = document.createElementNS(svgNS, "svg"); 
7 svg.setAttribute("someWow", "boo") 
8 svg.getAttribute("someWow"); // => "boo" 
9 svg.getAttribute("somewow"); // => null 
• Property values are not primitives 
1 svg.viewBox; // => SVGAnimatedRect {animVal: SVGRect, baseVal: SVGRect} 
2 var viewBox = new SVGAnimatedRect(); // => TypeError: Illegal constructor 
3 svg.viewBox = "0 0 100 100"; 
4 svg.getAttribute("viewBox"); // => null
Changing namespaces 
1 <div> 
2 <span></span> 
3 <svg> 
4 <path></path> 
5 <foreignObject> 
6 <div></div> 
7 </foreignObject> 
8 </svg> 
9 </div> 
Entrance to namespace dictated by next element 
Exit from namespace dictated by previous element
Part II 
Old Man Ember, Young Man Ember
Handlebars 
HTMLBars
THERE CAN ONLY BE ONE
Scalable vector ember
THERE CAN ONLY BE DECK
Scalable vector ember
A template 
1 <section> 
2 {{if isShowing}} 
3 <span>Howdy!</span> 
4 {{/if}} 
5 </section>
Ember.js pre-1.8 
1 var buffer = "<section>n"; 
2 buffer += "<script metamorph-0-start></script>"; 
3 if (isShowing) { 
4 buffer += " <span>Howdy!</span>n"; 
5 } 
6 buffer += "<script metamorph-0-end></script>"; 
7 buffer += "</section>"; 
8 
9 rootElement.innerHTML = buffer;
Ember.js pre-1.8 
1 var 
2 buffer 
3 if (isShowing) { 
4 buffer 
5 } 
6 buffer 
7 buffer 
8 
9 rootElement.innerHTML 
STRINGS, INNERHTML
Ember.js 1.10 
1 var outerChilden = [document.createElement('section')]; 
2 
3 var innerChildren; 
4 if (isShowing) { 
5 innerChildren = [document.createElement('span');] 
6 innerChildren[0].appendChild(document.createTextNode('Howdy!')); 
7 while (innerChildren[0]) { 
8 outerChilden[0].appendChild(innerChildren[0]); 
9 } 
10 } 
11 
12 while (outerChilden[0]) { 
13 rootElement.appendChild(outerChilden[0]); 
14 }
Ember.js 1.10 
1 var 
2 
3 var 
4 if (isShowing) { 
5 innerChildren 
6 innerChildren[ 
7 while (innerChildren[ 
8 outerChilden[ 
9 } 
10 } 
11 
12 while (outerChilden[ 
13 rootElement.appendChild(outerChilden[ 
14 } 
DOM! HTMLBARS! WOOOMG!
Ember.js 1.8-1.9 
1 var buffer, parsingNode; 
2 
3 buffer = "<section>n</section>"; 
4 parsingNode = document.createElement('div'); 
5 parsingNode.innerHTML = buffer; 
6 var outerChilden = parsingNode.childNodes; 
7 
8 if (isShowing) { 
9 buffer = " <span>Howdy!</span>n"; 
10 parsingNode.innerHTML = buffer; 
11 var innerChildren = parsingNode.childNodes; 
12 while (innerChildren[0]) { 
13 outerChilden[0].appendChild(innerChildren[0]); 
14 } 
15 } 
16 
17 while (outerChilden[0]) { 
18 rootElement.appendChild(outerChilden[0]); 
19 }
Ember.js 1.8-1.9 
1 var 
2 
3 buffer 
4 parsingNode 
5 parsingNode.innerHTML 
6 var 
7 
8 if (isShowing) { 
9 buffer 
10 parsingNode.innerHTML 
11 
12 while (innerChildren[ 
13 outerChilden[ 
14 } 
15 } 
16 
17 while (outerChilden[ 
18 rootElement.appendChild(outerChilden[ 
19 } 
STRING TEMPLATES, DOM for stitching
Tricky stuff in 1.8+ 
• managing a context 
• detecting a namespace 
!
Tricky stuff in 1.8+ 
1 var string = handlebarsTemplate(context, options); 
2 var nodes = domHelper.parseHTML(string, morph.contextualElement); 
3 
4 var node; 
5 while (node = nodes[0]) { 
6 rootElement.appendChild(node); 
7 }
HTMLBARS, Tricky stuff in 1.8+ 
1.10 
1 var nodes = htmlbarsTemplate(context, env, morph.contextualElement); 
2 
3 var node; 
4 while (node = nodes[0]) { 
5 rootElement.appendChild(node); 
6 }
Tricky stuff in 1.8+ 
• managing a context 
• detecting a namespace 
!
Tricky stuff in 1.8+ 
1 var root = document.createElement('div'); 
2 
3 root.innerHTML = "<svg><foreignObject><div></div></foreignObject></svg>"; 
4 
5 var svg = div.firstChild; 
6 var foreignObject = svg.firstChild; 
7 var div = foreignObject.firstChild; 
8 
9 svg.namespaceURI; // http://www.w3.org/2000/svg 
10 foreignObject.namespaceURI; // http://www.w3.org/2000/svg 
11 div.namespaceURI; // undefined
Tricky stuff in 1.8+ 
1 var root = document.createElementNS(svgNs, 'svg');! 
2 ! 
3 root.innerHTML = "<foreignObject><div></div></foreignObject>";! 
4 ! 
5 var foreignObject = root.firstChild;! 
6 var div = foreignObject.firstChild;! 
7 ! 
8 svg.namespaceURI; // http://www.w3.org/2000/svg! 
9 foreignObject.namespaceURI; // http://www.w3.org/2000/svg! 
10 div.namespaceURI; // undefined!
Tricky stuff in 1.8+ HTMLBARS, 1.10 
1 var template = htmlbarsCompile( 
2 "<foreignObject><div></div></foreignObject>" 
3 ); 
4 // so long as contextualElement is an SVG tag... 
5 var nodes = template(context, env, morph.contextualElement); 
6 
7 var foreignObject = nodes[0]; 
8 var div = foreignObject.firstChild; 
9 
10 foreignObject.namespaceURI; // http://www.w3.org/2000/svg 
11 div.namespaceURI; // undefined
Part III 
Death to HTML. Long live the DOM.
HTML is transmitted as a string.
• JS String (.jst, Ember <1.10) 
• HTML (Angular, Polymer) 
• JavaScript (React, Ember > 1.9, 
Mithril)
Scalable vector ember
But that doesn’t mean we should process it as a string.
• innerHTML (.jst, Ember <1.10) 
• DOM (Angular, React, Ember > 1.9, 
Polymer, Mithril)
ACTIONS UP 
! 
BINDINGS DOWN
transmit strings 
! 
process DOM
CONTROLLERS LEFT 
! 
YEHUDA’S RIGHT
Thank you

More Related Content

PDF
HTML5: where flash isn't needed anymore
PDF
JavaScript & HTML5 - Brave New World
PDF
How to make Ajax work for you
PDF
Zepto.js, a jQuery-compatible mobile JavaScript framework in 2K
ZIP
OOCSS for Javascript pirates at jQueryPgh meetup
KEY
前端概述
PDF
Yearning jQuery
PDF
Better Selenium Tests with Geb - Selenium Conf 2014
HTML5: where flash isn't needed anymore
JavaScript & HTML5 - Brave New World
How to make Ajax work for you
Zepto.js, a jQuery-compatible mobile JavaScript framework in 2K
OOCSS for Javascript pirates at jQueryPgh meetup
前端概述
Yearning jQuery
Better Selenium Tests with Geb - Selenium Conf 2014

What's hot (20)

PDF
HTML5: friend or foe (to Flash)?
PPTX
Rails, Postgres, Angular, and Bootstrap: The Power Stack
PPTX
FuncUnit
PDF
The DOM is a Mess @ Yahoo
PDF
Is HTML5 Ready? (workshop)
PPTX
TXT
Diy frozen snow globe
PDF
The Dojo Build System
KEY
the 5 layers of web accessibility - Open Web Camp II
PDF
Browsers with Wings
PDF
jQuery Loves Developers - Oredev 2009
PDF
Introduction to HTML5
KEY
Deploying
PDF
jQuery UI and Plugins
ODP
Beyond PHP - it's not (just) about the code
PDF
2014 database - course 3 - PHP and MySQL
PPT
jQuery For Beginners - jQuery Conference 2009
KEY
[Coscup 2012] JavascriptMVC
PPTX
JS Lab`16. Владимир Воевидка: "Как работает браузер"
KEY
Google
HTML5: friend or foe (to Flash)?
Rails, Postgres, Angular, and Bootstrap: The Power Stack
FuncUnit
The DOM is a Mess @ Yahoo
Is HTML5 Ready? (workshop)
Diy frozen snow globe
The Dojo Build System
the 5 layers of web accessibility - Open Web Camp II
Browsers with Wings
jQuery Loves Developers - Oredev 2009
Introduction to HTML5
Deploying
jQuery UI and Plugins
Beyond PHP - it's not (just) about the code
2014 database - course 3 - PHP and MySQL
jQuery For Beginners - jQuery Conference 2009
[Coscup 2012] JavascriptMVC
JS Lab`16. Владимир Воевидка: "Как работает браузер"
Google
Ad

Similar to Scalable vector ember (20)

PDF
Riding the Edge with Ember.js
PDF
Modern, Scalable, Ambitious apps with Ember.js
PDF
A Beginner's Guide to Ember
PDF
Ember Reusable Components and Widgets
PPT
Ember.js: Jump Start
PDF
Ember.js 101 - JSChannel NCR
PPTX
Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSCo...
PDF
Ember: Guts & Goals
PDF
Parse Apps with Ember.js
PPTX
The road to Ember.js 2.0
PPTX
Full slidescr16
PDF
Workshop 16: EmberJS Parte I
PDF
Introduction to Ember.js and how we used it at FlowPro.io
PDF
The Ember.js Framework - Everything You Need To Know
PDF
DSpace UI prototype dsember
PDF
Stackup New Languages Talk: Ember is for Everybody
PDF
LA Ember.js Meetup, Jan 2017
PDF
The road to Ember 2.0
PPTX
Introduction to Ember.js
PPTX
Getting into ember.js
Riding the Edge with Ember.js
Modern, Scalable, Ambitious apps with Ember.js
A Beginner's Guide to Ember
Ember Reusable Components and Widgets
Ember.js: Jump Start
Ember.js 101 - JSChannel NCR
Sara Soueidan: Styling and Animating Scalable Vector Graphics with CSS [CSSCo...
Ember: Guts & Goals
Parse Apps with Ember.js
The road to Ember.js 2.0
Full slidescr16
Workshop 16: EmberJS Parte I
Introduction to Ember.js and how we used it at FlowPro.io
The Ember.js Framework - Everything You Need To Know
DSpace UI prototype dsember
Stackup New Languages Talk: Ember is for Everybody
LA Ember.js Meetup, Jan 2017
The road to Ember 2.0
Introduction to Ember.js
Getting into ember.js
Ad

More from Matthew Beale (13)

PDF
Ember.js Module Loading
PDF
Interoperable Component Patterns
PDF
Ember Community 2016 - Be the Bark
PDF
Attribute actions
PDF
The Hidden Power of HTMLBars (or, Scope in Ember.js Templates)
PDF
Aligning Ember.js with Web Standards
PDF
New Component Patterns in Ember.js
PDF
Testing Ember Apps: Managing Dependency
PDF
Snappy Means Happy: Performance in Ember Apps
PDF
Client-side Auth with Ember.js
PDF
Containers & Dependency in Ember.js
PDF
Complex Architectures in Ember
PDF
Ember and containers
Ember.js Module Loading
Interoperable Component Patterns
Ember Community 2016 - Be the Bark
Attribute actions
The Hidden Power of HTMLBars (or, Scope in Ember.js Templates)
Aligning Ember.js with Web Standards
New Component Patterns in Ember.js
Testing Ember Apps: Managing Dependency
Snappy Means Happy: Performance in Ember Apps
Client-side Auth with Ember.js
Containers & Dependency in Ember.js
Complex Architectures in Ember
Ember and containers

Recently uploaded (20)

PDF
Spectral efficient network and resource selection model in 5G networks
PPTX
MYSQL Presentation for SQL database connectivity
PDF
Encapsulation theory and applications.pdf
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PPTX
Cloud computing and distributed systems.
PPTX
sap open course for s4hana steps from ECC to s4
PDF
Encapsulation_ Review paper, used for researhc scholars
DOCX
The AUB Centre for AI in Media Proposal.docx
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
PDF
Approach and Philosophy of On baking technology
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PPTX
Programs and apps: productivity, graphics, security and other tools
PDF
NewMind AI Weekly Chronicles - August'25 Week I
Spectral efficient network and resource selection model in 5G networks
MYSQL Presentation for SQL database connectivity
Encapsulation theory and applications.pdf
Diabetes mellitus diagnosis method based random forest with bat algorithm
Cloud computing and distributed systems.
sap open course for s4hana steps from ECC to s4
Encapsulation_ Review paper, used for researhc scholars
The AUB Centre for AI in Media Proposal.docx
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
Building Integrated photovoltaic BIPV_UPV.pdf
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
Approach and Philosophy of On baking technology
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
Agricultural_Statistics_at_a_Glance_2022_0.pdf
Mobile App Security Testing_ A Comprehensive Guide.pdf
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Programs and apps: productivity, graphics, security and other tools
NewMind AI Weekly Chronicles - August'25 Week I

Scalable vector ember

  • 1. Scalable Vector Ember Death to HTML. Long live the DOM.
  • 3. 201 Created We build õ-age apps with Ember.js. We take teams from £ to • in no time flat.
  • 4. 1 <svg> 2 {{#each d in paths}} 3 <path {{bind-attr d=d}} /> 4 {{/each}} 5 </svg>
  • 10. Benefits of Raster Graphics • Small file-size (photos) • Computationally simple to render
  • 11. Vector Graphic (SVG) 1 <?xml version="1.0" standalone="no"?> 2 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 3 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 4 <svg width="12cm" height="4cm" viewBox="0 0 1200 400" 5 xmlns="http://www.w3.org/2000/svg" version="1.1"> 6 <desc>Example rect01 - rectangle with sharp corners</desc> 7 8 <rect x="400" y="100" width="400" height="200" 9 fill="yellow" stroke="navy" stroke-width="10" /> 10 </svg> w3.org
  • 12. Benefits of Vector Graphics • Small file-size (graphics) • Arbitrary resolution
  • 13. Part I Scalable Vector Graphics
  • 14. Why are we talking about this in 2014?
  • 15. 1998 Vector Markup Language proposed by Macromedia, Microsoft. PGML proposed by Adobe, Sun. W3C kick off SVG. 2001 SVG 1.0 2003 SVG 1.1
  • 16. Benefits of SVG Standard • Easy-to-parse metadata • Links • Animation
  • 17. 1998 Vector Markup Language proposed by Macromedia, Microsoft. PGML proposed by Adobe, Sun. W3C kick off SVG. 2001 SVG 1.0 2003 SVG 1.1 2004 Konqueror 3.2 support 2005 Gecko (Firefox) support 2006 WebKit (Chrome, Safari) support
  • 19. 1998 Vector Markup Language proposed by Macromedia, Microsoft. PGML proposed by Adobe, Sun. W3C kick off SVG. 2001 SVG 1.0 2003 SVG 1.1 2004 Konqueror 3.2 support 2005 Gecko (Firefox) support 2006 WebKit (Chrome, Safari) support 2011 IE9 is the last platform to support SVG
  • 20. 0.5% Woo! (almost) w3techs.com
  • 22. 3 ways to use SVG logo.svg <svg> document.createElementNS
  • 23. 3 ways to use SVG logo.svg <svg> document.createElementNS
  • 24. Creating elements with a namespace 1 var svg = document.createElementNS("http://www.w3.org/2000/svg", "svg"); 2 svg.setAttribute("viewBox", "0 0 1200 400"); 3 svg.setAttribute("width", "12cm"); 4 svg.setAttribute("height", "4cm"); 5 var path = document.createElementNS("http://www.w3.org/2000/svg", "path"); 6 path.setAttribute("x", "400"); 7 path.setAttribute("y", "100"); 8 path.setAttribute("width", "400"); 9 path.setAttribute("height", "200"); 10 path.setAttribute("fill", "yellow"); 11 path.setAttribute("stroke", "navy"); 12 path.setAttribute("stroke-width", "10"); 13 svg.appendChild(path); 14 document.body.appendChild(svg);
  • 25. Setting SVG attributes • Attributes are case sensitive 1 var div = document.createElement("div"); 2 div.setAttribute("someWacky", "foo"); 3 div.getAttribute("someWacky"); // => "foo" 4 div.getAttribute("somewacky"); // => "foo" 5 6 var svg = document.createElementNS(svgNS, "svg"); 7 svg.setAttribute("someWow", "boo") 8 svg.getAttribute("someWow"); // => "boo" 9 svg.getAttribute("somewow"); // => null • Property values are not primitives 1 svg.viewBox; // => SVGAnimatedRect {animVal: SVGRect, baseVal: SVGRect} 2 var viewBox = new SVGAnimatedRect(); // => TypeError: Illegal constructor 3 svg.viewBox = "0 0 100 100"; 4 svg.getAttribute("viewBox"); // => null
  • 26. Changing namespaces 1 <div> 2 <span></span> 3 <svg> 4 <path></path> 5 <foreignObject> 6 <div></div> 7 </foreignObject> 8 </svg> 9 </div> Entrance to namespace dictated by next element Exit from namespace dictated by previous element
  • 27. Part II Old Man Ember, Young Man Ember
  • 29. THERE CAN ONLY BE ONE
  • 31. THERE CAN ONLY BE DECK
  • 33. A template 1 <section> 2 {{if isShowing}} 3 <span>Howdy!</span> 4 {{/if}} 5 </section>
  • 34. Ember.js pre-1.8 1 var buffer = "<section>n"; 2 buffer += "<script metamorph-0-start></script>"; 3 if (isShowing) { 4 buffer += " <span>Howdy!</span>n"; 5 } 6 buffer += "<script metamorph-0-end></script>"; 7 buffer += "</section>"; 8 9 rootElement.innerHTML = buffer;
  • 35. Ember.js pre-1.8 1 var 2 buffer 3 if (isShowing) { 4 buffer 5 } 6 buffer 7 buffer 8 9 rootElement.innerHTML STRINGS, INNERHTML
  • 36. Ember.js 1.10 1 var outerChilden = [document.createElement('section')]; 2 3 var innerChildren; 4 if (isShowing) { 5 innerChildren = [document.createElement('span');] 6 innerChildren[0].appendChild(document.createTextNode('Howdy!')); 7 while (innerChildren[0]) { 8 outerChilden[0].appendChild(innerChildren[0]); 9 } 10 } 11 12 while (outerChilden[0]) { 13 rootElement.appendChild(outerChilden[0]); 14 }
  • 37. Ember.js 1.10 1 var 2 3 var 4 if (isShowing) { 5 innerChildren 6 innerChildren[ 7 while (innerChildren[ 8 outerChilden[ 9 } 10 } 11 12 while (outerChilden[ 13 rootElement.appendChild(outerChilden[ 14 } DOM! HTMLBARS! WOOOMG!
  • 38. Ember.js 1.8-1.9 1 var buffer, parsingNode; 2 3 buffer = "<section>n</section>"; 4 parsingNode = document.createElement('div'); 5 parsingNode.innerHTML = buffer; 6 var outerChilden = parsingNode.childNodes; 7 8 if (isShowing) { 9 buffer = " <span>Howdy!</span>n"; 10 parsingNode.innerHTML = buffer; 11 var innerChildren = parsingNode.childNodes; 12 while (innerChildren[0]) { 13 outerChilden[0].appendChild(innerChildren[0]); 14 } 15 } 16 17 while (outerChilden[0]) { 18 rootElement.appendChild(outerChilden[0]); 19 }
  • 39. Ember.js 1.8-1.9 1 var 2 3 buffer 4 parsingNode 5 parsingNode.innerHTML 6 var 7 8 if (isShowing) { 9 buffer 10 parsingNode.innerHTML 11 12 while (innerChildren[ 13 outerChilden[ 14 } 15 } 16 17 while (outerChilden[ 18 rootElement.appendChild(outerChilden[ 19 } STRING TEMPLATES, DOM for stitching
  • 40. Tricky stuff in 1.8+ • managing a context • detecting a namespace !
  • 41. Tricky stuff in 1.8+ 1 var string = handlebarsTemplate(context, options); 2 var nodes = domHelper.parseHTML(string, morph.contextualElement); 3 4 var node; 5 while (node = nodes[0]) { 6 rootElement.appendChild(node); 7 }
  • 42. HTMLBARS, Tricky stuff in 1.8+ 1.10 1 var nodes = htmlbarsTemplate(context, env, morph.contextualElement); 2 3 var node; 4 while (node = nodes[0]) { 5 rootElement.appendChild(node); 6 }
  • 43. Tricky stuff in 1.8+ • managing a context • detecting a namespace !
  • 44. Tricky stuff in 1.8+ 1 var root = document.createElement('div'); 2 3 root.innerHTML = "<svg><foreignObject><div></div></foreignObject></svg>"; 4 5 var svg = div.firstChild; 6 var foreignObject = svg.firstChild; 7 var div = foreignObject.firstChild; 8 9 svg.namespaceURI; // http://www.w3.org/2000/svg 10 foreignObject.namespaceURI; // http://www.w3.org/2000/svg 11 div.namespaceURI; // undefined
  • 45. Tricky stuff in 1.8+ 1 var root = document.createElementNS(svgNs, 'svg');! 2 ! 3 root.innerHTML = "<foreignObject><div></div></foreignObject>";! 4 ! 5 var foreignObject = root.firstChild;! 6 var div = foreignObject.firstChild;! 7 ! 8 svg.namespaceURI; // http://www.w3.org/2000/svg! 9 foreignObject.namespaceURI; // http://www.w3.org/2000/svg! 10 div.namespaceURI; // undefined!
  • 46. Tricky stuff in 1.8+ HTMLBARS, 1.10 1 var template = htmlbarsCompile( 2 "<foreignObject><div></div></foreignObject>" 3 ); 4 // so long as contextualElement is an SVG tag... 5 var nodes = template(context, env, morph.contextualElement); 6 7 var foreignObject = nodes[0]; 8 var div = foreignObject.firstChild; 9 10 foreignObject.namespaceURI; // http://www.w3.org/2000/svg 11 div.namespaceURI; // undefined
  • 47. Part III Death to HTML. Long live the DOM.
  • 48. HTML is transmitted as a string.
  • 49. • JS String (.jst, Ember <1.10) • HTML (Angular, Polymer) • JavaScript (React, Ember > 1.9, Mithril)
  • 51. But that doesn’t mean we should process it as a string.
  • 52. • innerHTML (.jst, Ember <1.10) • DOM (Angular, React, Ember > 1.9, Polymer, Mithril)
  • 53. ACTIONS UP ! BINDINGS DOWN
  • 54. transmit strings ! process DOM
  • 55. CONTROLLERS LEFT ! YEHUDA’S RIGHT