SlideShare uma empresa Scribd logo
1 de 67
JavaScript APIs You’ve
    Never Heard Of
 (And some you have)

                Nicholas C. Zakas
                        @slicknet
Who’s this guy?
flickr.com/photos/vbillings/172124448
                                    /
HTML5, DOM4 &
…DOM Level 2!
<ul id=“mylist”>
   <li>Item 1</li>
   <li>Item 1</li>
   <li>Item 1</li>
</ul>




                        UL




#text    LI     #text   LI   #text   LI   #text
<ul id=“mylist”>
     <li>Item 1</li>
     <li>Item 1</li>
     <li>Item 1</li>
  </ul>


  var list = document.getElementById(“mylist”);

  console.log(list.childNodes.length);          //7
  console.log(list.children.length);            //3




children
DOM4
HTMLCollection of all child nodes that are elements
<ul id=“mylist”>
     <li>Item 1</li>
     <li>Item 1</li>
     <li>Item 1</li>
  </ul>


  var list = document.getElementById(“mylist”),
      node1 = list.childNodes[0],
      child1 = list.children[0];

  console.log(node1.nodeName); //”#text”
  console.log(child1.nodeName); //”LI”



children
DOM4
HTMLCollection of all child nodes that are elements
<ul id=“mylist”>
     <!-- comment -->
     <li>Item 1</li>
     <li>Item 1</li>            IE 6-8 includes
     <li>Item 1</li>           comments in the
  </ul>                       children collection


  var list = document.getElementById(“mylist”),
      node1 = list.childNodes[0],
      child1 = list.children[0];

  console.log(node1.nodeName); //”#text”
  console.log(child1.nodeName); //”#comment”

children                                              BUG!
DOM4
HTMLCollection of all child nodes that are elements
UL

          firstChild                             lastChild




  #text      LI      #text       LI      #text       LI      #text




Element Traversal API
Defines new properties for accessing element children
9



                                UL

  firstElementChild                              lastElementChild




  #text      LI      #text       LI      #text       LI       #text




Element Traversal API
Defines new properties for accessing element children
9

  <ul id=“mylist”>
     <li>Item 1</li>
     <li>Item 1</li>
     <li>Item 1</li>
  </ul>


  var list = document.getElementById(“mylist”),
      node1 = list.firstChild,
      child1 = list.firstElementChild;

  console.log(node1.nodeName); //”#text”
  console.log(child1.nodeName); //”LI”



firstElementChild
Element Traversal API & DOM4
Point to first child node that is an element
9

  <ul id=“mylist”>
     <li>Item 1</li>
     <li>Item 1</li>
     <li>Item 1</li>
  </ul>


  var list = document.getElementById(“mylist”),
      node1= list.lastChild,
      child= list.lastElementChild;

  console.log(node1.nodeName); //”#text”
  console.log(child1.nodeName); //”LI”



lastElementChild
Element Traversal API & DOM4
Point to last child node that is an element
9




                 nextSibling

           LI                  #text                    LI




Element Traversal API
Defines new properties for accessing element children
9




           LI                  #text                    LI




                       nextElementSibling


Element Traversal API
Defines new properties for accessing element children
9




                 previousSibling

           LI                  #text                    LI




Element Traversal API
Defines new properties for accessing element children
9




           LI                  #text                    LI




                    previousElementSibling


Element Traversal API
Defines new properties for accessing element children
9

  // iterate over element children
  var child = element.firstElementChild;

  while(child) {
      process(child);
      child = child.nextElementSibling;
  }




Element Traversal API
Defines new properties for accessing element children
var element = document.getElementById(“foo”);

  if (document.body.contains(element)) {
      //do something
  }

  function isAncestor(child, maybeAncestor) {
      return maybeAncestor.contains(child);
  }

  // useful for event delegation
  if (isAncestor(event.target, list)) {
      // do something
  }

contains()
DOM4
Determines if a given element is an ancestor of another
“beforebegin”
              “afterbegin”
              “beforeend”
               “afterend”

element.insertAdjacentHTML(location, html);




                       Any valid HTML
                           string




insertAdjacentHTML()
HTML5
Insert an HTML string into the DOM at a specific place
<nav>
    <h2>Site Menu</h2>
    <ul id="menu">
        <li><a href="/">Home</a></li>
        <li><a href="/about">About</a></li>
    </ul>
</nav>


var menu = document.getElementById("menu");




insertAdjacentHTML()
HTML5
Insert an HTML string into the DOM at a specific place
<nav>
    <h2>Site Menu</h2>
    <p>Hello world!</p>
    <ul id="menu">
        <li><a href="/">Home</a></li>
        <li><a href="/about">About</a></li>
    </ul>
</nav>


var menu = document.getElementById("menu");
menu.insertAdjacentHTML("beforebegin",
    "<p>Hello world!</p>");


insertAdjacentHTML()
HTML5
Insert an HTML string into the DOM at a specific place
<nav>
    <h2>Site Menu</h2>
    <ul id="menu">
        <li>Hello world!</li>
        <li><a href="/">Home</a></li>
        <li><a href="/about">About</a></li>
    </ul>
</nav>


var menu = document.getElementById("menu");
menu.insertAdjacentHTML(“afterbegin",
    "<li>Hello world!</li>");


insertAdjacentHTML()
HTML5
Insert an HTML string into the DOM at a specific place
<nav>
    <h2>Site Menu</h2>
    <ul id="menu">
        <li><a href="/">Home</a></li>
        <li><a href="/about">About</a></li>
        <li>Hello world!</li>
    </ul>
</nav>


var menu = document.getElementById("menu");
menu.insertAdjacentHTML(“beforeend",
    "<li>Hello world!</li>");


insertAdjacentHTML()
HTML5
Insert an HTML string into the DOM at a specific place
<nav>
    <h2>Site Menu</h2>
    <ul id="menu">
        <li><a href="/">Home</a></li>
        <li><a href="/about">About</a></li>
    </ul>
    <p>Hello world!</p>
</nav>


var menu = document.getElementById("menu");
menu.insertAdjacentHTML(“afterend",
    "<p>Hello world!</p>");


insertAdjacentHTML()
HTML5
Insert an HTML string into the DOM at a specific place
http://jsperf.com/insertadjacenthtml-perf/4




                                              In many cases,
                                                faster than
                                                innerHTML!




insertAdjacentHTML()
HTML5
Insert an HTML string into the DOM at a specific place
element.outerHTML = html;




                      Any valid HTML
                          string




outerHTML
HTML5
Get/set HTML for an entire element
<nav>
    <h2>Site Menu</h2>
    <ul id="menu">
        <li><a href="/">Home</a></li>
        <li><a href="/about">About</a></li>
    </ul>
</nav>


var menu = document.getElementById("menu");
var html = menu.outerHTML;




outerHTML
HTML5
Get/set HTML for an entire element
<nav>
    <h2>Site Menu</h2>
    <p>Hello world!</p>
</nav>


var menu = document.getElementById("menu");     Detached
menu.outerHTML = "<p>Hello world!</p>";        reference to
                                                   <ul>
console.log(menu.tagName);           // “UL”
console.log(menu.parentNode);        // null




