SlideShare a Scribd company logo
Bill W. Scott, Y! Ajax Evangelist
bscott@yahoo-inc.com
Ajax 101
Where we get down and dirty with Ajax operations, JavaScript
events and the DOM
The World of Ajax
Anatomy of a Pattern
• Ajax design patterns contain three steps
• Trigger (event or timer)
• Operation (Ajax, remote scripting)
• Update (presentation)
2
Trigger Operation Update
The World of Ajax
Operation.Using XHR
3
The World of Ajax
Operation. Using XHR
• The five operations are not built into XHR
• The simple send/response mechanism can be used
to implement lookup, persist, validate, invoke and
message
• To create these operations, one must understand
how to use XHR
• A simple HelloWorld example will illustrate using
XHR
4
Ajax
XHR
The World of Ajax
Simple Ajax ‘Hello World’
5
XHR
Object
request
data
<?xml version="1.0" ?>
<root>
This data was brought
to you by Ajax!
</root>
/response.xml
response
• Clicking the link makes an XHR request
• Response is inserted into the area outlined in blue
Ajax
XHR
The World of Ajax
Ajax How To
1. Create a request object
2. Write a callback
3. Make the request
4. Parse the response
6
Ajax
XHR
The World of Ajax
var xhr = null;
if (window.XMLHttpRequest) {
xhr = new XMLHttpRequest();
xhr.overrideMimeType(‘text/xml’);
} else if (window.ActiveXObject) {
xhr = new ActiveXObject(“Microsoft.XMLHTTP”);
} else {
alert(“Perhaps your browser doesn’t support Ajax.”);
}
if browser is mozilla or safari or opera then
create a new XMLHttpRequest
otherwise it is IE then
create a new ActiveXObject
otherwise
error - browser does not support XMLHttpRequest
1. Create a Request Object
• IE5+ implements XHR as an ActiveX object
• Mozilla 1.0+, Safari 1.2+, Opera 8+, IE7 provide an
XMLHttpRequest object in their API
• All XHR objects have the same methods &
properties
7
1. Create
The World of Ajax
XHR Methods
8
Method Description
open(“method”, “url”, [, asynchFlag [,
“username” [, “password”]]])
Sets up the request object for sending a
request
send(content) Sends the request to the server. Can be
null.
abort() Stops the request.
getAllResponseHeaders() Returns all response headers for the HTTP
request as key/value pairs.
getReponseHeader(“header”) Returns the string value of the specified
header.
setRequestHeader(“header”, “value”) Sets the specified header to the supplied
value.
Source: Foundations of Ajax - APress
Ajax
XHR
The World of Ajax
XHR Properties
9
Property Description
onreadystatechange The event handler that fires at every
state change.
readystate The state of the request:
0=uninitialized, 1=loading, 2=loaded,
3=interactive, 4=complete
responseText The response from the server as a text
string
responseXML The response from the server as an XML
document
status The HTTP status code from the server for
the request object:
200: Ok; 201: Created; 400: bad request,
403: Forbidden; 500: internal sever error
statusText The text version of the HTTP status code
Ajax
XHR
The World of Ajax
function handleAjaxResponse()
{
// we will handle the ajax response here...
}
function handleAjaxResponse
begin
do something with the data that is returned from XHR
end
2. Write a Callback
• JavaScript function is invoked when the readystate
changes on the XHR object
10
Ajax
XHR
The World of Ajax
xhr.onreadystatechange = handleAjaxResponse;
xhr.open(‘GET’, ‘response.xml’, true);
xhr.send(null);
set onreadystatechange to callback function - handleAjaxResponse
open a request on the xhr object
send the request through the xhr object
3. Make the Request
• The JavaScript function getResponse will be invoked
when the readystate property changes on the XHR
object
• Same site rule
• ‘GET’ or ‘POST’
• Asynchronous flag
11
Ajax
XHR
XHR
Object
request
response
X
√
X
server must be accessible via relative url
The World of Ajax
3. Make the Request - Choosing Between GET and POST
• Use GET for
• For retrieve
• REST services
• When passing parameters
• Idempotent URLs
• Small amount of data
• Use POST for
• Modification
• Large amounts of data passed to server
• Non-idempotent URLs
12
Ajax
XHR
The World of Ajax
3. Make the Request: Handling the Request on the Server Side
• Its just a normal HTTPRequest
• Normal mechanism for getting request parameters
• Raw POST (xhr.send(someData))
• Java/JSP: request.getInputStream() - read as raw post
• Rails: @request.raw_post
• PHP: $data = file_get_contents('php:/
/input')
13
The World of Ajax
function handleAjaxResponse()
{
if ((xhr.readystate == 4) && (xhr.status == 200)) {

 
 var doc = xhr.responseXML;

 
 var rootNode = doc.getElementsByTagName('root').item(0);

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

 
 helloArea.innerHTML=rootNode.firstChild.data;
}
}
function handleAjaxResponse
begin
if response is valid then

 
 get responseXML

 
 get rootNode

 
 get helloArea on the page

 
 stuff the rootNode value into the helloArea DIV
endif
end
4. Parse the Response
• readystate values
0 – Uninitialized
1 – Loading
2 – Loaded
3 – Interactive
4 – Completed
14
Ajax
XHR
The World of Ajax
4. Parse the Response: Formatting an XML Response on the Server
• XML version must be first line
<?xml version="1.0" encoding="ISO-8859-1"?>
• Set up response header’s Content-type
“Content-Type”, “text/xml”
• Use well-formed XML
15
Ajax
XHR
The World of Ajax
4. Parse the Response: Handling an XML Response on the Client
• Use XHR property responseXML to get the response
as an XML DOM (XmlDocument)
• Use standard JavaScript DOM methods
• Mozilla, Safari, Opera & IE support a common set of
methods and properties
• Watch out for IE only stuff (e.g., children property)
• Watch out for whitespace issues
• Other options
• Use XML library for JS (e.g., XML for <script>)
16
Ajax
XHR
The World of Ajax
4. Parse the Response: Xml Document API
17
Property/Method Description
documentElement Returns the root element of the document
firstChild Is the first element within another element (the first child
of the current node)
lastChild Is the last element within another element (the last child of
the current node)
nextSibling Is the next element in the same nested level as the current
one
previousSibling Is the previous element in the same nested level as the
current one
nodeValue Is the value of a document element
getElementsByTagName Used to place all elements into an object
Ajax
XHR
The World of Ajax
data
JS
data data
Response Options
18
XHR
Object
request
response
html html
text xml json
Ajax
XHR
• Different types, different formats
The World of Ajax
data
JS
data data
Response Options
19
XHR
Object
request
response
html html
text xml json
innerHTML
Ajax
XHR
• Snippets of HTML returned, stuffed into innerHTML
The World of Ajax
data
JS
data data
Response Options
20
XHR
Object
request
response
html html
text xml json
model
model
Ajax
XHR
• Data returned from the server, interface built from it
The World of Ajax
JSON
• JavaScript supports several string based notations
• Allows the basic types to be represented as string literals
• Strings are easy to pass over the wire
• JSON (JavaScript Object Notation - json.org)
21
Ajax
XHR
The World of Ajax
JSON Response: Object Literal
{"name": "Jack B. Nimble", "at large": true, "grade":
"A", "level": 3}
22
name Jack B. Nimble
at large true
grade A
level 3
Ajax
XHR
The World of Ajax
JSON Response: Array Literal
["Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday"]
array of 7 named days
[
[0, -1, 0],
[1, 0, 0],
[0, 0, 1]
]
3x3 array
23
Ajax
XHR
The World of Ajax
JSON Response: JSON is JavaScript
• JSON's simple values are the same as used in
JavaScript
• No restructuring is requested: JSON's structures are
JavaScript!
• JSON's object is the JavaScript object
• JSON's array is the JavaScript array
• Parsing is simple, native
24
Ajax
XHR
The World of Ajax
JSON Response: Parsing JSON
• Obtain responseText
• Parse the responseText
responseData = eval('(' + responseText + ')');
OR
responseData = JSON.parse(responseText);
25
Ajax
XHR
The World of Ajax
JSON Response: Y! JSON API
• http://api.search.yahoo.com/WebSearchService/V1/webSearch?
appid=YahooDemo&query=finances&start=1&results=1&output=json
{
"ResultSet":
{
"totalResultsAvailable":"69200000",
"totalResultsReturned":"1",
"firstResultPosition":"1",
"Result":
{
"Title":"Yahoo! Finance",
"Summary":"manage the market and your money with Yahoo! Finance. Includes
stock market quotes, business news, mutual funds, online bill pay, banking
tools, loans, insurance, retirement planning, and tax tips and advice.",
"Url":"http://finance.yahoo.com/",
"ClickUrl":"http://finance.yahoo.com/",
"ModificationDate":"1137225600",
"MimeType":"text/html"
}
}
}
26
Ajax
XHR
The World of Ajax
Ajax Operations
27
Ajax
XHR
• Lookup I can get information when I need it
• Persist I can save in real-time
• Validate I can prevent errors early
• Invoke I can make things happen now
• Message I can communicate instantly
33
Operation
The World of Ajax
Trigger.JavaScript Events
28
The World of Ajax
Trigger. JavaScript Events
• Ajax interactions are kicked off by event & timer
triggers
• There are issues with event management within the
browsers
• You do need to understand these implications to
write good Ajax applications
29
JavaScript
Events
The World of Ajax
First, the Events
30
onAbort onBlur
onChange onClick
onDblClick onDragDrop
onError onFocus
onKeyDown onKeyPress
onKeyUp onLoad
onMouseDown onMouseMove
onMouseOut onMouseOver
onMouseUp onMove
onReset onResize
onSelect onSubmit
onUnload
JavaScript
Events
The World of Ajax
Problem in a Nutshell
• Different event models
• Timing Issues
• Confusing madness around the this pointer
• Browser incompatibilities
• Memory leak issues
31
JavaScript
Events
The World of Ajax
Different Event Models
• Two Models (actually three!)
• Classic style
• <element onclick=func() >
• element.onclick=func;
• W3C event model
• addEventListener, removeEventListener
• IE event model
• attachEvent, detachEvent
32
JavaScript
Events
The World of Ajax
Timing Issues
• Attempting to attach events before the page is
loaded will cause problems
• Do it on the onload
33
JavaScript
Events
The World of Ajax
Confusing this Madness
• Inline registration
• Event handler with function
• Event handler with Object prototype
34
<a href=”#” onclick=”clickHandler(this)”>
function clickHandler(anchorDOMElem) {
// this == window --> window owns the function
this = anchorDOMElem; // fix the ‘this’ pointer
}
anchorDOMElem.onclick=clickHandler;
function clickHandler() {
//this == anchorDOMElem --> anchorDOMElem owns the
function
}
function AnchorLink(anchorDOMElem) {
// this == AnchorLink object
this.anchorDOMElem = anchorDOMElem; // save DOM elem
this.anchorDOMElem.onclick = this.clickHandler; // event handler
this.anchorDOMElem.anchorLinkObj = this; // store this on dom elem
}
AnchorLink.prototype.clickHandler = function() {
// this == anchorDOMElem, not AnchorLink object
// confusing since this normally refers to AnchorLink
// grab our normal this
anchorLinkObj = this.anchorLinkObj;
}
JavaScript
Events
The World of Ajax
Confusing this Madness
• Arbitrary number of event handlers
• Way to remove events
• Defines capture & bubble flow
• No way to get list of handlers
• And the browsers play differently:
35
Internet Explorer Mozilla (FF), Safari, Opera [W3C]
addEventListener(),
removeEventListener()
attachEvent(),
detachEvent
this == window object this == DOM event object
JavaScript
Events
The World of Ajax
Memory Leaks
• IE’s garbage collection does reference counting
• Attaching events and not removing them when
finished will cause memory leaks
• Can use an Observer pattern to cache event handlers
and at the end clean them up
• Most Ajax frameworks provide this capability
36
JavaScript
Events
The World of Ajax
Update.The DOM
37
The World of Ajax
Update. The DOM
• Browsers represent the user interface as a set of
objects (or elements)
• Since a page has a hierarchy of containment, each of
these elements are related as parent-child or siblings
• This takes the shape of a tree
• The tree of elements is called the document object
model or DOM
• Any change to the DOM structure or a DOM
element is reflected immediately on the web page
38
DHTML
DOM
The World of Ajax
DOM Example
39
DHTML
DOM
• Represented as a tree of nodes
The World of Ajax
Using the DOM
• JavaScript is the DOM manipulator
• Use it to
• Find DOM elements
• Add new elements
• Remove elements
• Modify element attributes
40
DHTML
DOM
The World of Ajax
Finding DOM Elements
• document.getElementById
• Prototype library shortcut: $(“idName”) or $(id)
• parentNode
• childNodes
41
DHTML
DOM
The World of Ajax
DOM Manipulation
• Creating new interface elements
• innerHTML, createElement(), createTextNode(),
appendChild()
• Changing element styles
• Visual attributes
• Geometry
42
DHTML
DOM
The World of Ajax
Example of DOM Manipulation (Hello World)
43
<h2>Ajax Hello World</h2>
<p>Clicking the link below will use XHR to fetch the data and
then show the result in the box below.</p>
<span class="ajaxlink" onclick="makeRequest('response.jsp')">
Make an ajax request for data
</span>
<div id="helloArea"></div>
var helloArea = document.getElementById("helloArea");
helloArea.innerHTML=rootNode.firstChild.data;
DHTML
DOM
The World of Ajax
Keeping it Clean
• Separate presentation style from content with CSS
• Supports degradability
• Supports accessibility
• Simplifies maintenance
• This is called good semantic markup
44
DHTML
DOM
The World of Ajax
Semantic Markup Example
45
<div id="weather">
<div id="current">
<div id="currentHeader" class="accordionTabTitleBar">
Current Conditions
</div>
<div class="weatherTabContentBox">
<div class="weatherPanel" id="ccInfo">
</div>
</div>
</div>
<div id="moon">
<div id="moonHeader" class="accordionTabTitleBar">
Moon
</div>
<div class="weatherTabContentBox">
<div class="weatherPanel" id="moonInfo">
</div>
</div>
</div>
<div id="sun">
<div id="sunHeader" class="accordionTabTitleBar">
Sunlight Summary
</div>
<div class="weatherTabContentBox">
<div class="weatherPanel" id="sunInfo">
</div>
</div>
</div>
</div> new Rico.Accordion( 'weather', {panelHeight:220, expandedBg:'#39497b'}
DHTML
DOM
Bill W. Scott, Y! Ajax Evangelist
bscott@yahoo-inc.com
Ajax & Web Services
XML and JSON Examples
The World of Ajax
Building an Ajax Weather Widget
Using an XML Service
Server
XHR
The World of Ajax
REST Service - weather.com
48
http://xoap.weather.com/weather/local/95132?
cc=*&link=xoap&prod=xoap&par=PARTNER_KEY&key=LICENSE_KEY
Server
XHR
weather.com exposes
its weather service via an
URL that includes a partner
key and license key
The World of Ajax
XML Response from weather.com
49
<?xml version="1.0" encoding="ISO
-8859-1"?>
<weather ver="2.0">
<head>
<locale>en_US</locale>
<form>MEDIUM</form>
<ut>F</ut>
<ud>mi</ud>
<us>mph</us>
<up>in</up>
<ur>in</ur>
</head>
<loc id="95132">
<dnam>San Jose, CA (95132)</
dnam>
<tm>8:37 PM</tm>
<lat>37.4</lat>
<lon>-121.86</lon>
<sunr>7:18 AM</sunr>
<suns>5:20 PM</suns>
<zone>-8</zone>
</loc>
<cc>
<lsup>1/21/06 7:53 PM PST</lsup>
<obst>San Jose, CA</obst>
<tmp>49</tmp>
<flik>46</flik>
<t>Mostly Cloudy</t>
<icon>27</icon>
<bar>
<r>30.27</r>
<d>rising</d>
</bar>
<wind>
<s>7</s>
<gust>N/A</gust>
<d>350</d>
<t>N</t>
</wind>
<hmid>80</hmid>
<vis>10.0</vis>
<uv>
<i>0</i>
<t>Low</t>
</uv>
<dewp>43</dewp>
<moon>
<icon>21</icon>
<t>Waning Gibbous</t>
</moon>
</cc>
</weather>
Server
weather.com responds
with an XML response that
describes the weather’s
current conditions
The World of Ajax
Rico/Prototype Response
50
<?xml version="1.0" encoding="ISO-8859-1"?>
<ajax-response>
<response type="element" id="ccInfo">
<div class="weatherTitle">San Jose, CA (95132)</div>
<div>
<span><image id="ccImg" src="/images/weather/27.png"></image></span>
<span class="weatherTemp">49&#176;F</span>
</div>
<div class="weatherDescr">Mostly Cloudy</div>
<div>
<table cellspacing="0" cellpadding="0" border="0">
<tr class="weatherDetail">
<td class="weatherDetailTitle">Humidity:</td>
<td>80&#37;</td></tr>
<tr class="weatherDetail">
<td class="weatherDetailTitle">Barometer:</td>
<td>30.27&quot;</td></tr>
<tr class="weatherDetail">
<td class="weatherDetailTitle">Wind:</td>
<td>From N at 7 mph</td></tr>
<tr class="weatherDetail">
<td class="weatherDetailTitle"></td>
<td>gusting to N/A mph</td></tr>
<tr class="weatherDetail">
<td class="weatherDetailTitle">Dewpoint:</td>
<td>43&#176;F</td></tr>
<tr class="weatherDetail">
<td class="weatherDetailTitle">Heat Index:</td>
<td>46&#176;F</td></tr>
</table>
</div>
</response>
</ajax-response>
Server
XHR
My server code translates
the weather.com XML into a
Rico/Prototype ajax-response.
Notice the response is an HTML
code snippet.The response is of
type element, and mapped to
id=”ccInfo”
The World of Ajax
Simple DIV Structure Defines the Accordion
51
<div id="weather">
<div id="current">
<div id="currentHeader" class="accordionTabTitleBar">
Current Conditions
</div>
<div class="weatherTabContentBox">
<div class="weatherPanel" id="ccInfo">
</div>
</div>
</div>
<div id="moon">
<div id="moonHeader" class="accordionTabTitleBar">
Moon
</div>
<div class="weatherTabContentBox">
<div class="weatherPanel" id="moonInfo">
</div>
</div>
</div>
<div id="sun">
<div id="sunHeader" class="accordionTabTitleBar">
Sunlight Summary
</div>
<div class="weatherTabContentBox">
<div class="weatherPanel" id="sunInfo">
</div>
</div>
</div>
</div>
<script>
onloads.push( accord );
function accord() {
new Rico.Accordion( 'weather',
{panelHeight:220, expandedBg:'#39497b'} );
}
</script>
The World of Ajax
The Ajax Code
function registerAjaxStuff() {
ajaxEngine.registerRequest( 'getWeatherInfo', 'ajax_weather_info' );
ajaxEngine.registerAjaxElement( 'ccInfo' );
ajaxEngine.registerAjaxElement( 'moonInfo' );
ajaxEngine.registerAjaxElement( 'sunInfo' );
ajaxEngine.registerAjaxElement( 'sponsoredLinks' );
$('zip').onkeydown = handleEnterKey.bindAsEventListener($('zip'));
}
function getWeatherInfo() {
$('checkanother').style.visibility='visible';
new Rico.Effect.Position( $('zipinput'), 200, null, 100, 10);
new Rico.Effect.FadeTo( 'frontdoor', 0, 100, 10,
{complete:function() {$('frontdoor').style.display = 'none';}}
);
ajaxEngine.sendRequest( 'getWeatherInfo', "zip=" + $('zip').value);
}
function resetWeather() {
$('zipinput').style.left = '12px';
$('checkanother').style.visibility='hidden';
$('frontdoor').style.display = ''
$('zip').focus();
new Rico.Effect.FadeTo( 'frontdoor', .99999, 100, 10, {complete:emptyContents});
}
52
The World of Ajax
JSON Trip Finder
53
Server
XHR
The World of Ajax
REST Service Request - Yahoo! Trip Planner - JSON
54
http://api.travel.yahoo.com/TripService/V1/tripSearch?
appid=PARTNER_KEY&query=alaska&output=json
Server
XHR
Yahoo! Trip Planner
exposes its service via an
URL that requires a free
partner key. Notice
output=json.
The World of Ajax
{"ResultSet":{"firstResultPosition":
1,"totalResultsAvailable":"16","totalResultsReturned":
10,"Result":[
{"id":"351102","YahooID":"jk_95661","Title":"Cruise to Alaska
from Vancouver","Summary":"Things to do: Whistler Blackcomb -
Hiking,... Hotel: Hyatt Regency Vancouver, Howard
Jho...","Destinations":"Vancouver, Anchorage, Juneau, North
Vancouver, Ketchikan,
Se...","CreateDate":"1130437928","Duration":"16","Image":
{"Url":"http://us.i1.yimg.com/us.yimg.com/i/travel/tg/
lp/cd/
100x100_cde24409e413d4d6da27953f6ab0bbde.jpg","Height":"100",
"Width":"66"},"Geocode":{"Latitude":"49.284801","Longitude":"
-123.120499","precision":"not available"},"Url":"http://
travel.yahoo.com/trip/?pid=351102&action=view"},
{"id":"400333","YahooID":"brdway_grl","Title":"Alaska","Summa
ry":"Things to do: Moose's Tooth Pub and Pizzer...
Restaurant: Orso, Simon's & Seafort's
Salo...","Destinations":"Anchorage","CreateDate":"1134676973"
,"Duration":"10","Image":{"Url":"http://us.i1.yimg.com/
us.yimg.com/i/travel/tg/poi/ca/
100x100_ca605c44b47e20a731d3093b94afa37e.jpg","Height":"75","
Width":"100"},"Geocode":{"Latitude":"61.190361","Longitude":"
-149.868484","precision":"not available"},"Url":"http://
travel.yahoo.com/trip/?pid=400333&action=view"},
...
]}}
JSON Response
55
89
Server
Y! service
responds with a JSON
text string, valid JavaScript
object notation.This is
passed directly back as
the XHR result
XHR
The World of Ajax
The Ajax/JSON Code
56
<script>
function showResponse() {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
var jsontext = xhr.responseText;
var helloArea = document.getElementById("helloArea");
var theTrip = eval( '(' + jsontext + ')' );
var tripPlanHTML = "";
for(var i=0; i<theTrip.ResultSet.totalResultsReturned; i++) {
var result = theTrip.ResultSet.Result[i];
tripPlanHTML = tripPlanHTML + '<div style="padding:4px;
border:1px solid gray;width:'+result.Image.Width+';"><img
src="'+result.Image.Url+'" width="'+result.Image.Width+'"
height="'+result.Image.Height+'"></img></div>'+
'<div ><a href="'+result.Url+'"><span style="font-weight:bold;font-size:
18px;">'+result.Title+'</span></a></div><div>'+result.Summary+'</div><br/>';
}
helloArea.innerHTML=tripPlanHTML;
} else {
alert('There was a problem with the request.');
}
}
}
</script>
<h2>Find Trip Plans (using Ajax &amp; JSON)</h2>
<p>Search for Trip Plans</p>
<input id="searchCriteria" type="text"> <input value="Search" type="button"
onclick="makeRequest('response_trip_planner_mult_json.jsp',
document.getElementById('searchCriteria').value)">
<div style="height:300px;width:420px;margin-top:8px;padding:8px;"
id="helloArea"></div>
Bill W. Scott, Y! Ajax Evangelist
bscott@yahoo-inc.com
Ajax Toolkits
Designing and Building Ajax Applications with Ajax Toolkits
The World of Ajax
What a Toolkit Provides
58
The World of Ajax
Evaluating Toolkits
• What language is it targeted for?
• Are you looking for XHR abstraction or high level?
• Will you use XML or JSON?
• Is it $$ or open source?
• Does it simplify general JS development?
• Community of support?
• Likelihood it will be around next year?
59
The World of Ajax
Ajax Toolkits: Open Source JavaScript Libraries
60
Prototype Inspired by Ruby, simplifies DOM manipulation, events,Ajax connectivity. Several frameworks
based on it. Notable for the $() function among many other shortcuts. OO extends.
Scriptaculous Built on Prototype, nice effects, animations, drag and drop, widgets. Nicely documented
Rico Built on Prototype, nice effects, animations, behaviours (widgets), drag and drop, nice Ajax engine
abstraction, style effects. Lots of demos.
Behaviour Built on Prototype, separates event management from HTML using CSS selectors
Dojo Widget library, drag and drop, effects, widget framework, event management, animation,
bookmarkability, manipulating location history, extensive deployment support
Zimbra Extensive set of widgets (data list, wizard, button, rich text editor, tree, menus, etc.). MVC,
debugging facilities
Microsoft Atlas In developer release. Support for drag and drop, animation, full XML specification for wiring
widgets together, behavior abstraction, will be integrated in full suite of MS dev tools.
MochiKit Widgets, painless DOM manipulation, task management, JSON-like notation, logging.Active
community
Sarissa Encapsulates XML functionality in browser-independent calls
The World of Ajax
Ajax Toolkit: Commercial JavaScript Libraries
61
TIBCO GI Very extensive framework with full IDE. Dozens of widgets, vector based
charting package, support for SOAP. IDE has WYSIWYG GUI layout, step
through debugging as well as code completion
Bindows Been around since 2001, lots of great widgets and library routines. Not
always browser independent
JackBe Focused at corporate environments.Able to emulate a desktop
application.Very fast performance even on a dial-up line. Uses a
proprietary “screen” format that gets interpreted by a JavaScript runtime
engine.
Active Widgets Rich set of JavaScript widgets. Rich grid widget is a high spot.
The World of Ajax
Ajax Toolkit: PHP
62
AjaxAC Separates events from HTML, subrequest support, event management, easily remotes to PHP
methods, start of a widget framework
Cajax Low level. Simplifies server side programming, limits client side JS required, suggest widget, plug-
in for form submission.
CakePHP OO, modeled after Ruby on Rails, integrated CRUD, fast, flexible templating, nice docs
CPAINT OO library for Ajax connectivity. Local & remote functions, single or multiple XHR, supports
both POST & GET
JPSpan PHP remoting via JavaScript
XAjax Low level. PHP remoting via JavaScript. Simplified DOM updates on XHR response.
XOAD Uses JSON and native PHP serialized objects, security emphasis, server side events, HTML
manipulation.Tutorials and documentation.
The World of Ajax
Ajax Toolkit: Java Frameworks
63
Ajax JavaServer Faces Framework Converts JSF applications to Ajax
Ajax JSPTag Library Set of tags for Ajax.Autocomplete, callout, select, toggle,
update fields
DWR For remoting Java methods from JavaScript code. Contains a
number of widgets.
Echo2 Auto generate HTML & JavaScript from server side.Write in
pure Java.
Guise ($$) Application framework that uses the desktop UI approach to
components and events (hides HTML generation and DOM
manipulation.) Controls, dialogs, flyovers,
JSP ControlsTag Library For portlet style JSP components. Supports Ajax and non-Ajax
modes
SWATO JS library based on Prototype. Uses JSON for marshalling.
Direct remoting for POJOs.Widgets include auto suggest,
template, logger.
AjaxAnywhere Turns existing JSP/JSF/Struts/Spring components into Ajax
Aware components
WebOrb for Java Ties together Ajax, Flash and Java objects with XML services
The World of Ajax
Prototype
• $()
• $F()
• Try.these()
• Ajax.request()
• Ajax.Updater()
• Element.show/hide/toggle/remove
• Object-oriented extensions
64
function makeRequest(url) {
var xhr = new Ajax.Request(url, {method:'get', onComplete: showResponse});
}
function showResponse(xhr) {

 $('helloArea').innerHTML = xhr.responseText;
}
The World of Ajax
Prototype Hello World
• Makes Ajax request/response simple
• Rico allows multiple targets in the response
65
function makeRequest(url) {
var xhr = new Ajax.Request(url,
{ method:'get', onComplete: showResponse });
}
function showResponse(xhr) {

 $('helloArea').innerHTML = xhr.responseText;
}
The World of Ajax
Dojo
66
Dojo
Widget Toolkit
xml.parse.* widget.Widget.*
widget.manager widget.HtmlWidget
Application Support Libraries
rpc.* dnd.*
io.*
dnd.*
storage.* fx.* logging..*
Environment Specific Libraries
dom.* html.* style.* svg.*
Language Libraries
string.* lang.* event.* json.*
Package System
• Events: multiple listeners,
browser abstraction,
memory leak protection
• Aspect-oriented
• I/O: common interface for
multiple transports, single/
multi response
• Built-in packaging system
• Widget building w/HTML &
CSS fragments, automatic
reuse
The World of Ajax
Microsoft Atlas Features
• Extensible core adds lifetime mgmt, inheritance,
multicast event handler, and interfaces
• Base class library: strings, timers, tasks
• UI framework for attaching behaviors to HTML
• Simple connectivity
• Set of rich UI controls (auto complete, popup panels,
animation, and drag and drop
• Browser compatibility layer
67
The World of Ajax
Microsoft Atlas: Interesting Concepts
• Update panels: mark region for auto update
• Behaviors: encapsulate actions to associate with
DHTML events [floating, hover, popup,
autocomplete]
• Validators [required, type, range, regex, etc.]
• Data binding: connect controls & manage flow
between them [data entered, reflected elsewhere]
• Bindings transformers: support transform event as
part of a binding [ToString, invert, etc.]
68
The World of Ajax
Microsoft Atlas
• Two models: XML scripting & JS API
• Will be fully supported by Microsoft tools
• Big Q? Tied to ASP.NET?
• Language on the site is confusing
• Similar to how XHR got lost!
• But I have been assured they intend the Atlas Client
Scripting Framework to be totally independent of Microsoft
technologies (although they want you to use them!)
69
Bill W. Scott, Y! Ajax Evangelist
bscott@yahoo-inc.com
Advanced Topics
Problems and Challenges with Building Ajax Applications
The World of Ajax
How Ajax Changes Things
71
Classic Web Ajax/Web 2.0 Problems/Challenges
Page to page navigation Micro content
Back button, SEO, bookmarking,
accessibility, security
URL/Link = User’s location Application state
Back button, SEO, bookmarking,
accessibility
Browser history Application history Back button, bookmarking, accessibility
Back button = Undo Is unpredictable Back button, bookmarking, accessibility
Little JavaScript More JavaScript
Accessibility, degradability, security,
memory, performance, debug,
obsfucation, error handling
Document model Application model
Back button, SEO, bookmarking,
accessibility
Static content Dynamic content SEO, bookmarking, accessibility
Course-grained events Micro states Back button
Synchronous Asynchronous Error handling
Browser chrome Application controls Back button, bookmarking, accessibility
Page Services Web Services Security, XML vs. JSON
The World of Ajax
Back Button
• Problem: Ajax application state changes, URL does
not. No browser history of state changes/navigation
• What does the user expect?
• Often confused with Undo
• True context view changes should be part of history
• Navigation tabs; but not content tabs?
• Steps in a process
• Tree selection when views change
• Impact of tabbed browsers?
72
The World of Ajax
Back Button Solution: Fragment Identifier
• URL hash, fragment identifier (http://a.com#loc
does not trigger a page reload
• Fragment identifier (string after ‘#’) can be used to
record state changes in the URL
73
The World of Ajax
Back Button: Fragment Identifier
• Yahoo! Maps Beta also uses this technique
• Bottom line: tricky to implement
• Dojo, Backbase provide direct support
• One approach:
http:/
/www.contentwithstyle.co.uk/Articles/38/fixing-the-back-
button-and-enabling-bookmarking-for-ajax-apps
• All links have fragment
• Clicking link changes URL, not page
• Timer monitors window.location.href & updates
74
The World of Ajax
Back Button: iframe Approach
• Technique: use iframes to control browser history for
recording state changes
• Tricky issues abound
• Fragile across browsers
• onload issues
• audible transition (on IE if sound enabled)
• Bottom line: problematic
75
The World of Ajax
Search Engine Optimization
(Deep Linking)
• All the content may not be statically available for
search engine crawlers
• Won’t find content to index your pages correctly
• Possible solutions
• Lightweight Indexing: leverage existing tags such as meta,
title and h1
• Extra Links: extra links are placed on the site.
• Secondary Site: a secondary site is fully accessible to the
search engine. (See degraded experience)
76
source: backbase.com
The World of Ajax
Bookmarking
• Since we have broken the history and URL paradigm,
bookmarking become problematic
• What does the user expect?
• Do they expect to bookmark application state? content
viewed?
• Desktop apps often support bookmarking. It is always
content based.
77
The World of Ajax
Bookmarking Technique
• Allow the user to save a bookmark at an interesting
moment in an Ajax application
• Perhaps dynamically generate a link for bookmarking
• The URL generated for the bookmark is sufficient to
restore the state
78
The World of Ajax
Bookmarking in Google Maps
• Google Maps
• Link is generated on each new map address
• Link contains URL parameters to return to the page
79
The World of Ajax
Another Bookmarking Example
• OpenRico LiveGrid
http://richardcowin.typepad.com/blog/2005/07/there_has_been_.html
80
http://openrico.org/rico/livegrid.page?
data_grid_index=60&data_grid_sort_col=rating&data_grid_sort_dir=ASC
The World of Ajax
Accessibility
81
DHTML
Provides
Accessibility
Expects
Problem
JavaScript enabled
markup, new user
interface controls
Simple markup
Markup has more meaning than expected. How
does the assistive technology understand this is
a tree control? How does it understand the
state of a control?
Dynamic pages &
content
Fairly static pages
How do I announce dynamic content?
Weak support for
keyboard navigation
Keyboard navigation
Sight-impaired users will not be using rich
interactions; they will use the keyboard (or
another device that simulates the keyboard)
But how to tab key, arrow key, select items with
the keyboard?
The World of Ajax
Addressing Accessibility in Ajax Applications
• IBM/Mozilla Accessible DHTML API/Spec
• Direct support for keyboard traversal
• Supports tab key to a container, arrow keys to navigate
inside the container and enter key to select item
• Setting tabindex=-1 allows focus to be set on a object
without it being in the tab order
• A way to add metadata to HTML markup for assistive
technologies to understand:
• Widget roles, properties, values and events
• Working with assistive technology vendors to make them
aware of this API (funded development)
• Microsoft’s plans
82
The World of Ajax
Accessibility: Setting tabindex
83
tabindex value Purpose Tab key navigable?
Not set
Accept default
behavior
Default behavior
Form elements
tabindex = “-1”
For child elements
(nodes in a tree)
No.
You must set the focus
with JavaScript
tabindex = “0”
To tab in HTML code
order
Tabbing moves you
field to field in the
order they are added
to the page
tabindex > “0”
To specify an exact
order for each field
Value describes
the tab order
The World of Ajax
Accessibility: Example of Markup for Role & Property
• Roles
<span tabindex="0" xhtml2:role="wairole:checkbox"
property:checked="true"
onkeydown="return checkBoxEvent(event);"
onclick="return checkBoxEvent(event);">
Any checkbox label
</span>
• Provides clues to assistive technologies
84
The World of Ajax
Degradability
• Degradability - Managing the user experience as you move
down in device/browser capability
• At Yahoo! we grade the browser by experience we will
provide (A, B, C grade)
• A-grade experience (majority of our users; greatest visual fidelity
and richest interactions
• B-grade experience (almost A-grade, but either they are on
bleeding edge, low adoption or low economic value). Not
considered in development or testing
• C-grade experience (baseline of support; content but little style or
interaction). Crawlers and old browsers get this experience.
85
The World of Ajax
Degradability: Some Solutions
• Pre-emptive nag bar
• Semantic Markup
• What’s good for accessibility is good for degradability
• Design Issues
• What is the experience for C-grade browsers?
• What is the experience for non-browsers?
86
The World of Ajax
Web Services
• Web 2.0 - Web as a Platform. Lots of web services!
• Yahoo! Services
• del.icio.us, Financ, Flick, HotJob,
Maps, Merchant Solutions, Music,
RSS Feeds, Search, Search Marketing,
Shopping, Travel, Traffic,
upcoming.org, weather, webjay,
widgets
• Google Services
• maps, search, desktop, sitemaps,
adwords
87
The World of Ajax
Web Services Example
88
Server
XHR
http://api.travel.yahoo.com/TripService/V1/tripSearch?
appid=PARTNER_KEY&query=alaska&output=json
Yahoo! Trip
Planner exposes its
service via an
URL
The World of Ajax
Web Services, Some Choices: XML vs JSON
• JSON means
• Trivial parsing
• Faster than XML
• Friendlier for developer
• Runs everywhere
• It’s JavaScript, simpler programming model
• Very stable... never will change!
• Strong community, wide acceptance
• Yahoo! behind it
89
The World of Ajax
Security: Same Site Rule
• The domain of the URL request destination must be
same as one that serves up page containing script
• Why? XHR requests to a different site would carry
cookies. Cookies would spoof authentication.
• Solutions
• Proxies
• <script> hack
• Other remote scripting tricks
• JSONRequest (coming)
90
The World of Ajax
Security: JSONRequest
• I want to access multiple services (from different
domains) without setting up a separate server
(scalable, simpler to implement)
• Solution: Protocol that POSTs JSON text, gets
response, parses the response into JavaScript value
• No cookies sent
• No other file formats accepted. Must be valid JS
• JSON is safe JavaScript (data not functions)
• Little or no error information provided to a miscreant
• Accumulates random delays before trying again to frustrate
denial of service attacks
• Can support duplex!
91
The World of Ajax
Memory Management
• Hey, Internet Explorer is leaky!
• Its memory garbage collector is the culprit
• Uses reference counting; JS uses Mark & Sweep
• Often closures are blamed
• Common problem that causes memory leaks
• DOM <--> Application object reference each other
• Event handlers left hanging around
• Tool for IE: Drip
92
The World of Ajax
JavaScript Performance
• JavaScript requires common sense
• Cache repeatedly accessed objects
• Always use var for local variables
• Use numbers for number and strings for strings
• Avoid using eval() for accessing properties
eval(“obj.”+propName) --> obj[propName]
• Look to your loops
• And a few surprises
• Build DOM trees downward
• Use array.join for lengthy string concatenations
93
source: Adam Platti
The World of Ajax
Debugging Tools
• Microsoft Script Editor
• Instant Source (IE Plugin)
• IE Dev Toolbar
• Venkman (Mozilla)
• DOM Inspector (Mozilla)
• Web Developer Tools (Mozilla)
• Safari JavaScript Console
• JSLint
94
The World of Ajax
Debugging: Venkman
95
• Breakpoints
• Local variables
• Watches
• Call Stack
• Profiling
• Source view
• Debug toolbar
The World of Ajax
Debugging Prevention: JSLint
• Lint are syntax checkers and validators
• JavaScript needs lint
• http:/
/www.crockford.com/jslint/lint.html
• Scans source file & looks for common syntax
problems
• Nice way to catch silly mistakes
• Try it at: http:/
/jslint.com
96
The World of Ajax
Obsfucation or Minification
• JavaScript is easy to see with a Save or a <ctrl>-U
• JavaScript can increase page size & page load
• Obsfucators mangle the code into unreadable form
• Minifiers strip white space & comments
• Obsfucators go too far
• Makes development way too hard
• Minification & compression do just enough
• JSMin (http:/
/www.crockford.com/javascript/jsmin.html)
97
The World of Ajax
Error Handling
• Asynchronous error handling
• Keep design simple (do you need multiple requests going at
once?)
• Will increase implementation issues
• Normal error handling
• Check for error codes (!=200)
• Roll your own HTTP status error codes
• Minimize server-side errors with intentional
validation (error prevention)
98
The World of Ajax
Error Handling
• Difficult to correct XML, JSON or even HTML over
the wire. XML & JSON are slightly harder. Server
issue, but how to handle
• Use error handlers provided by Ajax frameworks
• Prototype try.these
• JavaScript try/catch
• DWR has global error handler
• Dojo error handlers
99
The World of Ajax 100
Questions?

More Related Content

What's hot (20)

PDF
Solr vs. Elasticsearch, Case by Case: Presented by Alexandre Rafalovitch, UN
Lucidworks
 
PPTX
Solr vs. Elasticsearch - Case by Case
Alexandre Rafalovitch
 
PPTX
Getting started with Elasticsearch and .NET
Tomas Jansson
 
PPTX
MongoDB and Indexes - MUG Denver - 20160329
Douglas Duncan
 
PDF
elasticsearch - advanced features in practice
Jano Suchal
 
ODP
Query DSL In Elasticsearch
Knoldus Inc.
 
PDF
Getting started with MongoDB and Scala - Open Source Bridge 2012
sullis
 
PDF
Elasticsearch for Data Analytics
Felipe
 
PPTX
Indexing & Query Optimization
MongoDB
 
PDF
Cloudera Impala, updated for v1.0
Scott Leberknight
 
PDF
Java Persistence Frameworks for MongoDB
MongoDB
 
PPTX
Reducing Development Time with MongoDB vs. SQL
MongoDB
 
PPTX
Indexing and Query Optimization
MongoDB
 
PDF
Introduction to Apache Solr
Christos Manios
 
PDF
Search Evolution - Von Lucene zu Solr und ElasticSearch
Florian Hopf
 
PPTX
Morphia: Simplifying Persistence for Java and MongoDB
Jeff Yemin
 
PPTX
.NET Database Toolkit
wlscaudill
 
PPTX
Implementing CQRS and Event Sourcing with RavenDB
Oren Eini
 
PPTX
Simplifying Persistence for Java and MongoDB with Morphia
MongoDB
 
PPTX
Ajax
Nibin Manuel
 
Solr vs. Elasticsearch, Case by Case: Presented by Alexandre Rafalovitch, UN
Lucidworks
 
Solr vs. Elasticsearch - Case by Case
Alexandre Rafalovitch
 
Getting started with Elasticsearch and .NET
Tomas Jansson
 
MongoDB and Indexes - MUG Denver - 20160329
Douglas Duncan
 
elasticsearch - advanced features in practice
Jano Suchal
 
Query DSL In Elasticsearch
Knoldus Inc.
 
Getting started with MongoDB and Scala - Open Source Bridge 2012
sullis
 
Elasticsearch for Data Analytics
Felipe
 
Indexing & Query Optimization
MongoDB
 
Cloudera Impala, updated for v1.0
Scott Leberknight
 
Java Persistence Frameworks for MongoDB
MongoDB
 
Reducing Development Time with MongoDB vs. SQL
MongoDB
 
Indexing and Query Optimization
MongoDB
 
Introduction to Apache Solr
Christos Manios
 
Search Evolution - Von Lucene zu Solr und ElasticSearch
Florian Hopf
 
Morphia: Simplifying Persistence for Java and MongoDB
Jeff Yemin
 
.NET Database Toolkit
wlscaudill
 
Implementing CQRS and Event Sourcing with RavenDB
Oren Eini
 
Simplifying Persistence for Java and MongoDB with Morphia
MongoDB
 

Similar to Ajaxtechnicalworkshopshortversion 1224845432835700-8 (20)

PDF
Learn Ajax here
jarnail
 
PDF
Introduction to ajax
Nir Elbaz
 
PPTX
AJAX and JSON
Julie Iskander
 
PPTX
Unit-5.pptx
itzkuu01
 
PDF
Lec 7
maamir farooq
 
PDF
Ajax tutorial
Kat Roque
 
PPT
Ajax Tuturial
Anup Singh
 
PDF
RicoAjaxEngine
tutorialsruby
 
PDF
RicoAjaxEngine
tutorialsruby
 
PDF
ERRest and Dojo
WO Community
 
PPTX
JSON
Yoga Raja
 
PPT
PHP - Introduction to PHP AJAX
Vibrant Technologies & Computers
 
PPT
Ajax Lecture Notes
Santhiya Grace
 
PPT
J query 01.07.2013
Rajasekharreddy Kadasani
 
PPT
J query 01.07.2013.html
Rajasekharreddy Kadasani
 
PPT
Web Programming using Asynchronous JavaX
SivanN6
 
PPTX
UNIT2-AJAX111111111111111111111111111.pptx
dkmishra2407
 
PPTX
Web technologies-course 10.pptx
Stefan Oprea
 
PDF
Ajax and xml
sawsan slii
 
Learn Ajax here
jarnail
 
Introduction to ajax
Nir Elbaz
 
AJAX and JSON
Julie Iskander
 
Unit-5.pptx
itzkuu01
 
Ajax tutorial
Kat Roque
 
Ajax Tuturial
Anup Singh
 
RicoAjaxEngine
tutorialsruby
 
RicoAjaxEngine
tutorialsruby
 
ERRest and Dojo
WO Community
 
JSON
Yoga Raja
 
PHP - Introduction to PHP AJAX
Vibrant Technologies & Computers
 
Ajax Lecture Notes
Santhiya Grace
 
J query 01.07.2013
Rajasekharreddy Kadasani
 
J query 01.07.2013.html
Rajasekharreddy Kadasani
 
Web Programming using Asynchronous JavaX
SivanN6
 
UNIT2-AJAX111111111111111111111111111.pptx
dkmishra2407
 
Web technologies-course 10.pptx
Stefan Oprea
 
Ajax and xml
sawsan slii
 
Ad

Recently uploaded (20)

PPT
Hazard identification and risk assessment PPT
SUNILARORA51
 
PDF
ADVXAI IN MALWARE ANALYSIS FRAMEWORK: BALANCING EXPLAINABILITY WITH SECURITY
ijscai
 
PPTX
Water resources Engineering GIS KRT.pptx
Krunal Thanki
 
PPTX
File Strucutres and Access in Data Structures
mwaslam2303
 
PDF
Geothermal Heat Pump ppt-SHRESTH S KOKNE
SHRESTHKOKNE
 
PDF
A NEW FAMILY OF OPTICALLY CONTROLLED LOGIC GATES USING NAPHTHOPYRAN MOLECULE
ijoejnl
 
PPTX
Abstract Data Types (ADTs) in Data Structures
mwaslam2303
 
PPTX
Smart_Cities_IoT_Integration_Presentation.pptx
YashBhisade1
 
PPTX
Cyclic_Redundancy_Check_Presentation.pptx
alhjranyblalhmwdbdal
 
PDF
NOISE CONTROL ppt - SHRESTH SUDHIR KOKNE
SHRESTHKOKNE
 
PDF
POWER PLANT ENGINEERING (R17A0326).pdf..
haneefachosa123
 
PPTX
00-ClimateChangeImpactCIAProcess_PPTon23.12.2024-ByDr.VijayanGurumurthyIyer1....
praz3
 
PPTX
ENG8 Q1, WEEK 4.pptxoooiioooooooooooooooooooooooooo
chubbychubz1
 
PDF
IEEE EMBC 2025 「Improving electrolaryngeal speech enhancement via a represent...
NU_I_TODALAB
 
PDF
Air -Powered Car PPT by ER. SHRESTH SUDHIR KOKNE.pdf
SHRESTHKOKNE
 
PPTX
GitHub_Copilot_Basics...........................pptx
ssusera13041
 
PDF
A presentation on the Urban Heat Island Effect
studyfor7hrs
 
PPT
IISM Presentation.ppt Construction safety
lovingrkn
 
PDF
Comparative Analysis of the Use of Iron Ore Concentrate with Different Binder...
msejjournal
 
PDF
Web Technologies - Chapter 3 of Front end path.pdf
reemaaliasker
 
Hazard identification and risk assessment PPT
SUNILARORA51
 
ADVXAI IN MALWARE ANALYSIS FRAMEWORK: BALANCING EXPLAINABILITY WITH SECURITY
ijscai
 
Water resources Engineering GIS KRT.pptx
Krunal Thanki
 
File Strucutres and Access in Data Structures
mwaslam2303
 
Geothermal Heat Pump ppt-SHRESTH S KOKNE
SHRESTHKOKNE
 
A NEW FAMILY OF OPTICALLY CONTROLLED LOGIC GATES USING NAPHTHOPYRAN MOLECULE
ijoejnl
 
Abstract Data Types (ADTs) in Data Structures
mwaslam2303
 
Smart_Cities_IoT_Integration_Presentation.pptx
YashBhisade1
 
Cyclic_Redundancy_Check_Presentation.pptx
alhjranyblalhmwdbdal
 
NOISE CONTROL ppt - SHRESTH SUDHIR KOKNE
SHRESTHKOKNE
 
POWER PLANT ENGINEERING (R17A0326).pdf..
haneefachosa123
 
00-ClimateChangeImpactCIAProcess_PPTon23.12.2024-ByDr.VijayanGurumurthyIyer1....
praz3
 
ENG8 Q1, WEEK 4.pptxoooiioooooooooooooooooooooooooo
chubbychubz1
 
IEEE EMBC 2025 「Improving electrolaryngeal speech enhancement via a represent...
NU_I_TODALAB
 
Air -Powered Car PPT by ER. SHRESTH SUDHIR KOKNE.pdf
SHRESTHKOKNE
 
GitHub_Copilot_Basics...........................pptx
ssusera13041
 
A presentation on the Urban Heat Island Effect
studyfor7hrs
 
IISM Presentation.ppt Construction safety
lovingrkn
 
Comparative Analysis of the Use of Iron Ore Concentrate with Different Binder...
msejjournal
 
Web Technologies - Chapter 3 of Front end path.pdf
reemaaliasker
 
Ad

Ajaxtechnicalworkshopshortversion 1224845432835700-8

  • 1. Bill W. Scott, Y! Ajax Evangelist [email protected] Ajax 101 Where we get down and dirty with Ajax operations, JavaScript events and the DOM
  • 2. The World of Ajax Anatomy of a Pattern • Ajax design patterns contain three steps • Trigger (event or timer) • Operation (Ajax, remote scripting) • Update (presentation) 2 Trigger Operation Update
  • 3. The World of Ajax Operation.Using XHR 3
  • 4. The World of Ajax Operation. Using XHR • The five operations are not built into XHR • The simple send/response mechanism can be used to implement lookup, persist, validate, invoke and message • To create these operations, one must understand how to use XHR • A simple HelloWorld example will illustrate using XHR 4 Ajax XHR
  • 5. The World of Ajax Simple Ajax ‘Hello World’ 5 XHR Object request data <?xml version="1.0" ?> <root> This data was brought to you by Ajax! </root> /response.xml response • Clicking the link makes an XHR request • Response is inserted into the area outlined in blue Ajax XHR
  • 6. The World of Ajax Ajax How To 1. Create a request object 2. Write a callback 3. Make the request 4. Parse the response 6 Ajax XHR
  • 7. The World of Ajax var xhr = null; if (window.XMLHttpRequest) { xhr = new XMLHttpRequest(); xhr.overrideMimeType(‘text/xml’); } else if (window.ActiveXObject) { xhr = new ActiveXObject(“Microsoft.XMLHTTP”); } else { alert(“Perhaps your browser doesn’t support Ajax.”); } if browser is mozilla or safari or opera then create a new XMLHttpRequest otherwise it is IE then create a new ActiveXObject otherwise error - browser does not support XMLHttpRequest 1. Create a Request Object • IE5+ implements XHR as an ActiveX object • Mozilla 1.0+, Safari 1.2+, Opera 8+, IE7 provide an XMLHttpRequest object in their API • All XHR objects have the same methods & properties 7 1. Create
  • 8. The World of Ajax XHR Methods 8 Method Description open(“method”, “url”, [, asynchFlag [, “username” [, “password”]]]) Sets up the request object for sending a request send(content) Sends the request to the server. Can be null. abort() Stops the request. getAllResponseHeaders() Returns all response headers for the HTTP request as key/value pairs. getReponseHeader(“header”) Returns the string value of the specified header. setRequestHeader(“header”, “value”) Sets the specified header to the supplied value. Source: Foundations of Ajax - APress Ajax XHR
  • 9. The World of Ajax XHR Properties 9 Property Description onreadystatechange The event handler that fires at every state change. readystate The state of the request: 0=uninitialized, 1=loading, 2=loaded, 3=interactive, 4=complete responseText The response from the server as a text string responseXML The response from the server as an XML document status The HTTP status code from the server for the request object: 200: Ok; 201: Created; 400: bad request, 403: Forbidden; 500: internal sever error statusText The text version of the HTTP status code Ajax XHR
  • 10. The World of Ajax function handleAjaxResponse() { // we will handle the ajax response here... } function handleAjaxResponse begin do something with the data that is returned from XHR end 2. Write a Callback • JavaScript function is invoked when the readystate changes on the XHR object 10 Ajax XHR
  • 11. The World of Ajax xhr.onreadystatechange = handleAjaxResponse; xhr.open(‘GET’, ‘response.xml’, true); xhr.send(null); set onreadystatechange to callback function - handleAjaxResponse open a request on the xhr object send the request through the xhr object 3. Make the Request • The JavaScript function getResponse will be invoked when the readystate property changes on the XHR object • Same site rule • ‘GET’ or ‘POST’ • Asynchronous flag 11 Ajax XHR XHR Object request response X √ X server must be accessible via relative url
  • 12. The World of Ajax 3. Make the Request - Choosing Between GET and POST • Use GET for • For retrieve • REST services • When passing parameters • Idempotent URLs • Small amount of data • Use POST for • Modification • Large amounts of data passed to server • Non-idempotent URLs 12 Ajax XHR
  • 13. The World of Ajax 3. Make the Request: Handling the Request on the Server Side • Its just a normal HTTPRequest • Normal mechanism for getting request parameters • Raw POST (xhr.send(someData)) • Java/JSP: request.getInputStream() - read as raw post • Rails: @request.raw_post • PHP: $data = file_get_contents('php:/ /input') 13
  • 14. The World of Ajax function handleAjaxResponse() { if ((xhr.readystate == 4) && (xhr.status == 200)) { var doc = xhr.responseXML; var rootNode = doc.getElementsByTagName('root').item(0); var helloArea = document.getElementById("helloArea"); helloArea.innerHTML=rootNode.firstChild.data; } } function handleAjaxResponse begin if response is valid then get responseXML get rootNode get helloArea on the page stuff the rootNode value into the helloArea DIV endif end 4. Parse the Response • readystate values 0 – Uninitialized 1 – Loading 2 – Loaded 3 – Interactive 4 – Completed 14 Ajax XHR
  • 15. The World of Ajax 4. Parse the Response: Formatting an XML Response on the Server • XML version must be first line <?xml version="1.0" encoding="ISO-8859-1"?> • Set up response header’s Content-type “Content-Type”, “text/xml” • Use well-formed XML 15 Ajax XHR
  • 16. The World of Ajax 4. Parse the Response: Handling an XML Response on the Client • Use XHR property responseXML to get the response as an XML DOM (XmlDocument) • Use standard JavaScript DOM methods • Mozilla, Safari, Opera & IE support a common set of methods and properties • Watch out for IE only stuff (e.g., children property) • Watch out for whitespace issues • Other options • Use XML library for JS (e.g., XML for <script>) 16 Ajax XHR
  • 17. The World of Ajax 4. Parse the Response: Xml Document API 17 Property/Method Description documentElement Returns the root element of the document firstChild Is the first element within another element (the first child of the current node) lastChild Is the last element within another element (the last child of the current node) nextSibling Is the next element in the same nested level as the current one previousSibling Is the previous element in the same nested level as the current one nodeValue Is the value of a document element getElementsByTagName Used to place all elements into an object Ajax XHR
  • 18. The World of Ajax data JS data data Response Options 18 XHR Object request response html html text xml json Ajax XHR • Different types, different formats
  • 19. The World of Ajax data JS data data Response Options 19 XHR Object request response html html text xml json innerHTML Ajax XHR • Snippets of HTML returned, stuffed into innerHTML
  • 20. The World of Ajax data JS data data Response Options 20 XHR Object request response html html text xml json model model Ajax XHR • Data returned from the server, interface built from it
  • 21. The World of Ajax JSON • JavaScript supports several string based notations • Allows the basic types to be represented as string literals • Strings are easy to pass over the wire • JSON (JavaScript Object Notation - json.org) 21 Ajax XHR
  • 22. The World of Ajax JSON Response: Object Literal {"name": "Jack B. Nimble", "at large": true, "grade": "A", "level": 3} 22 name Jack B. Nimble at large true grade A level 3 Ajax XHR
  • 23. The World of Ajax JSON Response: Array Literal ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"] array of 7 named days [ [0, -1, 0], [1, 0, 0], [0, 0, 1] ] 3x3 array 23 Ajax XHR
  • 24. The World of Ajax JSON Response: JSON is JavaScript • JSON's simple values are the same as used in JavaScript • No restructuring is requested: JSON's structures are JavaScript! • JSON's object is the JavaScript object • JSON's array is the JavaScript array • Parsing is simple, native 24 Ajax XHR
  • 25. The World of Ajax JSON Response: Parsing JSON • Obtain responseText • Parse the responseText responseData = eval('(' + responseText + ')'); OR responseData = JSON.parse(responseText); 25 Ajax XHR
  • 26. The World of Ajax JSON Response: Y! JSON API • http://api.search.yahoo.com/WebSearchService/V1/webSearch? appid=YahooDemo&query=finances&start=1&results=1&output=json { "ResultSet": { "totalResultsAvailable":"69200000", "totalResultsReturned":"1", "firstResultPosition":"1", "Result": { "Title":"Yahoo! Finance", "Summary":"manage the market and your money with Yahoo! Finance. Includes stock market quotes, business news, mutual funds, online bill pay, banking tools, loans, insurance, retirement planning, and tax tips and advice.", "Url":"http://finance.yahoo.com/", "ClickUrl":"http://finance.yahoo.com/", "ModificationDate":"1137225600", "MimeType":"text/html" } } } 26 Ajax XHR
  • 27. The World of Ajax Ajax Operations 27 Ajax XHR • Lookup I can get information when I need it • Persist I can save in real-time • Validate I can prevent errors early • Invoke I can make things happen now • Message I can communicate instantly 33 Operation
  • 28. The World of Ajax Trigger.JavaScript Events 28
  • 29. The World of Ajax Trigger. JavaScript Events • Ajax interactions are kicked off by event & timer triggers • There are issues with event management within the browsers • You do need to understand these implications to write good Ajax applications 29 JavaScript Events
  • 30. The World of Ajax First, the Events 30 onAbort onBlur onChange onClick onDblClick onDragDrop onError onFocus onKeyDown onKeyPress onKeyUp onLoad onMouseDown onMouseMove onMouseOut onMouseOver onMouseUp onMove onReset onResize onSelect onSubmit onUnload JavaScript Events
  • 31. The World of Ajax Problem in a Nutshell • Different event models • Timing Issues • Confusing madness around the this pointer • Browser incompatibilities • Memory leak issues 31 JavaScript Events
  • 32. The World of Ajax Different Event Models • Two Models (actually three!) • Classic style • <element onclick=func() > • element.onclick=func; • W3C event model • addEventListener, removeEventListener • IE event model • attachEvent, detachEvent 32 JavaScript Events
  • 33. The World of Ajax Timing Issues • Attempting to attach events before the page is loaded will cause problems • Do it on the onload 33 JavaScript Events
  • 34. The World of Ajax Confusing this Madness • Inline registration • Event handler with function • Event handler with Object prototype 34 <a href=”#” onclick=”clickHandler(this)”> function clickHandler(anchorDOMElem) { // this == window --> window owns the function this = anchorDOMElem; // fix the ‘this’ pointer } anchorDOMElem.onclick=clickHandler; function clickHandler() { //this == anchorDOMElem --> anchorDOMElem owns the function } function AnchorLink(anchorDOMElem) { // this == AnchorLink object this.anchorDOMElem = anchorDOMElem; // save DOM elem this.anchorDOMElem.onclick = this.clickHandler; // event handler this.anchorDOMElem.anchorLinkObj = this; // store this on dom elem } AnchorLink.prototype.clickHandler = function() { // this == anchorDOMElem, not AnchorLink object // confusing since this normally refers to AnchorLink // grab our normal this anchorLinkObj = this.anchorLinkObj; } JavaScript Events
  • 35. The World of Ajax Confusing this Madness • Arbitrary number of event handlers • Way to remove events • Defines capture & bubble flow • No way to get list of handlers • And the browsers play differently: 35 Internet Explorer Mozilla (FF), Safari, Opera [W3C] addEventListener(), removeEventListener() attachEvent(), detachEvent this == window object this == DOM event object JavaScript Events
  • 36. The World of Ajax Memory Leaks • IE’s garbage collection does reference counting • Attaching events and not removing them when finished will cause memory leaks • Can use an Observer pattern to cache event handlers and at the end clean them up • Most Ajax frameworks provide this capability 36 JavaScript Events
  • 37. The World of Ajax Update.The DOM 37
  • 38. The World of Ajax Update. The DOM • Browsers represent the user interface as a set of objects (or elements) • Since a page has a hierarchy of containment, each of these elements are related as parent-child or siblings • This takes the shape of a tree • The tree of elements is called the document object model or DOM • Any change to the DOM structure or a DOM element is reflected immediately on the web page 38 DHTML DOM
  • 39. The World of Ajax DOM Example 39 DHTML DOM • Represented as a tree of nodes
  • 40. The World of Ajax Using the DOM • JavaScript is the DOM manipulator • Use it to • Find DOM elements • Add new elements • Remove elements • Modify element attributes 40 DHTML DOM
  • 41. The World of Ajax Finding DOM Elements • document.getElementById • Prototype library shortcut: $(“idName”) or $(id) • parentNode • childNodes 41 DHTML DOM
  • 42. The World of Ajax DOM Manipulation • Creating new interface elements • innerHTML, createElement(), createTextNode(), appendChild() • Changing element styles • Visual attributes • Geometry 42 DHTML DOM
  • 43. The World of Ajax Example of DOM Manipulation (Hello World) 43 <h2>Ajax Hello World</h2> <p>Clicking the link below will use XHR to fetch the data and then show the result in the box below.</p> <span class="ajaxlink" onclick="makeRequest('response.jsp')"> Make an ajax request for data </span> <div id="helloArea"></div> var helloArea = document.getElementById("helloArea"); helloArea.innerHTML=rootNode.firstChild.data; DHTML DOM
  • 44. The World of Ajax Keeping it Clean • Separate presentation style from content with CSS • Supports degradability • Supports accessibility • Simplifies maintenance • This is called good semantic markup 44 DHTML DOM
  • 45. The World of Ajax Semantic Markup Example 45 <div id="weather"> <div id="current"> <div id="currentHeader" class="accordionTabTitleBar"> Current Conditions </div> <div class="weatherTabContentBox"> <div class="weatherPanel" id="ccInfo"> </div> </div> </div> <div id="moon"> <div id="moonHeader" class="accordionTabTitleBar"> Moon </div> <div class="weatherTabContentBox"> <div class="weatherPanel" id="moonInfo"> </div> </div> </div> <div id="sun"> <div id="sunHeader" class="accordionTabTitleBar"> Sunlight Summary </div> <div class="weatherTabContentBox"> <div class="weatherPanel" id="sunInfo"> </div> </div> </div> </div> new Rico.Accordion( 'weather', {panelHeight:220, expandedBg:'#39497b'} DHTML DOM
  • 46. Bill W. Scott, Y! Ajax Evangelist [email protected] Ajax & Web Services XML and JSON Examples
  • 47. The World of Ajax Building an Ajax Weather Widget Using an XML Service Server XHR
  • 48. The World of Ajax REST Service - weather.com 48 http://xoap.weather.com/weather/local/95132? cc=*&link=xoap&prod=xoap&par=PARTNER_KEY&key=LICENSE_KEY Server XHR weather.com exposes its weather service via an URL that includes a partner key and license key
  • 49. The World of Ajax XML Response from weather.com 49 <?xml version="1.0" encoding="ISO -8859-1"?> <weather ver="2.0"> <head> <locale>en_US</locale> <form>MEDIUM</form> <ut>F</ut> <ud>mi</ud> <us>mph</us> <up>in</up> <ur>in</ur> </head> <loc id="95132"> <dnam>San Jose, CA (95132)</ dnam> <tm>8:37 PM</tm> <lat>37.4</lat> <lon>-121.86</lon> <sunr>7:18 AM</sunr> <suns>5:20 PM</suns> <zone>-8</zone> </loc> <cc> <lsup>1/21/06 7:53 PM PST</lsup> <obst>San Jose, CA</obst> <tmp>49</tmp> <flik>46</flik> <t>Mostly Cloudy</t> <icon>27</icon> <bar> <r>30.27</r> <d>rising</d> </bar> <wind> <s>7</s> <gust>N/A</gust> <d>350</d> <t>N</t> </wind> <hmid>80</hmid> <vis>10.0</vis> <uv> <i>0</i> <t>Low</t> </uv> <dewp>43</dewp> <moon> <icon>21</icon> <t>Waning Gibbous</t> </moon> </cc> </weather> Server weather.com responds with an XML response that describes the weather’s current conditions
  • 50. The World of Ajax Rico/Prototype Response 50 <?xml version="1.0" encoding="ISO-8859-1"?> <ajax-response> <response type="element" id="ccInfo"> <div class="weatherTitle">San Jose, CA (95132)</div> <div> <span><image id="ccImg" src="/images/weather/27.png"></image></span> <span class="weatherTemp">49&#176;F</span> </div> <div class="weatherDescr">Mostly Cloudy</div> <div> <table cellspacing="0" cellpadding="0" border="0"> <tr class="weatherDetail"> <td class="weatherDetailTitle">Humidity:</td> <td>80&#37;</td></tr> <tr class="weatherDetail"> <td class="weatherDetailTitle">Barometer:</td> <td>30.27&quot;</td></tr> <tr class="weatherDetail"> <td class="weatherDetailTitle">Wind:</td> <td>From N at 7 mph</td></tr> <tr class="weatherDetail"> <td class="weatherDetailTitle"></td> <td>gusting to N/A mph</td></tr> <tr class="weatherDetail"> <td class="weatherDetailTitle">Dewpoint:</td> <td>43&#176;F</td></tr> <tr class="weatherDetail"> <td class="weatherDetailTitle">Heat Index:</td> <td>46&#176;F</td></tr> </table> </div> </response> </ajax-response> Server XHR My server code translates the weather.com XML into a Rico/Prototype ajax-response. Notice the response is an HTML code snippet.The response is of type element, and mapped to id=”ccInfo”
  • 51. The World of Ajax Simple DIV Structure Defines the Accordion 51 <div id="weather"> <div id="current"> <div id="currentHeader" class="accordionTabTitleBar"> Current Conditions </div> <div class="weatherTabContentBox"> <div class="weatherPanel" id="ccInfo"> </div> </div> </div> <div id="moon"> <div id="moonHeader" class="accordionTabTitleBar"> Moon </div> <div class="weatherTabContentBox"> <div class="weatherPanel" id="moonInfo"> </div> </div> </div> <div id="sun"> <div id="sunHeader" class="accordionTabTitleBar"> Sunlight Summary </div> <div class="weatherTabContentBox"> <div class="weatherPanel" id="sunInfo"> </div> </div> </div> </div> <script> onloads.push( accord ); function accord() { new Rico.Accordion( 'weather', {panelHeight:220, expandedBg:'#39497b'} ); } </script>
  • 52. The World of Ajax The Ajax Code function registerAjaxStuff() { ajaxEngine.registerRequest( 'getWeatherInfo', 'ajax_weather_info' ); ajaxEngine.registerAjaxElement( 'ccInfo' ); ajaxEngine.registerAjaxElement( 'moonInfo' ); ajaxEngine.registerAjaxElement( 'sunInfo' ); ajaxEngine.registerAjaxElement( 'sponsoredLinks' ); $('zip').onkeydown = handleEnterKey.bindAsEventListener($('zip')); } function getWeatherInfo() { $('checkanother').style.visibility='visible'; new Rico.Effect.Position( $('zipinput'), 200, null, 100, 10); new Rico.Effect.FadeTo( 'frontdoor', 0, 100, 10, {complete:function() {$('frontdoor').style.display = 'none';}} ); ajaxEngine.sendRequest( 'getWeatherInfo', "zip=" + $('zip').value); } function resetWeather() { $('zipinput').style.left = '12px'; $('checkanother').style.visibility='hidden'; $('frontdoor').style.display = '' $('zip').focus(); new Rico.Effect.FadeTo( 'frontdoor', .99999, 100, 10, {complete:emptyContents}); } 52
  • 53. The World of Ajax JSON Trip Finder 53 Server XHR
  • 54. The World of Ajax REST Service Request - Yahoo! Trip Planner - JSON 54 http://api.travel.yahoo.com/TripService/V1/tripSearch? appid=PARTNER_KEY&query=alaska&output=json Server XHR Yahoo! Trip Planner exposes its service via an URL that requires a free partner key. Notice output=json.
  • 55. The World of Ajax {"ResultSet":{"firstResultPosition": 1,"totalResultsAvailable":"16","totalResultsReturned": 10,"Result":[ {"id":"351102","YahooID":"jk_95661","Title":"Cruise to Alaska from Vancouver","Summary":"Things to do: Whistler Blackcomb - Hiking,... Hotel: Hyatt Regency Vancouver, Howard Jho...","Destinations":"Vancouver, Anchorage, Juneau, North Vancouver, Ketchikan, Se...","CreateDate":"1130437928","Duration":"16","Image": {"Url":"http://us.i1.yimg.com/us.yimg.com/i/travel/tg/ lp/cd/ 100x100_cde24409e413d4d6da27953f6ab0bbde.jpg","Height":"100", "Width":"66"},"Geocode":{"Latitude":"49.284801","Longitude":" -123.120499","precision":"not available"},"Url":"http:// travel.yahoo.com/trip/?pid=351102&action=view"}, {"id":"400333","YahooID":"brdway_grl","Title":"Alaska","Summa ry":"Things to do: Moose's Tooth Pub and Pizzer... Restaurant: Orso, Simon's & Seafort's Salo...","Destinations":"Anchorage","CreateDate":"1134676973" ,"Duration":"10","Image":{"Url":"http://us.i1.yimg.com/ us.yimg.com/i/travel/tg/poi/ca/ 100x100_ca605c44b47e20a731d3093b94afa37e.jpg","Height":"75"," Width":"100"},"Geocode":{"Latitude":"61.190361","Longitude":" -149.868484","precision":"not available"},"Url":"http:// travel.yahoo.com/trip/?pid=400333&action=view"}, ... ]}} JSON Response 55 89 Server Y! service responds with a JSON text string, valid JavaScript object notation.This is passed directly back as the XHR result XHR
  • 56. The World of Ajax The Ajax/JSON Code 56 <script> function showResponse() { if (xhr.readyState == 4) { if (xhr.status == 200) { var jsontext = xhr.responseText; var helloArea = document.getElementById("helloArea"); var theTrip = eval( '(' + jsontext + ')' ); var tripPlanHTML = ""; for(var i=0; i<theTrip.ResultSet.totalResultsReturned; i++) { var result = theTrip.ResultSet.Result[i]; tripPlanHTML = tripPlanHTML + '<div style="padding:4px; border:1px solid gray;width:'+result.Image.Width+';"><img src="'+result.Image.Url+'" width="'+result.Image.Width+'" height="'+result.Image.Height+'"></img></div>'+ '<div ><a href="'+result.Url+'"><span style="font-weight:bold;font-size: 18px;">'+result.Title+'</span></a></div><div>'+result.Summary+'</div><br/>'; } helloArea.innerHTML=tripPlanHTML; } else { alert('There was a problem with the request.'); } } } </script> <h2>Find Trip Plans (using Ajax &amp; JSON)</h2> <p>Search for Trip Plans</p> <input id="searchCriteria" type="text"> <input value="Search" type="button" onclick="makeRequest('response_trip_planner_mult_json.jsp', document.getElementById('searchCriteria').value)"> <div style="height:300px;width:420px;margin-top:8px;padding:8px;" id="helloArea"></div>
  • 57. Bill W. Scott, Y! Ajax Evangelist [email protected] Ajax Toolkits Designing and Building Ajax Applications with Ajax Toolkits
  • 58. The World of Ajax What a Toolkit Provides 58
  • 59. The World of Ajax Evaluating Toolkits • What language is it targeted for? • Are you looking for XHR abstraction or high level? • Will you use XML or JSON? • Is it $$ or open source? • Does it simplify general JS development? • Community of support? • Likelihood it will be around next year? 59
  • 60. The World of Ajax Ajax Toolkits: Open Source JavaScript Libraries 60 Prototype Inspired by Ruby, simplifies DOM manipulation, events,Ajax connectivity. Several frameworks based on it. Notable for the $() function among many other shortcuts. OO extends. Scriptaculous Built on Prototype, nice effects, animations, drag and drop, widgets. Nicely documented Rico Built on Prototype, nice effects, animations, behaviours (widgets), drag and drop, nice Ajax engine abstraction, style effects. Lots of demos. Behaviour Built on Prototype, separates event management from HTML using CSS selectors Dojo Widget library, drag and drop, effects, widget framework, event management, animation, bookmarkability, manipulating location history, extensive deployment support Zimbra Extensive set of widgets (data list, wizard, button, rich text editor, tree, menus, etc.). MVC, debugging facilities Microsoft Atlas In developer release. Support for drag and drop, animation, full XML specification for wiring widgets together, behavior abstraction, will be integrated in full suite of MS dev tools. MochiKit Widgets, painless DOM manipulation, task management, JSON-like notation, logging.Active community Sarissa Encapsulates XML functionality in browser-independent calls
  • 61. The World of Ajax Ajax Toolkit: Commercial JavaScript Libraries 61 TIBCO GI Very extensive framework with full IDE. Dozens of widgets, vector based charting package, support for SOAP. IDE has WYSIWYG GUI layout, step through debugging as well as code completion Bindows Been around since 2001, lots of great widgets and library routines. Not always browser independent JackBe Focused at corporate environments.Able to emulate a desktop application.Very fast performance even on a dial-up line. Uses a proprietary “screen” format that gets interpreted by a JavaScript runtime engine. Active Widgets Rich set of JavaScript widgets. Rich grid widget is a high spot.
  • 62. The World of Ajax Ajax Toolkit: PHP 62 AjaxAC Separates events from HTML, subrequest support, event management, easily remotes to PHP methods, start of a widget framework Cajax Low level. Simplifies server side programming, limits client side JS required, suggest widget, plug- in for form submission. CakePHP OO, modeled after Ruby on Rails, integrated CRUD, fast, flexible templating, nice docs CPAINT OO library for Ajax connectivity. Local & remote functions, single or multiple XHR, supports both POST & GET JPSpan PHP remoting via JavaScript XAjax Low level. PHP remoting via JavaScript. Simplified DOM updates on XHR response. XOAD Uses JSON and native PHP serialized objects, security emphasis, server side events, HTML manipulation.Tutorials and documentation.
  • 63. The World of Ajax Ajax Toolkit: Java Frameworks 63 Ajax JavaServer Faces Framework Converts JSF applications to Ajax Ajax JSPTag Library Set of tags for Ajax.Autocomplete, callout, select, toggle, update fields DWR For remoting Java methods from JavaScript code. Contains a number of widgets. Echo2 Auto generate HTML & JavaScript from server side.Write in pure Java. Guise ($$) Application framework that uses the desktop UI approach to components and events (hides HTML generation and DOM manipulation.) Controls, dialogs, flyovers, JSP ControlsTag Library For portlet style JSP components. Supports Ajax and non-Ajax modes SWATO JS library based on Prototype. Uses JSON for marshalling. Direct remoting for POJOs.Widgets include auto suggest, template, logger. AjaxAnywhere Turns existing JSP/JSF/Struts/Spring components into Ajax Aware components WebOrb for Java Ties together Ajax, Flash and Java objects with XML services
  • 64. The World of Ajax Prototype • $() • $F() • Try.these() • Ajax.request() • Ajax.Updater() • Element.show/hide/toggle/remove • Object-oriented extensions 64 function makeRequest(url) { var xhr = new Ajax.Request(url, {method:'get', onComplete: showResponse}); } function showResponse(xhr) { $('helloArea').innerHTML = xhr.responseText; }
  • 65. The World of Ajax Prototype Hello World • Makes Ajax request/response simple • Rico allows multiple targets in the response 65 function makeRequest(url) { var xhr = new Ajax.Request(url, { method:'get', onComplete: showResponse }); } function showResponse(xhr) { $('helloArea').innerHTML = xhr.responseText; }
  • 66. The World of Ajax Dojo 66 Dojo Widget Toolkit xml.parse.* widget.Widget.* widget.manager widget.HtmlWidget Application Support Libraries rpc.* dnd.* io.* dnd.* storage.* fx.* logging..* Environment Specific Libraries dom.* html.* style.* svg.* Language Libraries string.* lang.* event.* json.* Package System • Events: multiple listeners, browser abstraction, memory leak protection • Aspect-oriented • I/O: common interface for multiple transports, single/ multi response • Built-in packaging system • Widget building w/HTML & CSS fragments, automatic reuse
  • 67. The World of Ajax Microsoft Atlas Features • Extensible core adds lifetime mgmt, inheritance, multicast event handler, and interfaces • Base class library: strings, timers, tasks • UI framework for attaching behaviors to HTML • Simple connectivity • Set of rich UI controls (auto complete, popup panels, animation, and drag and drop • Browser compatibility layer 67
  • 68. The World of Ajax Microsoft Atlas: Interesting Concepts • Update panels: mark region for auto update • Behaviors: encapsulate actions to associate with DHTML events [floating, hover, popup, autocomplete] • Validators [required, type, range, regex, etc.] • Data binding: connect controls & manage flow between them [data entered, reflected elsewhere] • Bindings transformers: support transform event as part of a binding [ToString, invert, etc.] 68
  • 69. The World of Ajax Microsoft Atlas • Two models: XML scripting & JS API • Will be fully supported by Microsoft tools • Big Q? Tied to ASP.NET? • Language on the site is confusing • Similar to how XHR got lost! • But I have been assured they intend the Atlas Client Scripting Framework to be totally independent of Microsoft technologies (although they want you to use them!) 69
  • 70. Bill W. Scott, Y! Ajax Evangelist [email protected] Advanced Topics Problems and Challenges with Building Ajax Applications
  • 71. The World of Ajax How Ajax Changes Things 71 Classic Web Ajax/Web 2.0 Problems/Challenges Page to page navigation Micro content Back button, SEO, bookmarking, accessibility, security URL/Link = User’s location Application state Back button, SEO, bookmarking, accessibility Browser history Application history Back button, bookmarking, accessibility Back button = Undo Is unpredictable Back button, bookmarking, accessibility Little JavaScript More JavaScript Accessibility, degradability, security, memory, performance, debug, obsfucation, error handling Document model Application model Back button, SEO, bookmarking, accessibility Static content Dynamic content SEO, bookmarking, accessibility Course-grained events Micro states Back button Synchronous Asynchronous Error handling Browser chrome Application controls Back button, bookmarking, accessibility Page Services Web Services Security, XML vs. JSON
  • 72. The World of Ajax Back Button • Problem: Ajax application state changes, URL does not. No browser history of state changes/navigation • What does the user expect? • Often confused with Undo • True context view changes should be part of history • Navigation tabs; but not content tabs? • Steps in a process • Tree selection when views change • Impact of tabbed browsers? 72
  • 73. The World of Ajax Back Button Solution: Fragment Identifier • URL hash, fragment identifier (http://a.com#loc does not trigger a page reload • Fragment identifier (string after ‘#’) can be used to record state changes in the URL 73
  • 74. The World of Ajax Back Button: Fragment Identifier • Yahoo! Maps Beta also uses this technique • Bottom line: tricky to implement • Dojo, Backbase provide direct support • One approach: http:/ /www.contentwithstyle.co.uk/Articles/38/fixing-the-back- button-and-enabling-bookmarking-for-ajax-apps • All links have fragment • Clicking link changes URL, not page • Timer monitors window.location.href & updates 74
  • 75. The World of Ajax Back Button: iframe Approach • Technique: use iframes to control browser history for recording state changes • Tricky issues abound • Fragile across browsers • onload issues • audible transition (on IE if sound enabled) • Bottom line: problematic 75
  • 76. The World of Ajax Search Engine Optimization (Deep Linking) • All the content may not be statically available for search engine crawlers • Won’t find content to index your pages correctly • Possible solutions • Lightweight Indexing: leverage existing tags such as meta, title and h1 • Extra Links: extra links are placed on the site. • Secondary Site: a secondary site is fully accessible to the search engine. (See degraded experience) 76 source: backbase.com
  • 77. The World of Ajax Bookmarking • Since we have broken the history and URL paradigm, bookmarking become problematic • What does the user expect? • Do they expect to bookmark application state? content viewed? • Desktop apps often support bookmarking. It is always content based. 77
  • 78. The World of Ajax Bookmarking Technique • Allow the user to save a bookmark at an interesting moment in an Ajax application • Perhaps dynamically generate a link for bookmarking • The URL generated for the bookmark is sufficient to restore the state 78
  • 79. The World of Ajax Bookmarking in Google Maps • Google Maps • Link is generated on each new map address • Link contains URL parameters to return to the page 79
  • 80. The World of Ajax Another Bookmarking Example • OpenRico LiveGrid http://richardcowin.typepad.com/blog/2005/07/there_has_been_.html 80 http://openrico.org/rico/livegrid.page? data_grid_index=60&data_grid_sort_col=rating&data_grid_sort_dir=ASC
  • 81. The World of Ajax Accessibility 81 DHTML Provides Accessibility Expects Problem JavaScript enabled markup, new user interface controls Simple markup Markup has more meaning than expected. How does the assistive technology understand this is a tree control? How does it understand the state of a control? Dynamic pages & content Fairly static pages How do I announce dynamic content? Weak support for keyboard navigation Keyboard navigation Sight-impaired users will not be using rich interactions; they will use the keyboard (or another device that simulates the keyboard) But how to tab key, arrow key, select items with the keyboard?
  • 82. The World of Ajax Addressing Accessibility in Ajax Applications • IBM/Mozilla Accessible DHTML API/Spec • Direct support for keyboard traversal • Supports tab key to a container, arrow keys to navigate inside the container and enter key to select item • Setting tabindex=-1 allows focus to be set on a object without it being in the tab order • A way to add metadata to HTML markup for assistive technologies to understand: • Widget roles, properties, values and events • Working with assistive technology vendors to make them aware of this API (funded development) • Microsoft’s plans 82
  • 83. The World of Ajax Accessibility: Setting tabindex 83 tabindex value Purpose Tab key navigable? Not set Accept default behavior Default behavior Form elements tabindex = “-1” For child elements (nodes in a tree) No. You must set the focus with JavaScript tabindex = “0” To tab in HTML code order Tabbing moves you field to field in the order they are added to the page tabindex > “0” To specify an exact order for each field Value describes the tab order
  • 84. The World of Ajax Accessibility: Example of Markup for Role & Property • Roles <span tabindex="0" xhtml2:role="wairole:checkbox" property:checked="true" onkeydown="return checkBoxEvent(event);" onclick="return checkBoxEvent(event);"> Any checkbox label </span> • Provides clues to assistive technologies 84
  • 85. The World of Ajax Degradability • Degradability - Managing the user experience as you move down in device/browser capability • At Yahoo! we grade the browser by experience we will provide (A, B, C grade) • A-grade experience (majority of our users; greatest visual fidelity and richest interactions • B-grade experience (almost A-grade, but either they are on bleeding edge, low adoption or low economic value). Not considered in development or testing • C-grade experience (baseline of support; content but little style or interaction). Crawlers and old browsers get this experience. 85
  • 86. The World of Ajax Degradability: Some Solutions • Pre-emptive nag bar • Semantic Markup • What’s good for accessibility is good for degradability • Design Issues • What is the experience for C-grade browsers? • What is the experience for non-browsers? 86
  • 87. The World of Ajax Web Services • Web 2.0 - Web as a Platform. Lots of web services! • Yahoo! Services • del.icio.us, Financ, Flick, HotJob, Maps, Merchant Solutions, Music, RSS Feeds, Search, Search Marketing, Shopping, Travel, Traffic, upcoming.org, weather, webjay, widgets • Google Services • maps, search, desktop, sitemaps, adwords 87
  • 88. The World of Ajax Web Services Example 88 Server XHR http://api.travel.yahoo.com/TripService/V1/tripSearch? appid=PARTNER_KEY&query=alaska&output=json Yahoo! Trip Planner exposes its service via an URL
  • 89. The World of Ajax Web Services, Some Choices: XML vs JSON • JSON means • Trivial parsing • Faster than XML • Friendlier for developer • Runs everywhere • It’s JavaScript, simpler programming model • Very stable... never will change! • Strong community, wide acceptance • Yahoo! behind it 89
  • 90. The World of Ajax Security: Same Site Rule • The domain of the URL request destination must be same as one that serves up page containing script • Why? XHR requests to a different site would carry cookies. Cookies would spoof authentication. • Solutions • Proxies • <script> hack • Other remote scripting tricks • JSONRequest (coming) 90
  • 91. The World of Ajax Security: JSONRequest • I want to access multiple services (from different domains) without setting up a separate server (scalable, simpler to implement) • Solution: Protocol that POSTs JSON text, gets response, parses the response into JavaScript value • No cookies sent • No other file formats accepted. Must be valid JS • JSON is safe JavaScript (data not functions) • Little or no error information provided to a miscreant • Accumulates random delays before trying again to frustrate denial of service attacks • Can support duplex! 91
  • 92. The World of Ajax Memory Management • Hey, Internet Explorer is leaky! • Its memory garbage collector is the culprit • Uses reference counting; JS uses Mark & Sweep • Often closures are blamed • Common problem that causes memory leaks • DOM <--> Application object reference each other • Event handlers left hanging around • Tool for IE: Drip 92
  • 93. The World of Ajax JavaScript Performance • JavaScript requires common sense • Cache repeatedly accessed objects • Always use var for local variables • Use numbers for number and strings for strings • Avoid using eval() for accessing properties eval(“obj.”+propName) --> obj[propName] • Look to your loops • And a few surprises • Build DOM trees downward • Use array.join for lengthy string concatenations 93 source: Adam Platti
  • 94. The World of Ajax Debugging Tools • Microsoft Script Editor • Instant Source (IE Plugin) • IE Dev Toolbar • Venkman (Mozilla) • DOM Inspector (Mozilla) • Web Developer Tools (Mozilla) • Safari JavaScript Console • JSLint 94
  • 95. The World of Ajax Debugging: Venkman 95 • Breakpoints • Local variables • Watches • Call Stack • Profiling • Source view • Debug toolbar
  • 96. The World of Ajax Debugging Prevention: JSLint • Lint are syntax checkers and validators • JavaScript needs lint • http:/ /www.crockford.com/jslint/lint.html • Scans source file & looks for common syntax problems • Nice way to catch silly mistakes • Try it at: http:/ /jslint.com 96
  • 97. The World of Ajax Obsfucation or Minification • JavaScript is easy to see with a Save or a <ctrl>-U • JavaScript can increase page size & page load • Obsfucators mangle the code into unreadable form • Minifiers strip white space & comments • Obsfucators go too far • Makes development way too hard • Minification & compression do just enough • JSMin (http:/ /www.crockford.com/javascript/jsmin.html) 97
  • 98. The World of Ajax Error Handling • Asynchronous error handling • Keep design simple (do you need multiple requests going at once?) • Will increase implementation issues • Normal error handling • Check for error codes (!=200) • Roll your own HTTP status error codes • Minimize server-side errors with intentional validation (error prevention) 98
  • 99. The World of Ajax Error Handling • Difficult to correct XML, JSON or even HTML over the wire. XML & JSON are slightly harder. Server issue, but how to handle • Use error handlers provided by Ajax frameworks • Prototype try.these • JavaScript try/catch • DWR has global error handler • Dojo error handlers 99
  • 100. The World of Ajax 100 Questions?