Interacting with web pages
Transcription
Interacting with web pages
Javascript Interacting with web pages by Aaron Wheeler (awheeler@yahoo-inc.com) Design Prototyper, Yahoo! Inc. Schedule of How To: • Building Blocks: elements & objects • DOM • JSON • Manipulate elements • CSS • HTML • Events • Talk to web services • AJAX JSONP • Homework Document Object Model Document Object Model Humans see web pages as they are displayed on the screen, but browsers see web pages as a structured group of nested page elements (links, paragraphs, divs, etc.). This structured grouping of page elements is called the Document Object Model (DOM). Document Object Model Traverse elements on the page • JS selectors document.getElementById document.getElementsByClassName document.getElementsByTagName • CSS selectors id tag class name <div class=”content”> <h1 id=”headerTitle”> JS History</h1> <p>Javascript has a long and illustrious history.</p> <p>Here’s a taste!</p> </div> In order to change parts of the visible page, we must programatically be able to change parts of the DOM. Javascript and CSS both have support for traversing and referencing parts of the DOM. Document Object Model document.getElementById(‘headerTitle’) Traverse elements on the page • JS selectors document.getElementById document.getElementsByClassName document.getElementsByTagName • CSS selectors id tag class name <div class=”content”> <h1 id=”headerTitle”> JS History</h1> <p>Javascript has a long and illustrious history.</p> <p>Here’s a taste!</p> </div> Document Object Model #headerTitle { color:Yellow; } Traverse elements on the page • JS selectors document.getElementById document.getElementsByClassName document.getElementsByTagName • CSS selectors id tag class name <div class=”content”> <h1 id=”headerTitle”> JS History</h1> <p>Javascript has a long and illustrious history.</p> <p>Here’s a taste!</p> </div> Document Object Model document.getElementsByClassName(‘content’) Traverse elements on the page • JS selectors document.getElementById document.getElementsByClassName document.getElementsByTagName • CSS selectors id tag class name <div class=”content”> <h1 id=”headerTitle”> JS History</h1> <p>Javascript has a long and illustrious history.</p> <p>Here’s a taste!</p> </div> Document Object Model .content { background:Black; } Traverse elements on the page • JS selectors document.getElementById document.getElementsByClassName document.getElementsByTagName • CSS selectors id tag class name <div class=”content”> <h1 id=”headerTitle”> JS History</h1> <p>Javascript has a long and illustrious history.</p> <p>Here’s a taste!</p> </div> Document Object Model document.getElementsByTagName(‘p’) Traverse elements on the page • JS selectors document.getElementById document.getElementsByClassName document.getElementsByTagName • CSS selectors id tag class name <div class=”content”> <h1 id=”headerTitle”> JS History</h1> <p>Javascript has a long and illustrious history.</p> <p>Here’s a taste!</p> </div> Document Object Model p { padding: 0; } Traverse elements on the page • JS selectors document.getElementById document.getElementsByClassName document.getElementsByTagName • CSS selectors id tag class name <div class=”content”> <h1 id=”headerTitle”> JS History</h1> <p>Javascript has a long and illustrious history.</p> <p>Here’s a taste!</p> </div> JSON: JS Object Notation var cornucopia = { corn : [ cob1, cob2, cob3 ], squash : { pumpkin : [...], ‘summer squash’: [...], trumpet : [...], }, } leaves : [ redLeaf1, orangeLeaf2, yellowLeafN] JSON: JS Object Notation var cornucopia = { corn : [ cob1, cob2, cob3 ], squash : { pumpkin : [...], ‘summer squash’: [...], trumpet : [...], }, } leaves : [ redLeaf1, orangeLeaf2, yellowLeafN] Humans visualize objects as groups or clusters of things. Programatically, Javascript denotes objects using JSON. A Javascript object is basically a group of key-value pairs separated by a colon. A key can be a string or a literal, and the value can be any valid Javascript (variable reference, string, integer, boolean, null, function, etc.) JSON: JS Object Notation •Key-Value Pairs •Keys are strings or plain text •Values are JS var cornucopia = { corn : [ cob1, cob2, cob3 ], squash : { pumpkin : [...], ‘summer squash’: [...], trumpet : [...], }, } leaves : [ redLeaf1, orangeLeaf2, yellowLeafN] Humans visualize objects as groups or clusters of things. Programatically, Javascript denotes objects using JSON. A Javascript object is basically a group of key-value pairs separated by a colon. A key can be a string or a literal, and the value can be any valid Javascript (variable reference, string, integer, boolean, null, function, etc.) JSON: JS Object Notation var myObject = { ‘key1‘: ‘value1’, ‘sum’ : 1+1, ‘fn‘ : function(){return ‘x’}, array: [‘a’,’b’,’c’] }; JSON: JS Object Notation // reference keys with dot-notation myObject.key1 // => ‘value1’ var myObject = { ‘key1‘: ‘value1’, ‘sum’ : 1+1, ‘fn‘ : function(){return ‘x’}, array: [‘a’,’b’,’c’] }; JSON: JS Object Notation // or reference keys with array-notation myObject[‘key1’] // => ‘value1’ var myObject = { ‘key1‘: ‘value1’, ‘sum’ : 1+1, ‘fn‘ : function(){return ‘x’}, array: [‘a’,’b’,’c’] }; JSON: JS Object Notation // values are evaluated myObject[‘sum’] // => 2 var myObject = { ‘key1‘: ‘value1’, ‘sum’ : 1+1, ‘fn‘ : function(){return ‘x’}, array: [‘a’,’b’,’c’] }; JSON: JS Object Notation // Functions can conveniently be stored myObject[‘fn’]() // => ‘x’ var myObject = { ‘key1‘: ‘value1’, ‘sum’ : 1+1, ‘fn‘ : function(){return ‘x’}, array: [‘a’,’b’,’c’] }; JSON: JS Object Notation // keys need not be strings myObject.array[0] // => ‘a’ var myObject = { ‘key1‘: ‘value1’, ‘sum’ : 1+1, ‘fn‘ : function(){return ‘x’}, array: [‘a’,’b’,’c’] }; JSON: JS Object Notation // but keys can be referenced as strings myObject[‘array’][1] // => ‘b’ var myObject = { ‘key1‘: ‘value1’, ‘sum’ : 1+1, ‘fn‘ : function(){return ‘x’}, array: [‘a’,’b’,’c’] }; Manipulation Manipulation In order to manipulate the visible page, we have to change the DOM. Two common ways to do this are to change CSS classes and HTML in the DOM with Javascript. In order to execute the Javascript, we leverage user events. Manipulation • CSS - toggle CSS class names - add class name - remove class name • HTML - innerHTML - change HTML - append HTML <div class=”content”> <h1 id=”headerTitle”> JS History</h1> <p>Javascript has a long and illustrious history.</p> <p>Here’s a taste!</p> </div> <script> var h = document. getElementById( ‘js_title’); </script> Manipulation: CSS h.className = ‘highlight’ • CSS - toggle CSS class names - add class name - remove class name • HTML - innerHTML - change HTML - append HTML <div class=”content”> <h1 id=”headerTitle” class=”highlight”> JS History</h1> <p>Javascript has...</p> </div> <script> var h = document. getElementById( ‘headerTitle’); </script> Manipulation: CSS h.className = h.className. replace(/(^| )content( |$)/,’ ’) • CSS - toggle CSS class names - add class name - remove class name • HTML - innerHTML - change HTML - append HTML <div class=””> <h1 id=”headerTitle”> JS History</h1> <p>Javascript has...</p> </div> <script> var h = document. getElementById( ‘headerTitle’); </script> Manipulation: HTML h.innerHTML = ‘Javascript’ • CSS - toggle CSS class names - add class name - remove class name • HTML - innerHTML - change HTML - append HTML <div class=”content”> <h1 id=”headerTitle”> Javascript</h1> <p>Javascript has...</p> </div> <script> var h = document. getElementById( ‘headerTitle’); </script> Manipulation: HTML h.innerHTML += ‘ <em>over the ages</em>’ • CSS - toggle CSS class names - add class name - remove class name • HTML - innerHTML - change HTML - append HTML <div class=”content”> <h1 id=”headerTitle”> JS History <em>over the ages</em> </h1> <p>Javascript has...</p> </div> <script> var h = document. getElementById( ‘headerTitle’); </script> Manipulation: Events • CSS - :hover • HTML + Javascript - onHover - onMouseOver / onMouseOut - onMouseClick - onFocus / onBlur - onLoad <div class=”content”> <h1 id=”headerTitle”> JS History</h1> <p>Javascript has...</p> </div> Manipulation: Events • CSS - :hover • HTML + Javascript - onHover - onMouseOver / onMouseOut - onMouseClick - onFocus / onBlur - onLoad <style> h1 { color:white; } h1:hover { color:pink; } </style> <div class=”content”> <h1 id=”headerTitle”> JS History</h1> <p>Javascript has...</p> </div> Manipulation: Events • CSS - :hover • HTML + Javascript - onHover - onMouseOver / onMouseOut - onClick - onFocus / onBlur - onLoad <script> function add(elt) { elt.innerHTML = parseInt(elt.innerHTML)+1; } </script> <div class=”content”> <h1 id=”headerTitle”> JS History</h1> <p onClick=”add(this);”> 0</p> </div> Manipulation: Events • CSS - :hover • HTML + Javascript - onHover - onMouseOver / onMouseOut - onClick - onFocus / onBlur - onLoad <script> function add(elt) { elt.innerHTML = parseInt(elt.innerHTML)+1; } </script> <div class=”content”> <h1 id=”headerTitle”> JS History</h1> <p onClick=”add(this);”> 1</p> </div> Manipulation: Events • CSS - :hover • HTML + Javascript - onHover - onMouseOver / onMouseOut - onClick - onFocus / onBlur - onLoad <script> function add(elt) { elt.innerHTML = parseInt(elt.innerHTML)+1; } </script> <div class=”content”> <h1 id=”headerTitle”> JS History</h1> <p onClick=”add(this);”> 2</p> </div> Talking to the Web Web App Internet AJAX Web 2.0 introduced asynchronous ways of talking to the web via AJAX. This spurred a revolution in web apps, but had some shortcomings. Talking to the Web JSON P YQL (think babelfish) As web apps matured, so did the means for talking to the web. JSONP is a cross-domain method for talking to supporting web APIs, and YQL is a way for talking to these APIs. Talking to the Web • AJAX - Asynchronous Javascript XML - Limited to same-domain communication • JSONP - JSON with Padding - work-around for cross-site JS loading • YQL - Yahoo! Query Language - Standardize way to talk to web APIs Asynchronous behavior Two or more things happen concurrently (aka threading) • Callback functions Provide direction on what to do once an asynchronous call (thread) completes. • Talking to the Web • AJAX - Asynchronous Javascript XML - Limited to same-domain communication • JSONP - JSON with Padding - work-around for cross-site JS loading • YQL - Yahoo! Query Language - Standardize way to talk to web APIs Leverages Javascript function “XMLHTTPRequest” Cannot load data from third-party domains Talking to the Web • AJAX - Asynchronous Javascript XML - Limited to same-domain communication • JSONP - JSON with Padding - work-around for cross-site JS loading • YQL - Yahoo! Query Language - Standardize way to talk to web APIs Calls third-party domains by injecting a <script> tag into the document. Response is wrapped in a function call. <!-- responds with cb({flickrPics:[]}) --> <script src=”http:// flickr.com/ popular.json?cbfunc=cb”> </script> <script> function cb(dat) {...} Talking to the Web • AJAX var query = “select * from search.web where query =‘dogs’”; • JSONP function callback(data) { alert(‘got data!’); console.log(data); } - Asynchronous Javascript XML - Limited to same-domain communication - JSON with Padding - work-around for cross-site JS loading • YQL - Yahoo! Query Language - Standardize way to talk to web APIs // YQL is a custom class // in Homework #3 YQL.query(query, ‘callback’); Homework • Create clickable tabs • http://jsfiddle.net/4R6k3/ • Track history of tab clicks • http://jsfiddle.net/AjKnM/ • Tabbed access to faceted web search • http://jsfiddle.net/GmMCc/ Solutions for all homework can be found by appending ‘1’ to the URL. For example, the solution to the first homework can be found at http://jsfiddle.net/4R6k3/1