outerHTML
HTML5
Get/set HTML for an entire element
9




document.implementation.createHTMLDocument(title);


                               Title of the
                               document




createHTMLDocument()
DOM Level 2
Create an invisible document
9


var doc =
      document.implementation.createHTMLDocument(“Test”);

console.log(doc.title);        // “Test”

doc.body.innerHTML = “<p>Hello world!</p>”;
var p = document.querySelector(“p”);

console.log(p.textContent);      // “Hello world!”




createHTMLDocument()
DOM Level 2
Create an invisible document
9


function isSafeHTML(html) {
    var doc =
      document.implementation.createHTMLDocument(“Test”);

    doc.body.innerHTML = html;

    return !doc.querySelector(“script,style,link,object”);
}




createHTMLDocument()
DOM Level 2
Create an invisible document
9
function sanitizeHTML(html) {
    var doc =
      document.implementation.createHTMLDocument(“Test”);

    doc.body.innerHTML = html;

    var nodes =
         doc.querySelectorAll(“script,style,link,object”);

    for (var i=0, len=nodes.length; i < len; i++) {
        nodes[i].parentNode.removeChild(nodes[i]);
    }

    return doc.body.innerHTML;
}

createHTMLDocument()
DOM Level 2
Create an invisible document
9


<input value="data" id="data-field">



var textbox = document.getElementById("data-field");
textbox.focus();

textbox.select();


textbox.setSelectionRange(1, 3);




setSelectionRange()
HTML5
Select specific parts of textbox content
9


// put caret at start
textbox.setSelectionRange(0, 0);

// put caret at end
textbox.setSelectionRange(
    textbox.value.length,
    textbox.value.length);




setSelectionRange()
HTML5
Select specific parts of textbox content
9


<input value="data" id="data-field">



var textbox = document.getElementById("data-field");
textbox.focus();
textbox.setSelectionRange(1, 3);


console.log(textbox.selectionStart);          // 1
console.log(textbox.selectionEnd);            // 3




selectionStart/selectionEnd
HTML5
Set/get the start and ending range of selection
<input value="data" id="data-field">

var textbox = document.getElementById("data-field");
textbox.focus();

var focused = document.activeElement;
console.log(focused === textbox);              // true




activeElement
HTML5
Returns the element that currently has focus
XMLHttpRequest Level 2
3         10

  var data = new FormData();

  data.append(“name”, “Nicholas”);
  data.append(“age”, 25);
  data.append(“note”, “Yeah right!”);

  var xhr = new XMLHttpRequest();
  xhr.open(“post”, “/submit”, true);

  //setup event handlers

  xhr.send(data);




FormData
XMLHttpRequest Level 2
Used to submit <form> data via XMLHttpRequest
3         10

  var data = new FormData(document.forms[0]);

  var xhr = new XMLHttpRequest();
  xhr.open(“post”, “/submit”, true);

  //setup event handlers

  xhr.send(data);




FormData
XMLHttpRequest Level 2
Used to submit <form> data via XMLHttpRequest
3          10

  <input type="file" id="photo" name="photo">

  var data = new FormData(),
      fileControl = document.getElementById("photo");

  data.append(“name”, “Nicholas”);
  data.append(“photo”, fileControl.files[0]);

  var xhr = new XMLHttpRequest();
  xhr.open(“post”, “/submit”, true);

  //setup event handlers

  xhr.send(data);

FormData
XMLHttpRequest Level 2
Used to submit <form> data via XMLHttpRequest
3              10

  var xhr = new XMLHttpRequest();
  xhr.open(“post”, “/submit”, true);

  xhr.upload.onprogress = function(event) {
      var percentage = event.loaded/event.total * 100;
      updateProgress(percentage);
  };

  xhr.send(data);




Upload Progress
XMLHttpRequest Level 2
Monitor the time to upload
3     9

  var xhr = new XMLHttpRequest();
  xhr.open(“get”, “/data”, true);

  xhr.timeout = 5000;
  xhr.ontimeout = function() {
      console.log(“Request timed out.”);
  };

  // other event handlers

  xhr.send(data);




XHR Timeouts
XMLHttpRequest Level 2
Used to stop a request after a period of time
var xhr = new XMLHttpRequest();
  xhr.open(“get”, “/data”, true);

  xhr.onload = function() {
      var text = xhr.responseText;
      doSomethingWith(text);
  };

  // other event handlers

  xhr.send();




XHR Response Types
XMLHttpRequest Level 2
Retrieve a particular type of object – not just text!
var xhr = new XMLHttpRequest();
  xhr.open(“get”, “/data”, true);

  xhr.onload = function() {
      var xmldoc = xhr.responseXML;
      doSomethingWith(xmldoc);
  };

  // other event handlers

  xhr.send();




XHR Response Types
XMLHttpRequest Level 2
Retrieve a particular type of object – not just text!
3            10

  var xhr = new XMLHttpRequest();
  xhr.open(“get”, “/data”, true);

  xhr.responseType = "text";

  xhr.onload = function() {
      var text = xhr.response;
      doSomethingWith(text);
  };

  // other event handlers

  xhr.send();



XHR Response Types
XMLHttpRequest Level 2
Retrieve a particular type of object – not just text!
3            10

  var xhr = new XMLHttpRequest();
  xhr.open(“get”, “/data”, true);

  xhr.responseType = "document";

  xhr.onload = function() {
      var xmldoc = xhr.response;
      doSomethingWith(xmldoc);
  };

  // other event handlers

  xhr.send();



XHR Response Types
XMLHttpRequest Level 2
Retrieve a particular type of object – not just text!
3             10

  var xhr = new XMLHttpRequest();
  xhr.open(“get”, “/data”, true);

  xhr.responseType = "blob";

  xhr.onload = function() {                 Great for
      var blob = xhr.response;             downloading
      doSomethingWith(blob);                 images!
  };

  // other event handlers

  xhr.send();



XHR Response Types
XMLHttpRequest Level 2
Retrieve a particular type of object – not just text!
3                  10

  var xhr = new XMLHttpRequest();
  xhr.open(“get”, “/data”, true);
                                                          Great for
                                                        downloading
  xhr.responseType = "arraybuffer";
                                                        binary data!
  xhr.onload = function() {
      var binData = new Uint16Array(xhr.response);
      doSomethingWith(binData);
  };

  // other event handlers

  xhr.send();



XHR Response Types
XMLHttpRequest Level 2
Retrieve a particular type of object – not just text!
var xhr = new XMLHttpRequest();
  xhr.open(“get”, “/data”, true);

  xhr.responseType = "json";

  xhr.onload = function() {
      var json = xhr.response;
      doSomethingWith(json);
  };

  // other event handlers

  xhr.send();



