Upgrade to Pro — share decks privately, control downloads, hide ads and more …

DOM

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on. →

 DOM

Techtalk sobre DOM

Avatar for Rodrigo Navarro

Rodrigo Navarro

December 14, 2012

More Decks by Rodrigo Navarro

Other Decks in Programming

Transcript

  1. Por que vc usa jQuery? • Porque é mais fácil?

    • Porque é crossbrowser • Porque manipular DOM é um saco™ • Porque eu gosto do ajax dele (...)
  2. O que exatamente é mais fácil? // retorna...? $(".item") //

    retorna...? $("#primeiro") // retorna? Um array? Um o que? Com o que? $("p").after("<p>Outro paragrafo</p>")
  3. O que exatamente é mais fácil? <div> <p class="item">1</p> <p

    class="item">2</p> </div> <div id="second_part"> <p class="item">3</p> </div> $("div p.item:first");
  4. O que exatamente é mais fácil? <div> <p class="item">1</p> <p

    class="item">2</p> </div> <div id="second_part"> <p class="item">3</p> </div> $("div p.item:first"); $("div p.item:first-child");
  5. O que exatamente é mais fácil? <div> <p class="item">1</p> <p

    class="item">2</p> </div> <div id="second_part"> <p class="item">3</p> </div> $("div p.item:first"); $("div p.item:first-child"); $("div p")[1];
  6. DOM Having an idea what you are doing <ul id="navbar">

    <li>Home</li> <li>Sign in</li> <li>Sign up</li> </ul> UL Li Li Li
  7. DOM Having an idea what you are doing <ul id="navbar">

    <li>Home</li> <li>Sign in</li> <li>Sign up</li> </ul> UL Li Li Li
  8. Selectors <div> <p class="item">Primeiro parágrafo </p> <p class="item">Segundo parágrafo </p>

    </div> <div id="second_part"> <p class="item">Terceiro parágrafo </p> </div>
  9. Selectors - Os famosos <div> <p class="item">Primeiro parágrafo </p> <p

    class="item">Segundo parágrafo </p> </div> <div id="second_part"> <p class="item">Terceiro parágrafo </p> </div> // Singular: Retorna UM node document.getElementById("second_part")
  10. Selectors - Os famosos <div> <p class="item">Primeiro parágrafo</p> <p class="item">Segundo

    parágrafo</p> </div> <div id="second_part"> <p class="item">Terceiro parágrafo</p> </div> // Plural: retorna um NodeList document.getElementsByTagName("p")
  11. Selectors - Os famosos <div> <p class="item">Primeiro parágrafo</p> <p class="item">Segundo

    parágrafo</p> </div> <div id="second_part"> <p class="item">Terceiro parágrafo</p> </div> // Plural: retorna um Nodelist document.getElementsByClassName("item")
  12. Selectors - O "jQuery" <div> <p class="item">Primeiro parágrafo</p> <p class="item">Segundo

    parágrafo </p> </div> <div id="second_part"> <p class="item">Terceiro parágrafo </p> </div> // retorna UM node document.querySelector("p")
  13. Selectors - O "jQuery" <div> <p class="item">Primeiro parágrafo</p> <p class="item">Segundo

    parágrafo</p> </div> <div id="second_part"> <p class="item">Terceiro parágrafo</p> </div> // retorna UM node document.querySelectorAll("p")
  14. Selectors - O "jQuery" <div> <p class="item">Primeiro parágrafo </p> <p

    class="item">Segundo parágrafo </p> </div> <div id="second_part"> <p class="item">Terceiro parágrafo</p> </div> document.querySelectorAll("#second_part p.item")
  15. DOM - Navegando <ul id="navbar"> <li>Home</li> <li>Sign in</li> <li>Sign up</li>

    </ul> var navbar = document.getElementById("navbar"); navbar.childNodes.length; // 8 navbar.children.length; // 3
  16. DOM - Navegando <ul id="navbar"> <!-- With love: IE team

    --> <li>Home</li> <li>Sign in</li> <li>Sign up</li> </ul> var navbar = document.getElementById("navbar"); navbar.childNodes.length; // 9 navbar.children.length; // 4 IE trata comentários como um Node
  17. DOM - Navegando <ul id="navbar"> <li>Home</li> <li>Sign in</li> <li>Sign up</li>

    </ul> UL #text Li #text Li #text Li #text firstChild lastChild
  18. DOM - Navegando <ul id="navbar"> <li>Home</li> <li>Sign in</li> <li>Sign up</li>

    </ul> UL #text Li #text Li #text Li #text firstElementChild lastElementChild
  19. DOM - Contains var ul = document.querySelector("ul"); var li =

    document.querySelector("ul li:first-child"); ul.contains(li); // true li.contains(ul); // false // Ótimo para fazer delegação de eventos ul.addEventListener("click", function() { if(event.target.contains(li)) { // ... } });
  20. DOM - Manipulando <nav> <ul id="navbar"> <li>Home</li> <li>Sign in</li> <li>Sign

    up</li> </ul> </nav> var menu = document.getElementById ("navbar");
  21. DOM - Manipulando <nav> <h1>Site title</h1> <ul id="navbar"> <li>Home</li> <li>Sign

    in</li> <li>Sign up</li> </ul> </nav> var menu = document.getElementById ("navbar"); menu.insertAdjacentHTML("beforeBegin", "<h1>Site Tiltle</h1>" );
  22. DOM - Manipulando <nav> <ul id="navbar"> <li>Hello</li> <li>Home</li> <li>Sign in</li>

    <li>Sign up</li> </ul> </nav> var menu = document.getElementById ("navbar"); menu.insertAdjacentHTML("afterBegin", "<li>Hello</li>" )
  23. DOM - Manipulando <nav> <ul id="navbar"> <li>Home</li> <li>Sign in</li> <li>Sign

    up</li> <li>Bye</li> </ul> </nav> var menu = document.getElementById ("navbar"); menu.insertAdjacentHTML("beforeEnd", "<li>Bye</li>" )
  24. DOM - Manipulando <nav> <ul id="navbar"> <li>Home</li> <li>Sign in</li> <li>Sign

    up</li> </ul> <h2>Wow</h2> </nav> var menu = document.getElementById ("navbar"); menu.insertAdjacentHTML("afterEnd", "<h2>Wow</h2>" )
  25. DOM - Manipulando <nav> <ul id="navbar"> <li>Exit</li> </ul> </nav> var

    menu = document.getElementById ("navbar"); menu.innerHTML = "<li>Exit</li>"
  26. DOM - Eventos var button = document.getElementById("button"); button.addEventListener("click", function() {

    // ... }, true); // Capture model button.addEventListener("click", function() { // ... }, false); // Bubbling model (default)
  27. DOM - Eventos var button = document.getElementById("button"); button.attachEvent("onclick", function() {

    // obs: `this` aqui NÃO é o button, e sim window... }); IE9+ já não é mais assim =]
  28. DOM - Parando Eventos <nav> <ul id="navbar"> <li><a href="/">Home</a></li> <li><a

    href="/sign_in">Sign in</a></li> <li><a href="/sign_up">Sign up</a></li> </ul> </nav> var list = $("#navbar"); var item = list.find("li:nth-child(2) a" ); $(list).on("click", function() { alert("List clicked!" ); }); $(item).on("click", function() { alert("Item clicked!" ); return false; });
  29. DOM - Eventos como parar? <nav> <ul id="navbar"> <li><a href="/">Home</a></li>

    <li><a href="/sign_in">Sign in</a></li> <li><a href="/sign_up">Sign up</a></li> </ul> </nav> var list = document.getElementById ("navbar"); var item = list.querySelector( "li:nth-child(2) a" ); list.addEventListener( "click", function() { alert("List clicked!" ); }); item.addEventListener( "click", function() { alert("Item clicked!" ); return false; });
  30. DOM - Eventos como parar? <nav> <ul id="navbar"> <li><a href="/">Home</a></li>

    <li><a href="/sign_in">Sign in</a></li> <li><a href="/sign_up">Sign up</a></li> </ul> </nav> var list = document.getElementById ("navbar"); var item = list.querySelector( "li:nth-child(2) a" ); list.addEventListener( "click", function() { alert("List clicked!" ); }); item.addEventListener( "click", function(event) { alert("Item clicked!" ); event.preventDefault(); });
  31. DOM - Eventos como parar? <nav> <ul id="navbar"> <li><a href="/">Home</a></li>

    <li><a href="/sign_in">Sign in</a></li> <li><a href="/sign_up">Sign up</a></li> </ul> </nav> var list = document.getElementById ("navbar"); var item = list.querySelector( "li:nth-child(2) a" ); list.addEventListener( "click", function() { alert("List clicked!" ); }); item.addEventListener( "click", function(event) { alert("Item clicked!" ); event.preventDefault(); event.stopPropagation(); });
  32. DOM - Eventos var button = document.getElementById("button"); button.attachEvent("onclick", function(event) {

    event.cancelBubble = true; if (event.stopPropagation) event.stopPropagation(); }); IE9+ já não é mais assim =]
  33. DOM - AJAX Simples requisição GET request = new XMLHttpRequest

    (); request.onreadystatechange (function(){ switch(request.readyState) { // case 0: // Uninitialized // case 1: // Loading // case 2: // Loaded // case 3: // Interactive case 4: // Complete if (request.status == 200) { alert("Success"); } else { alert("Error"); } break; } }); // Opens the connection with the server, the third // parameters informs whether the request is asynchronous. // This is the "A" of AJAX request.open("GET", "/users/search?name=Navarro" , true); // As it is a GET request, you aren't // sending anything on the request body request.send(null);
  34. DOM - AJAX Simples requisição GET request = new XMLHttpRequest();

    request.onreadystatechange (function(){ switch(request.readyState) { // case 0: // Uninitialized // case 1: // Loading // case 2: // Loaded // case 3: // Interactive case 4: // Complete if (request.status == 200) { alert("Success"); } else { alert("Error"); } break; } }); // Opens the connection with the server, the third // parameters informs whether the request is asynchronous. // This is the "A" of AJAX request.open("GET", "/users/search?name=Navarro" , true); // As it is a GET request, you aren't // sending anything on the request body request.send(null);
  35. DOM - AJAX Simples requisição GET var request; if (window.XMLHttpRequest)

    { request = new XMLHttpRequest(); } else { request = new ActiveXObject("Microsoft.XMLHTTP"); } IE9+ já não é mais necessário.
  36. DOM - AJAX Simples requisição GET request = new XMLHttpRequest

    (); request.onreadystatechange(function(){ switch(request.readyState) { // case 0: // Uninitialized // case 1: // Loading // case 2: // Loaded // case 3: // Interactive case 4: // Complete if (request.status == 200) { alert("Success"); } else { alert("Error"); } break; } }); // Opens the connection with the server, the third // parameters informs whether the request is asynchronous. // This is the "A" of AJAX request.open("GET", "/users/search?name=Navarro" , true); // As it is a GET request, you aren't // sending anything on the request body request.send(null);
  37. DOM - AJAX Simples requisição GET request = new XMLHttpRequest

    (); request.onreadystatechange (function(){ switch(request.readyState) { // case 0: // Uninitialized // case 1: // Loading // case 2: // Loaded // case 3: // Interactive case 4: // Complete if (request.status == 200) { alert("Success"); } else { alert("Error"); } break; } }); // Opens the connection with the server, the third // parameters informs whether the request is asynchronous. // This is the "A" of AJAX request.open("GET", "/users/search?name=Navarro", true); // As it is a GET request, you aren't // sending anything on the request body request.send(null);
  38. DOM - AJAX Simples requisição GET request = new XMLHttpRequest

    (); request.onreadystatechange (function(){ switch(request.readyState) { // case 0: // Uninitialized // case 1: // Loading // case 2: // Loaded // case 3: // Interactive case 4: // Complete if (request.status == 200) { alert("Success"); } else { alert("Error"); } break; } }); // Opens the connection with the server, the third // parameters informs whether the request is asynchronous. // This is the "A" of AJAX request.open("GET", "/users/search?name=Navarro" , true); // As it is a GET request, you aren't // sending anything on the request body request.send(null);
  39. DOM - AJAX Simples requisição POST request.open("POST", "/users"); var formData

    = new FormData formData.append("first_name", "Rodrigo"); formData.append("last_name", "Navarro"); request.send(formData); IE9+
  40. DOM - AJAX Simples requisição POST request.open("POST", "/users"); var form

    = document.getElementById("user_form"); var formData = new FormData(form); request.send(formData); IE9+
  41. DOM - AJAX Tratando a resposta var request = new

    XMLHttpRequest(); request.onload = function() { var text = request.responseText; } request.open("GET", "/users"); request.send();
  42. DOM - AJAX Tratando a resposta var request = new

    XMLHttpRequest(); request.onload = function() { var xmlDoc = request.responseXML; } request.open("GET", "/users"); request.send();
  43. DOM - AJAX Tratando a resposta var request = new

    XMLHttpRequest(); request.responseType = "text"; request.onload = function() { var text = request.response; } request.open("GET", "/users"); request.send(); IE10+
  44. DOM - AJAX Tratando a resposta var request = new

    XMLHttpRequest(); request.responseType = "document"; request.onload = function() { var xmlDoc = request.response; } request.open("GET", "/users"); request.send(); IE10+
  45. DOM - AJAX Tratando a resposta var request = new

    XMLHttpRequest(); request.responseType = "blob"; request.onload = function() { var blob = request.response; } request.open("GET", "/users"); request.send(); IE10+
  46. DOM - AJAX Tratando a resposta var request = new

    XMLHttpRequest(); request.responseType = "arraybuffer"; request.onload = function() { var binData = new Uint16Array(request.response); } request.open("GET", "/users"); request.send(); IE10+
  47. DOM - AJAX Tratando a resposta var request = new

    XMLHttpRequest(); request.responseType = "json"; request.onload = function() { var json = request.response; } request.open("GET", "/users"); request.send(); Futuro
  48. DOM - AJAX Timeouts var request = new XMLHttpRequest(); request.timeout

    = 500; request.ontimeout = function() { alert("Fuuuuu!"); } request.open("GET", "/users"); request.send(); IE10+
  49. DOM - Revisando Selectors • document.querySelector() • document.querySelectorAll() Navegação •

    element.childNodes • element.children • element.firstChild • element.firstElementChild • element.siblings • element.nextSibling • element.nextElementSibling • element.previousSibling • element.previousElementSibling Manipulação • document.insertAdjacentHTML() • document.innerHTML • document.outerHTML Eventos • element.addEventListener() • event.preventDefault() • event.stopPropagation()