XHR Response Types
XMLHttpRequest Level 2
Retrieve a particular type of object – not just text!
CSS in JavaScript
3                  9

  var element = document.getElementById(“foo”);

  if (element.matchesSelector(“#foo”)) {
      //do something
  }

  if (element.matchesSelector(“body .bar”)) {
      //do something
  }




matchesSelector()
Selector API Level 2
Determines if the element matches a certain CSS selector
element.mozMatchesSelector()

                 element.webkitMatchesSelector()

                 element.msMatchesSelector()

                 element.oMatchesSelector()




matchesSelector()
Selector API Level 2
Determines if the element matches a certain CSS selector
var element = document.getElementById(“foo”);

  if (element.matches(“#foo”)) {
      //do something
  }

  if (element.matches(“.bar”, element.parentNode)) {
      //do something
  }




matches ()
Selector API Level 2
Determines if the element matches a certain CSS selector
Hello!




getBoundingClientRect()
CSS Object Model Views
Determines size and location of an element in the viewport
var rect = element.getBoundingClientRect();

// all measurements in pixels relative to viewport
console.log(rect.left);
console.log(rect.top);
console.log(rect.right);      // relative to left
console.log(rect.bottom);     // relative to top

console.log(rect.width);
console.log(rect.height);



getBoundingClientRect()
CSS Object Model Views
Determines size and location of an element in the viewport
var rect = element.getBoundingClientRect();

// all measurements in pixels relative 8 adds 2 to each
                                   IE < to viewport
console.log(rect.left);           coordinate – you must
console.log(rect.top);                  subtract it
console.log(rect.right);      // relative to left
console.log(rect.bottom);     // relative to top

console.log(rect.width);
console.log(rect.height);



getBoundingClientRect()                                      BUG!
CSS Object Model Views
Determines size and location of an element in the viewport
Think clientX and
                           clientY


  var element = document.elementFromPoint(x, y);




               Element at that
              point with highest
                   z-index




elementFromPoint()
CSS Object Model Views
Return the element at a position relative to viewport
Think clientX and
                           clientY


  var element = document.elementFromPoint(x, y);




               Element at that
              point with highest
                   z-index




elementFromPoint()
CSS Object Model Views
Return the element at a position relative to viewport
10

var mql = window.matchMedia(“(max-width:600px)”);

if (mql.matches) {
    //do something
}

mql.addListener(function(mql) {

      console.log(mql.media + “ “ +
          (mql.matches ? “matches” : “doesn’t match”);

});




matchMedia()
CSS Object Model Views
Allows JavaScript to interact with CSS media queries
Review
What We Talked About
•   Element Traversal API
•   element.children
•   element.contains()
•   element.insertAdjacentHTML()
•   element.outerHTML
•   document.activeElement
•   document.implementation.createHTMLDocument()
•   element.setSelectionRange()
•   element.selectionStart
•   element.selectionEnd
What We Talked About
•   FormData
•   Upload Progress
•   XHR Timeouts
•   XHR Response Types
•   element.matchesSelector()
•   element.getBoundingClientRect()
•   document.elementFromPoint()
•   window.matchMedia()
The End
Etcetera

My blog:      nczonline.net
Twitter:      @slicknet
These Slides: slideshare.net/nzakas

Mais conteúdo relacionado

Mais procurados

FUNCTIONS IN R PROGRAMMING.pptx
FUNCTIONS IN R PROGRAMMING.pptxFUNCTIONS IN R PROGRAMMING.pptx
FUNCTIONS IN R PROGRAMMING.pptxSafnaSaff1
 
R programming slides
R  programming slidesR  programming slides
R programming slidesPankaj Saini
 
Dynamic Binding in C# 4.0
Dynamic Binding in C# 4.0Dynamic Binding in C# 4.0
Dynamic Binding in C# 4.0Buu Nguyen
 
DBT PU BI Lab Manual for ETL Exercise.pdf
DBT PU BI Lab Manual for ETL Exercise.pdfDBT PU BI Lab Manual for ETL Exercise.pdf
DBT PU BI Lab Manual for ETL Exercise.pdfJanakiramanS13
 
GUI Programming in JAVA (Using Netbeans) - A Review
GUI Programming in JAVA (Using Netbeans) -  A ReviewGUI Programming in JAVA (Using Netbeans) -  A Review
GUI Programming in JAVA (Using Netbeans) - A ReviewFernando Torres
 
Introduction to python for Beginners
Introduction to python for Beginners Introduction to python for Beginners
Introduction to python for Beginners Sujith Kumar
 
implementation of travelling salesman problem with complexity ppt
implementation of travelling salesman problem with complexity pptimplementation of travelling salesman problem with complexity ppt
implementation of travelling salesman problem with complexity pptAntaraBhattacharya12
 
Introduction to programming
Introduction to programmingIntroduction to programming
Introduction to programmingNeeru Mittal
 
Perspective in Informatics 3 - Assignment 2 - Answer Sheet
Perspective in Informatics 3 - Assignment 2 - Answer SheetPerspective in Informatics 3 - Assignment 2 - Answer Sheet
Perspective in Informatics 3 - Assignment 2 - Answer SheetHoang Nguyen Phong
 
Traveling salesman problem
Traveling salesman problemTraveling salesman problem
Traveling salesman problemJayesh Chauhan
 
The Traveling Salesman Problem
The Traveling Salesman ProblemThe Traveling Salesman Problem
The Traveling Salesman ProblemMaryam Alipour
 
Hand gesture recognition system(FYP REPORT)
Hand gesture recognition system(FYP REPORT)Hand gesture recognition system(FYP REPORT)
Hand gesture recognition system(FYP REPORT)Afnan Rehman
 
[Question Paper] ASP.NET With C# (75:25 Pattern) [April / 2016]
[Question Paper] ASP.NET With C# (75:25 Pattern) [April / 2016][Question Paper] ASP.NET With C# (75:25 Pattern) [April / 2016]
[Question Paper] ASP.NET With C# (75:25 Pattern) [April / 2016]Mumbai B.Sc.IT Study
 

Mais procurados (20)

FUNCTIONS IN R PROGRAMMING.pptx
FUNCTIONS IN R PROGRAMMING.pptxFUNCTIONS IN R PROGRAMMING.pptx
FUNCTIONS IN R PROGRAMMING.pptx
 
Python
PythonPython
Python
 
R programming slides
R  programming slidesR  programming slides
R programming slides
 
Python final ppt
Python final pptPython final ppt
Python final ppt
 
Dynamic Binding in C# 4.0
Dynamic Binding in C# 4.0Dynamic Binding in C# 4.0
Dynamic Binding in C# 4.0
 
DBT PU BI Lab Manual for ETL Exercise.pdf
DBT PU BI Lab Manual for ETL Exercise.pdfDBT PU BI Lab Manual for ETL Exercise.pdf
DBT PU BI Lab Manual for ETL Exercise.pdf
 
GUI Programming in JAVA (Using Netbeans) - A Review
GUI Programming in JAVA (Using Netbeans) -  A ReviewGUI Programming in JAVA (Using Netbeans) -  A Review
GUI Programming in JAVA (Using Netbeans) - A Review
 
Introduction to python for Beginners
Introduction to python for Beginners Introduction to python for Beginners
Introduction to python for Beginners
 
Programming
ProgrammingProgramming
Programming
 
implementation of travelling salesman problem with complexity ppt
implementation of travelling salesman problem with complexity pptimplementation of travelling salesman problem with complexity ppt
implementation of travelling salesman problem with complexity ppt
 
R programming
R programmingR programming
R programming
 
Introduction to programming
Introduction to programmingIntroduction to programming
Introduction to programming
 
Perspective in Informatics 3 - Assignment 2 - Answer Sheet
Perspective in Informatics 3 - Assignment 2 - Answer SheetPerspective in Informatics 3 - Assignment 2 - Answer Sheet
Perspective in Informatics 3 - Assignment 2 - Answer Sheet
 
Traveling salesman problem
Traveling salesman problemTraveling salesman problem
Traveling salesman problem
 
The Traveling Salesman Problem
The Traveling Salesman ProblemThe Traveling Salesman Problem
The Traveling Salesman Problem
 
Hand gesture recognition system(FYP REPORT)
Hand gesture recognition system(FYP REPORT)Hand gesture recognition system(FYP REPORT)
Hand gesture recognition system(FYP REPORT)
 
Meaning Of VB
Meaning Of VBMeaning Of VB
Meaning Of VB
 
[Question Paper] ASP.NET With C# (75:25 Pattern) [April / 2016]
[Question Paper] ASP.NET With C# (75:25 Pattern) [April / 2016][Question Paper] ASP.NET With C# (75:25 Pattern) [April / 2016]
[Question Paper] ASP.NET With C# (75:25 Pattern) [April / 2016]
 
Python basics
Python basicsPython basics
Python basics
 
Dictionary in python
Dictionary in pythonDictionary in python
Dictionary in python
 

Destaque

Browser Wars Episode 1: The Phantom Menace
Browser Wars Episode 1: The Phantom MenaceBrowser Wars Episode 1: The Phantom Menace
Browser Wars Episode 1: The Phantom MenaceNicholas Zakas
 
Maintainable JavaScript 2012
Maintainable JavaScript 2012Maintainable JavaScript 2012
Maintainable JavaScript 2012Nicholas Zakas
 
Scalable JavaScript Application Architecture
Scalable JavaScript Application ArchitectureScalable JavaScript Application Architecture
Scalable JavaScript Application ArchitectureNicholas Zakas
 
Enterprise JavaScript Error Handling (Ajax Experience 2008)
Enterprise JavaScript Error Handling (Ajax Experience 2008)Enterprise JavaScript Error Handling (Ajax Experience 2008)
Enterprise JavaScript Error Handling (Ajax Experience 2008)Nicholas Zakas
 
Maintainable JavaScript 2011
Maintainable JavaScript 2011Maintainable JavaScript 2011
Maintainable JavaScript 2011Nicholas Zakas
 
High Performance JavaScript (CapitolJS 2011)
High Performance JavaScript (CapitolJS 2011)High Performance JavaScript (CapitolJS 2011)
High Performance JavaScript (CapitolJS 2011)Nicholas Zakas
 
Writing Efficient JavaScript
Writing Efficient JavaScriptWriting Efficient JavaScript
Writing Efficient JavaScriptNicholas Zakas
 
High Performance JavaScript - Fronteers 2010
High Performance JavaScript - Fronteers 2010High Performance JavaScript - Fronteers 2010
High Performance JavaScript - Fronteers 2010Nicholas Zakas
 
High Performance JavaScript (YUIConf 2010)
High Performance JavaScript (YUIConf 2010)High Performance JavaScript (YUIConf 2010)
High Performance JavaScript (YUIConf 2010)Nicholas Zakas
 
Performance on the Yahoo! Homepage
Performance on the Yahoo! HomepagePerformance on the Yahoo! Homepage
Performance on the Yahoo! HomepageNicholas Zakas
 
Mobile Web Speed Bumps
Mobile Web Speed BumpsMobile Web Speed Bumps
Mobile Web Speed BumpsNicholas Zakas
 
Functional Programming with Ruby
Functional Programming with RubyFunctional Programming with Ruby
Functional Programming with Rubytokland
 
Dom(document object model)
Dom(document object model)Dom(document object model)
Dom(document object model)Partnered Health
 
Инструкция по сборке конструктора Brick арт. 908 "Пожарная спецтехника"
Инструкция по сборке конструктора Brick арт. 908 "Пожарная спецтехника"Инструкция по сборке конструктора Brick арт. 908 "Пожарная спецтехника"
Инструкция по сборке конструктора Brick арт. 908 "Пожарная спецтехника"mamazin
 
Javascript, DOM, browsers and frameworks basics
Javascript, DOM, browsers and frameworks basicsJavascript, DOM, browsers and frameworks basics
Javascript, DOM, browsers and frameworks basicsNet7
 
Scalable JavaScript Application Architecture 2012
Scalable JavaScript Application Architecture 2012Scalable JavaScript Application Architecture 2012
Scalable JavaScript Application Architecture 2012Nicholas Zakas
 
Social Shop Research Overview
Social Shop Research OverviewSocial Shop Research Overview
Social Shop Research OverviewLeo Burnett
 

Destaque (20)

Browser Wars Episode 1: The Phantom Menace
Browser Wars Episode 1: The Phantom MenaceBrowser Wars Episode 1: The Phantom Menace
Browser Wars Episode 1: The Phantom Menace
 
Maintainable JavaScript 2012
Maintainable JavaScript 2012Maintainable JavaScript 2012
Maintainable JavaScript 2012
 
Scalable JavaScript Application Architecture
Scalable JavaScript Application ArchitectureScalable JavaScript Application Architecture
Scalable JavaScript Application Architecture
 
The Pointerless Web
The Pointerless WebThe Pointerless Web
The Pointerless Web
 
Enterprise JavaScript Error Handling (Ajax Experience 2008)
Enterprise JavaScript Error Handling (Ajax Experience 2008)Enterprise JavaScript Error Handling (Ajax Experience 2008)
Enterprise JavaScript Error Handling (Ajax Experience 2008)
 
Maintainable JavaScript 2011
Maintainable JavaScript 2011Maintainable JavaScript 2011
Maintainable JavaScript 2011
 
High Performance JavaScript (CapitolJS 2011)
High Performance JavaScript (CapitolJS 2011)High Performance JavaScript (CapitolJS 2011)
High Performance JavaScript (CapitolJS 2011)
 
Writing Efficient JavaScript
Writing Efficient JavaScriptWriting Efficient JavaScript
Writing Efficient JavaScript
 
High Performance JavaScript - Fronteers 2010
High Performance JavaScript - Fronteers 2010High Performance JavaScript - Fronteers 2010
High Performance JavaScript - Fronteers 2010
 
High Performance JavaScript (YUIConf 2010)
High Performance JavaScript (YUIConf 2010)High Performance JavaScript (YUIConf 2010)
High Performance JavaScript (YUIConf 2010)
 
Performance on the Yahoo! Homepage
Performance on the Yahoo! HomepagePerformance on the Yahoo! Homepage
Performance on the Yahoo! Homepage
 
Mobile Web Speed Bumps
Mobile Web Speed BumpsMobile Web Speed Bumps
Mobile Web Speed Bumps
 
Functional Programming with Ruby
Functional Programming with RubyFunctional Programming with Ruby
Functional Programming with Ruby
 
Dom(document object model)
Dom(document object model)Dom(document object model)
Dom(document object model)
 
Инструкция по сборке конструктора Brick арт. 908 "Пожарная спецтехника"
Инструкция по сборке конструктора Brick арт. 908 "Пожарная спецтехника"Инструкция по сборке конструктора Brick арт. 908 "Пожарная спецтехника"
Инструкция по сборке конструктора Brick арт. 908 "Пожарная спецтехника"
 
Javascript, DOM, browsers and frameworks basics
Javascript, DOM, browsers and frameworks basicsJavascript, DOM, browsers and frameworks basics
Javascript, DOM, browsers and frameworks basics
 
Scalable JavaScript Application Architecture 2012
Scalable JavaScript Application Architecture 2012Scalable JavaScript Application Architecture 2012
Scalable JavaScript Application Architecture 2012
 
Document Object Model
Document Object ModelDocument Object Model
Document Object Model
 
Social Shop Research Overview
Social Shop Research OverviewSocial Shop Research Overview
Social Shop Research Overview
 
Javascript and DOM
Javascript and DOMJavascript and DOM
Javascript and DOM
 

Semelhante a JavaScript APIs you’ve never heard of (and some you have)

INTRODUCTION TO DOM AND DOM TREE
INTRODUCTION TO DOM AND DOM TREEINTRODUCTION TO DOM AND DOM TREE
INTRODUCTION TO DOM AND DOM TREEsystematiclab
 
fuser interface-development-using-jquery
fuser interface-development-using-jqueryfuser interface-development-using-jquery
fuser interface-development-using-jqueryKostas Mavridis
 
Art of Javascript
Art of JavascriptArt of Javascript
Art of JavascriptTarek Yehia
 
Introduction to javascript and yoolkui
Introduction to javascript and yoolkuiIntroduction to javascript and yoolkui
Introduction to javascript and yoolkuiKhou Suylong
 
Week 4 - jQuery + Ajax
Week 4 - jQuery + AjaxWeek 4 - jQuery + Ajax
Week 4 - jQuery + Ajaxbaygross
 
Entities in drupal 7
Entities in drupal 7Entities in drupal 7
Entities in drupal 7Zsolt Tasnadi
 
Getting Started with DOM
Getting Started with DOMGetting Started with DOM
Getting Started with DOMHernan Mammana
 
JavaScript: Ajax & DOM Manipulation
JavaScript: Ajax & DOM ManipulationJavaScript: Ajax & DOM Manipulation
JavaScript: Ajax & DOM Manipulationborkweb
 
A Rich Web experience with jQuery, Ajax and .NET
A Rich Web experience with jQuery, Ajax and .NETA Rich Web experience with jQuery, Ajax and .NET
A Rich Web experience with jQuery, Ajax and .NETJames Johnson
 
Jquery tutorial-beginners
Jquery tutorial-beginnersJquery tutorial-beginners
Jquery tutorial-beginnersIsfand yar Khan
 
The Magic Revealed: Four Real-World Examples of Using the Client Object Model...
The Magic Revealed: Four Real-World Examples of Using the Client Object Model...The Magic Revealed: Four Real-World Examples of Using the Client Object Model...
The Magic Revealed: Four Real-World Examples of Using the Client Object Model...SPTechCon
 
HTML5 APIs - Where no man has gone before! - Altran
HTML5 APIs - Where no man has gone before! - AltranHTML5 APIs - Where no man has gone before! - Altran
HTML5 APIs - Where no man has gone before! - AltranRobert Nyman
 

Semelhante a JavaScript APIs you’ve never heard of (and some you have) (20)

Java script
Java scriptJava script
Java script
 
Automating Ievb
Automating IevbAutomating Ievb
Automating Ievb
 
INTRODUCTION TO DOM AND DOM TREE
INTRODUCTION TO DOM AND DOM TREEINTRODUCTION TO DOM AND DOM TREE
INTRODUCTION TO DOM AND DOM TREE
 
Web 6 | JavaScript DOM
Web 6 | JavaScript DOMWeb 6 | JavaScript DOM
Web 6 | JavaScript DOM
 
fuser interface-development-using-jquery
fuser interface-development-using-jqueryfuser interface-development-using-jquery
fuser interface-development-using-jquery
 
Art of Javascript
Art of JavascriptArt of Javascript
Art of Javascript
 
Introduction to javascript and yoolkui
Introduction to javascript and yoolkuiIntroduction to javascript and yoolkui
Introduction to javascript and yoolkui
 
Week 4 - jQuery + Ajax
Week 4 - jQuery + AjaxWeek 4 - jQuery + Ajax
Week 4 - jQuery + Ajax
 
Diving into php
Diving into phpDiving into php
Diving into php
 
DOM and Events
DOM and EventsDOM and Events
DOM and Events
 
JQuery
JQueryJQuery
JQuery
 
Entities in drupal 7
Entities in drupal 7Entities in drupal 7
Entities in drupal 7
 
Getting Started with DOM
Getting Started with DOMGetting Started with DOM
Getting Started with DOM
 
JavaScript: Ajax & DOM Manipulation
JavaScript: Ajax & DOM ManipulationJavaScript: Ajax & DOM Manipulation
JavaScript: Ajax & DOM Manipulation
 
Jquery-overview
Jquery-overviewJquery-overview
Jquery-overview
 
A Rich Web experience with jQuery, Ajax and .NET
A Rich Web experience with jQuery, Ajax and .NETA Rich Web experience with jQuery, Ajax and .NET
A Rich Web experience with jQuery, Ajax and .NET
 
Jquery tutorial-beginners
Jquery tutorial-beginnersJquery tutorial-beginners
Jquery tutorial-beginners
 
The Magic Revealed: Four Real-World Examples of Using the Client Object Model...
The Magic Revealed: Four Real-World Examples of Using the Client Object Model...The Magic Revealed: Four Real-World Examples of Using the Client Object Model...
The Magic Revealed: Four Real-World Examples of Using the Client Object Model...
 
jQuery introduction
jQuery introductionjQuery introduction
jQuery introduction
 
HTML5 APIs - Where no man has gone before! - Altran
HTML5 APIs - Where no man has gone before! - AltranHTML5 APIs - Where no man has gone before! - Altran
HTML5 APIs - Where no man has gone before! - Altran
 

Mais de Nicholas Zakas

Enough with the JavaScript already!
Enough with the JavaScript already!Enough with the JavaScript already!
Enough with the JavaScript already!Nicholas Zakas
 
JavaScript Timers, Power Consumption, and Performance
JavaScript Timers, Power Consumption, and PerformanceJavaScript Timers, Power Consumption, and Performance
JavaScript Timers, Power Consumption, and PerformanceNicholas Zakas
 
High Performance JavaScript 2011
High Performance JavaScript 2011High Performance JavaScript 2011
High Performance JavaScript 2011Nicholas Zakas
 
High Performance JavaScript (Amazon DevCon 2011)
High Performance JavaScript (Amazon DevCon 2011)High Performance JavaScript (Amazon DevCon 2011)
High Performance JavaScript (Amazon DevCon 2011)Nicholas Zakas
 
Progressive Enhancement 2.0 (Conference Agnostic)
Progressive Enhancement 2.0 (Conference Agnostic)Progressive Enhancement 2.0 (Conference Agnostic)
Progressive Enhancement 2.0 (Conference Agnostic)Nicholas Zakas
 
Progressive Enhancement 2.0 (jQuery Conference SF Bay Area 2011)
Progressive Enhancement 2.0 (jQuery Conference SF Bay Area 2011)Progressive Enhancement 2.0 (jQuery Conference SF Bay Area 2011)
Progressive Enhancement 2.0 (jQuery Conference SF Bay Area 2011)Nicholas Zakas
 
YUI Test The Next Generation (YUIConf 2010)
YUI Test The Next Generation (YUIConf 2010)YUI Test The Next Generation (YUIConf 2010)
YUI Test The Next Generation (YUIConf 2010)Nicholas Zakas
 
Nicholas' Performance Talk at Google
Nicholas' Performance Talk at GoogleNicholas' Performance Talk at Google
Nicholas' Performance Talk at GoogleNicholas Zakas
 
High Performance JavaScript - WebDirections USA 2010
High Performance JavaScript - WebDirections USA 2010High Performance JavaScript - WebDirections USA 2010
High Performance JavaScript - WebDirections USA 2010Nicholas Zakas
 
High Performance JavaScript - jQuery Conference SF Bay Area 2010
High Performance JavaScript - jQuery Conference SF Bay Area 2010High Performance JavaScript - jQuery Conference SF Bay Area 2010
High Performance JavaScript - jQuery Conference SF Bay Area 2010Nicholas Zakas
 
Extreme JavaScript Compression With YUI Compressor
Extreme JavaScript Compression With YUI CompressorExtreme JavaScript Compression With YUI Compressor
Extreme JavaScript Compression With YUI CompressorNicholas Zakas
 
Speed Up Your JavaScript
Speed Up Your JavaScriptSpeed Up Your JavaScript
Speed Up Your JavaScriptNicholas Zakas
 
Maintainable JavaScript
Maintainable JavaScriptMaintainable JavaScript
Maintainable JavaScriptNicholas Zakas
 
JavaScript Variable Performance
JavaScript Variable PerformanceJavaScript Variable Performance
JavaScript Variable PerformanceNicholas Zakas
 
The New Yahoo! Homepage and YUI 3
The New Yahoo! Homepage and YUI 3The New Yahoo! Homepage and YUI 3
The New Yahoo! Homepage and YUI 3Nicholas Zakas
 
Test Driven Development With YUI Test (Ajax Experience 2008)
Test Driven Development With YUI Test (Ajax Experience 2008)Test Driven Development With YUI Test (Ajax Experience 2008)
Test Driven Development With YUI Test (Ajax Experience 2008)Nicholas Zakas
 

Mais de Nicholas Zakas (17)

Enough with the JavaScript already!
Enough with the JavaScript already!Enough with the JavaScript already!
Enough with the JavaScript already!
 
JavaScript Timers, Power Consumption, and Performance
JavaScript Timers, Power Consumption, and PerformanceJavaScript Timers, Power Consumption, and Performance
JavaScript Timers, Power Consumption, and Performance
 
High Performance JavaScript 2011
High Performance JavaScript 2011High Performance JavaScript 2011
High Performance JavaScript 2011
 
High Performance JavaScript (Amazon DevCon 2011)
High Performance JavaScript (Amazon DevCon 2011)High Performance JavaScript (Amazon DevCon 2011)
High Performance JavaScript (Amazon DevCon 2011)
 
Progressive Enhancement 2.0 (Conference Agnostic)
Progressive Enhancement 2.0 (Conference Agnostic)Progressive Enhancement 2.0 (Conference Agnostic)
Progressive Enhancement 2.0 (Conference Agnostic)
 
Progressive Enhancement 2.0 (jQuery Conference SF Bay Area 2011)
Progressive Enhancement 2.0 (jQuery Conference SF Bay Area 2011)Progressive Enhancement 2.0 (jQuery Conference SF Bay Area 2011)
Progressive Enhancement 2.0 (jQuery Conference SF Bay Area 2011)
 
YUI Test The Next Generation (YUIConf 2010)
YUI Test The Next Generation (YUIConf 2010)YUI Test The Next Generation (YUIConf 2010)
YUI Test The Next Generation (YUIConf 2010)
 
Nicholas' Performance Talk at Google
Nicholas' Performance Talk at GoogleNicholas' Performance Talk at Google
Nicholas' Performance Talk at Google
 
High Performance JavaScript - WebDirections USA 2010
High Performance JavaScript - WebDirections USA 2010High Performance JavaScript - WebDirections USA 2010
High Performance JavaScript - WebDirections USA 2010
 
High Performance JavaScript - jQuery Conference SF Bay Area 2010
High Performance JavaScript - jQuery Conference SF Bay Area 2010High Performance JavaScript - jQuery Conference SF Bay Area 2010
High Performance JavaScript - jQuery Conference SF Bay Area 2010
 
Responsive interfaces
Responsive interfacesResponsive interfaces
Responsive interfaces
 
Extreme JavaScript Compression With YUI Compressor
Extreme JavaScript Compression With YUI CompressorExtreme JavaScript Compression With YUI Compressor
Extreme JavaScript Compression With YUI Compressor
 
Speed Up Your JavaScript
Speed Up Your JavaScriptSpeed Up Your JavaScript
Speed Up Your JavaScript
 
Maintainable JavaScript
Maintainable JavaScriptMaintainable JavaScript
Maintainable JavaScript
 
JavaScript Variable Performance
JavaScript Variable PerformanceJavaScript Variable Performance
JavaScript Variable Performance
 
The New Yahoo! Homepage and YUI 3
The New Yahoo! Homepage and YUI 3The New Yahoo! Homepage and YUI 3
The New Yahoo! Homepage and YUI 3
 
Test Driven Development With YUI Test (Ajax Experience 2008)
Test Driven Development With YUI Test (Ajax Experience 2008)Test Driven Development With YUI Test (Ajax Experience 2008)
Test Driven Development With YUI Test (Ajax Experience 2008)
 

JavaScript APIs you’ve never heard of (and some you have)

  • 1. JavaScript APIs You’ve Never Heard Of (And some you have) Nicholas C. Zakas @slicknet
  • 3.
  • 6.
  • 7. <ul id=“mylist”> <li>Item 1</li> <li>Item 1</li> <li>Item 1</li> </ul> UL #text LI #text LI #text LI #text
  • 8. <ul id=“mylist”> <li>Item 1</li> <li>Item 1</li> <li>Item 1</li> </ul> var list = document.getElementById(“mylist”); console.log(list.childNodes.length); //7 console.log(list.children.length); //3 children DOM4 HTMLCollection of all child nodes that are elements
  • 9. <ul id=“mylist”> <li>Item 1</li> <li>Item 1</li> <li>Item 1</li> </ul> var list = document.getElementById(“mylist”), node1 = list.childNodes[0], child1 = list.children[0]; console.log(node1.nodeName); //”#text” console.log(child1.nodeName); //”LI” children DOM4 HTMLCollection of all child nodes that are elements
  • 10. <ul id=“mylist”> <!-- comment --> <li>Item 1</li> <li>Item 1</li> IE 6-8 includes <li>Item 1</li> comments in the </ul> children collection var list = document.getElementById(“mylist”), node1 = list.childNodes[0], child1 = list.children[0]; console.log(node1.nodeName); //”#text” console.log(child1.nodeName); //”#comment” children BUG! DOM4 HTMLCollection of all child nodes that are elements
  • 11. UL firstChild lastChild #text LI #text LI #text LI #text Element Traversal API Defines new properties for accessing element children
  • 12. 9 UL firstElementChild lastElementChild #text LI #text LI #text LI #text Element Traversal API Defines new properties for accessing element children
  • 13. 9 <ul id=“mylist”> <li>Item 1</li> <li>Item 1</li> <li>Item 1</li> </ul> var list = document.getElementById(“mylist”), node1 = list.firstChild, child1 = list.firstElementChild; console.log(node1.nodeName); //”#text” console.log(child1.nodeName); //”LI” firstElementChild Element Traversal API & DOM4 Point to first child node that is an element
  • 14. 9 <ul id=“mylist”> <li>Item 1</li> <li>Item 1</li> <li>Item 1</li> </ul> var list = document.getElementById(“mylist”), node1= list.lastChild, child= list.lastElementChild; console.log(node1.nodeName); //”#text” console.log(child1.nodeName); //”LI” lastElementChild Element Traversal API & DOM4 Point to last child node that is an element
  • 15. 9 nextSibling LI #text LI Element Traversal API Defines new properties for accessing element children
  • 16. 9 LI #text LI nextElementSibling Element Traversal API Defines new properties for accessing element children
  • 17. 9 previousSibling LI #text LI Element Traversal API Defines new properties for accessing element children
  • 18. 9 LI #text LI previousElementSibling Element Traversal API Defines new properties for accessing element children
  • 19. 9 // iterate over element children var child = element.firstElementChild; while(child) { process(child); child = child.nextElementSibling; } Element Traversal API Defines new properties for accessing element children
  • 20. var element = document.getElementById(“foo”); if (document.body.contains(element)) { //do something } function isAncestor(child, maybeAncestor) { return maybeAncestor.contains(child); } // useful for event delegation if (isAncestor(event.target, list)) { // do something } contains() DOM4 Determines if a given element is an ancestor of another
  • 21. “beforebegin” “afterbegin” “beforeend” “afterend” element.insertAdjacentHTML(location, html); Any valid HTML string insertAdjacentHTML() HTML5 Insert an HTML string into the DOM at a specific place
  • 22. <nav> <h2>Site Menu</h2> <ul id="menu"> <li><a href="/">Home</a></li> <li><a href="/about">About</a></li> </ul> </nav> var menu = document.getElementById("menu"); insertAdjacentHTML() HTML5 Insert an HTML string into the DOM at a specific place
  • 23. <nav> <h2>Site Menu</h2> <p>Hello world!</p> <ul id="menu"> <li><a href="/">Home</a></li> <li><a href="/about">About</a></li> </ul> </nav> var menu = document.getElementById("menu"); menu.insertAdjacentHTML("beforebegin", "<p>Hello world!</p>"); insertAdjacentHTML() HTML5 Insert an HTML string into the DOM at a specific place
  • 24. <nav> <h2>Site Menu</h2> <ul id="menu"> <li>Hello world!</li> <li><a href="/">Home</a></li> <li><a href="/about">About</a></li> </ul> </nav> var menu = document.getElementById("menu"); menu.insertAdjacentHTML(“afterbegin", "<li>Hello world!</li>"); insertAdjacentHTML() HTML5 Insert an HTML string into the DOM at a specific place
  • 25. <nav> <h2>Site Menu</h2> <ul id="menu"> <li><a href="/">Home</a></li> <li><a href="/about">About</a></li> <li>Hello world!</li> </ul> </nav> var menu = document.getElementById("menu"); menu.insertAdjacentHTML(“beforeend", "<li>Hello world!</li>"); insertAdjacentHTML() HTML5 Insert an HTML string into the DOM at a specific place
  • 26. <nav> <h2>Site Menu</h2> <ul id="menu"> <li><a href="/">Home</a></li> <li><a href="/about">About</a></li> </ul> <p>Hello world!</p> </nav> var menu = document.getElementById("menu"); menu.insertAdjacentHTML(“afterend", "<p>Hello world!</p>"); insertAdjacentHTML() HTML5 Insert an HTML string into the DOM at a specific place
  • 27. http://jsperf.com/insertadjacenthtml-perf/4 In many cases, faster than innerHTML! insertAdjacentHTML() HTML5 Insert an HTML string into the DOM at a specific place
  • 28. element.outerHTML = html; Any valid HTML string outerHTML HTML5 Get/set HTML for an entire element
  • 29. <nav> <h2>Site Menu</h2> <ul id="menu"> <li><a href="/">Home</a></li> <li><a href="/about">About</a></li> </ul> </nav> var menu = document.getElementById("menu"); var html = menu.outerHTML; outerHTML HTML5 Get/set HTML for an entire element
  • 30. <nav> <h2>Site Menu</h2> <p>Hello world!</p> </nav> var menu = document.getElementById("menu"); Detached menu.outerHTML = "<p>Hello world!</p>"; reference to <ul> console.log(menu.tagName); // “UL” console.log(menu.parentNode); // null outerHTML HTML5 Get/set HTML for an entire element
  • 31. 9 document.implementation.createHTMLDocument(title); Title of the document createHTMLDocument() DOM Level 2 Create an invisible document
  • 32. 9 var doc = document.implementation.createHTMLDocument(“Test”); console.log(doc.title); // “Test” doc.body.innerHTML = “<p>Hello world!</p>”; var p = document.querySelector(“p”); console.log(p.textContent); // “Hello world!” createHTMLDocument() DOM Level 2 Create an invisible document
  • 33. 9 function isSafeHTML(html) { var doc = document.implementation.createHTMLDocument(“Test”); doc.body.innerHTML = html; return !doc.querySelector(“script,style,link,object”); } createHTMLDocument() DOM Level 2 Create an invisible document
  • 34. 9 function sanitizeHTML(html) { var doc = document.implementation.createHTMLDocument(“Test”); doc.body.innerHTML = html; var nodes = doc.querySelectorAll(“script,style,link,object”); for (var i=0, len=nodes.length; i < len; i++) { nodes[i].parentNode.removeChild(nodes[i]); } return doc.body.innerHTML; } createHTMLDocument() DOM Level 2 Create an invisible document
  • 35. 9 <input value="data" id="data-field"> var textbox = document.getElementById("data-field"); textbox.focus(); textbox.select(); textbox.setSelectionRange(1, 3); setSelectionRange() HTML5 Select specific parts of textbox content
  • 36. 9 // put caret at start textbox.setSelectionRange(0, 0); // put caret at end textbox.setSelectionRange( textbox.value.length, textbox.value.length); setSelectionRange() HTML5 Select specific parts of textbox content
  • 37. 9 <input value="data" id="data-field"> var textbox = document.getElementById("data-field"); textbox.focus(); textbox.setSelectionRange(1, 3); console.log(textbox.selectionStart); // 1 console.log(textbox.selectionEnd); // 3 selectionStart/selectionEnd HTML5 Set/get the start and ending range of selection
  • 38. <input value="data" id="data-field"> var textbox = document.getElementById("data-field"); textbox.focus(); var focused = document.activeElement; console.log(focused === textbox); // true activeElement HTML5 Returns the element that currently has focus
  • 40. 3 10 var data = new FormData(); data.append(“name”, “Nicholas”); data.append(“age”, 25); data.append(“note”, “Yeah right!”); var xhr = new XMLHttpRequest(); xhr.open(“post”, “/submit”, true); //setup event handlers xhr.send(data); FormData XMLHttpRequest Level 2 Used to submit <form> data via XMLHttpRequest
  • 41. 3 10 var data = new FormData(document.forms[0]); var xhr = new XMLHttpRequest(); xhr.open(“post”, “/submit”, true); //setup event handlers xhr.send(data); FormData XMLHttpRequest Level 2 Used to submit <form> data via XMLHttpRequest
  • 42. 3 10 <input type="file" id="photo" name="photo"> var data = new FormData(), fileControl = document.getElementById("photo"); data.append(“name”, “Nicholas”); data.append(“photo”, fileControl.files[0]); var xhr = new XMLHttpRequest(); xhr.open(“post”, “/submit”, true); //setup event handlers xhr.send(data); FormData XMLHttpRequest Level 2 Used to submit <form> data via XMLHttpRequest
  • 43. 3 10 var xhr = new XMLHttpRequest(); xhr.open(“post”, “/submit”, true); xhr.upload.onprogress = function(event) { var percentage = event.loaded/event.total * 100; updateProgress(percentage); }; xhr.send(data); Upload Progress XMLHttpRequest Level 2 Monitor the time to upload
  • 44. 3 9 var xhr = new XMLHttpRequest(); xhr.open(“get”, “/data”, true); xhr.timeout = 5000; xhr.ontimeout = function() { console.log(“Request timed out.”); }; // other event handlers xhr.send(data); XHR Timeouts XMLHttpRequest Level 2 Used to stop a request after a period of time
  • 45. var xhr = new XMLHttpRequest(); xhr.open(“get”, “/data”, true); xhr.onload = function() { var text = xhr.responseText; doSomethingWith(text); }; // other event handlers xhr.send(); XHR Response Types XMLHttpRequest Level 2 Retrieve a particular type of object – not just text!
  • 46. var xhr = new XMLHttpRequest(); xhr.open(“get”, “/data”, true); xhr.onload = function() { var xmldoc = xhr.responseXML; doSomethingWith(xmldoc); }; // other event handlers xhr.send(); XHR Response Types XMLHttpRequest Level 2 Retrieve a particular type of object – not just text!
  • 47. 3 10 var xhr = new XMLHttpRequest(); xhr.open(“get”, “/data”, true); xhr.responseType = "text"; xhr.onload = function() { var text = xhr.response; doSomethingWith(text); }; // other event handlers xhr.send(); XHR Response Types XMLHttpRequest Level 2 Retrieve a particular type of object – not just text!
  • 48. 3 10 var xhr = new XMLHttpRequest(); xhr.open(“get”, “/data”, true); xhr.responseType = "document"; xhr.onload = function() { var xmldoc = xhr.response; doSomethingWith(xmldoc); }; // other event handlers xhr.send(); XHR Response Types XMLHttpRequest Level 2 Retrieve a particular type of object – not just text!
  • 49. 3 10 var xhr = new XMLHttpRequest(); xhr.open(“get”, “/data”, true); xhr.responseType = "blob"; xhr.onload = function() { Great for var blob = xhr.response; downloading doSomethingWith(blob); images! }; // other event handlers xhr.send(); XHR Response Types XMLHttpRequest Level 2 Retrieve a particular type of object – not just text!
  • 50. 3 10 var xhr = new XMLHttpRequest(); xhr.open(“get”, “/data”, true); Great for downloading xhr.responseType = "arraybuffer"; binary data! xhr.onload = function() { var binData = new Uint16Array(xhr.response); doSomethingWith(binData); }; // other event handlers xhr.send(); XHR Response Types XMLHttpRequest Level 2 Retrieve a particular type of object – not just text!
  • 51. var xhr = new XMLHttpRequest(); xhr.open(“get”, “/data”, true); xhr.responseType = "json"; xhr.onload = function() { var json = xhr.response; doSomethingWith(json); }; // other event handlers xhr.send(); XHR Response Types XMLHttpRequest Level 2 Retrieve a particular type of object – not just text!
  • 53. 3 9 var element = document.getElementById(“foo”); if (element.matchesSelector(“#foo”)) { //do something } if (element.matchesSelector(“body .bar”)) { //do something } matchesSelector() Selector API Level 2 Determines if the element matches a certain CSS selector
  • 54. element.mozMatchesSelector() element.webkitMatchesSelector() element.msMatchesSelector() element.oMatchesSelector() matchesSelector() Selector API Level 2 Determines if the element matches a certain CSS selector
  • 55.
  • 56. var element = document.getElementById(“foo”); if (element.matches(“#foo”)) { //do something } if (element.matches(“.bar”, element.parentNode)) { //do something } matches () Selector API Level 2 Determines if the element matches a certain CSS selector
  • 57. Hello! getBoundingClientRect() CSS Object Model Views Determines size and location of an element in the viewport
  • 58. var rect = element.getBoundingClientRect(); // all measurements in pixels relative to viewport console.log(rect.left); console.log(rect.top); console.log(rect.right); // relative to left console.log(rect.bottom); // relative to top console.log(rect.width); console.log(rect.height); getBoundingClientRect() CSS Object Model Views Determines size and location of an element in the viewport
  • 59. var rect = element.getBoundingClientRect(); // all measurements in pixels relative 8 adds 2 to each IE < to viewport console.log(rect.left); coordinate – you must console.log(rect.top); subtract it console.log(rect.right); // relative to left console.log(rect.bottom); // relative to top console.log(rect.width); console.log(rect.height); getBoundingClientRect() BUG! CSS Object Model Views Determines size and location of an element in the viewport
  • 60. Think clientX and clientY var element = document.elementFromPoint(x, y); Element at that point with highest z-index elementFromPoint() CSS Object Model Views Return the element at a position relative to viewport
  • 61. Think clientX and clientY var element = document.elementFromPoint(x, y); Element at that point with highest z-index elementFromPoint() CSS Object Model Views Return the element at a position relative to viewport
  • 62. 10 var mql = window.matchMedia(“(max-width:600px)”); if (mql.matches) { //do something } mql.addListener(function(mql) { console.log(mql.media + “ “ + (mql.matches ? “matches” : “doesn’t match”); }); matchMedia() CSS Object Model Views Allows JavaScript to interact with CSS media queries
  • 64. What We Talked About • Element Traversal API • element.children • element.contains() • element.insertAdjacentHTML() • element.outerHTML • document.activeElement • document.implementation.createHTMLDocument() • element.setSelectionRange() • element.selectionStart • element.selectionEnd
  • 65. What We Talked About • FormData • Upload Progress • XHR Timeouts • XHR Response Types • element.matchesSelector() • element.getBoundingClientRect() • document.elementFromPoint() • window.matchMedia()
  • 67. Etcetera My blog: nczonline.net Twitter: @slicknet These Slides: slideshare.net/nzakas