Cover image for Ajax Design Patterns

Book description

Ajax, or Asynchronous JavaScript and XML, exploded onto the scene in the spring of 2005 and remains the hottest story among web developers. With its rich combination of technologies, Ajax provides a strong foundation for creating interactive web applications with XML or JSON-based web services by using JavaScript in the browser to process the web server response.

Ajax Design Patterns shows you best practices that can dramatically improve your web development projects. It investigates how others have successfully dealt with conflicting design principles in the past and then relays that information directly to you.

The patterns outlined in the book fall into four categories:

  • Foundational technology: Examines the raw technologies required for Ajax development

  • Programming: Exposes techniques that developers have discovered to ensure their Ajax applications are maintainable

  • Functionality and usability: Describes the types of user interfaces you'll come across in Ajax applications, as well as the new types of functionality that Ajax makes possible

  • Development: Explains the process being used to monitor, debug, and test Ajax applications

Ajax Design Patterns will also get you up to speed with core Ajax technologies, such as XMLHttpRequest, the DOM, and JSON. Technical discussions are followed by code examples so you can see for yourself just what is-and isn't-possible with Ajax. This handy reference will help you to produce high-quality Ajax architectures, streamline web application performance, and improve the user experience.

Michael Mahemoff holds a PhD in Computer Science and Software Engineering from the University of Melbourne, where his thesis was "Design Reuse in Software Engineering and Human-Computer Interaction." He lives in London and consults on software development issues in banking, health care, and logistics.

"Michael Mahemoff's Ajax Design Patterns is a truly comprehensive compendium of web application design expertise, centred around but not limited to Ajax techniques. Polished nuggets of design wisdom are supported by tutorials and real-world code examples resulting in a book that serves not only as an intermediate to expert handbook but also as an extensive reference for building rich interactive web applications." --Brent Ashley, remote scripting pioneer

Table of Contents

  1. Special Upgrade Offer
  2. A Note Regarding Supplemental Files
  3. Preface
    1. Who Should Read This Book?
    2. Who Should Not Read This Book?
    3. About the Examples
    4. Browser Specifics
    5. Organization of This Book
    6. Conventions Used in This Book
    7. Conventions in Code Examples
    8. Safari® Enabled
    9. How to Contact Us
    10. Acknowledgments
  4. I. Introduction
    1. 1. Introducing Ajax
      1. 1.1. Ajax and the Usable Web
      2. 1.2. The Rise of Ajax
      3. 1.3. Ajaxifying the Web: The Story of Portals
      4. 1.4. Webifying the Desktop: The Story of Office Applications
      5. 1.5. Characteristics of Ajax Applications
        1. 1.5.1. Applications, Not Just Web Sites
        2. 1.5.2. Smooth, Continuous Interaction
        3. 1.5.3. Live
        4. 1.5.4. Supportive
        5. 1.5.5. Visual Effects
        6. 1.5.6. New Widgets
        7. 1.5.7. New Styles of Interaction
        8. 1.5.8. Standards-Based
      6. 1.6. The Ajax Technologies
      7. 1.7. Anatomy of a Server Call
      8. 1.8. Ajax Trends
        1. 1.8.1. Standards and Fragmentation
        2. 1.8.2. Browser Adoption
        3. 1.8.3. User Acceptance
        4. 1.8.4. The Desktop
        5. 1.8.5. Flash
        6. 1.8.6. Rich Graphics
        7. 1.8.7. The Two-Way Web
        8. 1.8.8. Local Storage
        9. 1.8.9. XForms
        10. 1.8.10. JavaScript
        11. 1.8.11. Development Support
        12. 1.8.12. Hardware and Bandwidth Improvements
      9. 1.9. Conclusions
    2. 2. A Pattern-Led Tutorial
      1. 2.1. Ajax Technologies in a Blink
        1. 2.1.1. Preparing the Demos
        2. 2.1.2. Display Manipulation and the DOM in a Blink
          1. 2.1.2.1. Hello World!
          2. 2.1.2.2. $( ) Convenience function
          3. 2.1.2.3. Adding a link
        3. 2.1.3. Web Remoting in a Blink
        4. 2.1.4. Dynamic Behavior in a Blink
      2. 2.2. Ajaxifying a Web App: One Pattern at a Time
        1. 2.2.1. Background: Old-School Ajaxagram
        2. 2.2.2. Step 1: Ajaxagram Done Ajax-Style
          1. 2.2.2.1. Business logic: the anagram web service
          2. 2.2.2.2. Presentation: initial HTML
          3. 2.2.2.3. Application logic: JavaScript
        3. 2.2.3. Step 2: Enhancing Functionality and Usability
          1. 2.2.3.1. Live Search
          2. 2.2.3.2. Progress Indicator
          3. 2.2.3.3. One-Second Spotlight (Yellow Fade Technique)
        4. 2.2.4. Step 3: Refactoring for Performance
        5. 2.2.5. Step 4: Refactoring to an External Library
        6. 2.2.6. Refactoring Exercises
          1. 2.2.6.1. Foundational technology patterns
          2. 2.2.6.2. Programming patterns
          3. 2.2.6.3. Functionality and Usability patterns
          4. 2.2.6.4. Development patterns
      3. 2.3. Projects and Katas
      4. 2.4. Conclusions
    3. 3. Ajax Design: Principles and Patterns
      1. 3.1. Desirable Attributes of Ajax Applications
      2. 3.2. Designing for Ajax
        1. 3.2.1. Usability Principles
        2. 3.2.2. Software Design Principles
      3. 3.3. Ajax Patterns Overview
      4. 3.4. Anatomy of a Pattern
      5. 3.5. Ajax Patterns Demos
      6. 3.6. Conclusions
  5. II. Foundational Technology Patterns
    1. 4. Ajax App
      1. 4.1. Ajax App
        1. 4.1.1. Goal Story
        2. 4.1.2. Problem
        3. 4.1.3. Forces
        4. 4.1.4. Solution
        5. 4.1.5. Decisions
          1. 4.1.5.1. Will your application be “Ajax Deluxe” or “Ajax Lite”?
          2. 4.1.5.2. What browser requirements will there be to run your Ajax App?
          3. 4.1.5.3. How will you treat browsers with insufficient technologies for Ajax?
          4. 4.1.5.4. How much processing power will be required of the browser?
          5. 4.1.5.5. How much networking capacity will be required?
        6. 4.1.6. Real-World Examples
        7. 4.1.7. Code Example
        8. 4.1.8. Alternatives
          1. 4.1.8.1. Conventional web app
          2. 4.1.8.2. Flash app
          3. 4.1.8.3. Java applets
          4. 4.1.8.4. Desktop app
          5. 4.1.8.5. Mobile app
        9. 4.1.9. Related Patterns
    2. 5. Display Manipulation
      1. 5.1. Display Morphing
        1. 5.1.1. Goal Story
        2. 5.1.2. Problem
        3. 5.1.3. Forces
        4. 5.1.4. Solution
        5. 5.1.5. Decisions
          1. 5.1.5.1. Will you alter the display via classname or style?
          2. 5.1.5.2. What sort of properties will be used?
        6. 5.1.6. Real-World Examples
          1. 5.1.6.1. Ajax-S
          2. 5.1.6.2. Digg Spy
          3. 5.1.6.3. Ajax Spell Checker
        7. 5.1.7. Code Example: AjaxPatterns Countdown Demo
        8. 5.1.8. Related Patterns
          1. 5.1.8.1. Page Rearrangement
        9. 5.1.9. Metaphor
        10. 5.1.10. Want To Know More?
      2. 5.2. Page Rearrangement
        1. 5.2.1. Goal Story
        2. 5.2.2. Problem
        3. 5.2.3. Forces
        4. 5.2.4. Solution
        5. 5.2.5. Decisions
          1. 5.2.5.1. Which positioning style to use?
          2. 5.2.5.2. How will you protect against memory leaks?
        6. 5.2.6. Real-World Examples
          1. 5.2.6.1. TadaList
          2. 5.2.6.2. Super Maryo World
          3. 5.2.6.3. Kiko
        7. 5.2.7. Code Example: AjaxPatterns Basic Wiki
        8. 5.2.8. Related Patterns
          1. 5.2.8.1. Display Morphing
        9. 5.2.9. Metaphor
    3. 6. Web Remoting
      1. 6.1. Web Service
        1. 6.1.1. Goal Story
        2. 6.1.2. Problem
        3. 6.1.3. Forces
        4. 6.1.4. Solution
        5. 6.1.5. Decisions
          1. 6.1.5.1. How will the web service be used?
          2. 6.1.5.2. How will you prevent third-party usage?
        6. 6.1.6. Real-World Examples
          1. 6.1.6.1. Technorati API
          2. 6.1.6.2. NetVibes
          3. 6.1.6.3. Wish-O-Matic
        7. 6.1.7. Code Example: AjaxPatterns testAjaxCaller
        8. 6.1.8. Related Patterns
          1. 6.1.8.1. Web Services patterns
          2. 6.1.8.2. Web Remoting patterns
          3. 6.1.8.3. Cross-Domain Proxy
          4. 6.1.8.4. Simulation Service
          5. 6.1.8.5. Service Test
      2. 6.2. XMLHttpRequest Call
        1. 6.2.1. Goal Story
        2. 6.2.2. Problem
        3. 6.2.3. Forces
        4. 6.2.4. Solution
          1. 6.2.4.1. Creating XMLHttpRequest objects
          2. 6.2.4.2. Asynchronous calls
          3. 6.2.4.3. Detecting errors
          4. 6.2.4.4. Handling POSTs and other request types
          5. 6.2.4.5. Constraints on external domains
          6. 6.2.4.6. XML responses
          7. 6.2.4.7. The XMLHttpRequest API: a summary
        5. 6.2.5. Decisions
          1. 6.2.5.1. What kind of content will web services provide?
          2. 6.2.5.2. How will caching be controlled?
          3. 6.2.5.3. How will you deal with errors?
        6. 6.2.6. Real-World Examples
          1. 6.2.6.1. Lace Chat
          2. 6.2.6.2. Backbase
          3. 6.2.6.3. Anyterm
          4. 6.2.6.4. Mint
        7. 6.2.7. Code Example: AjaxPatterns TestAjaxCaller
        8. 6.2.8. Alternatives
          1. 6.2.8.1. Page refreshes
          2. 6.2.8.2. IFrame Call
          3. 6.2.8.3. HTTP Streaming
          4. 6.2.8.4. Richer Plugin
          5. 6.2.8.5. On-Demand JavaScript
          6. 6.2.8.6. Image-Cookie Call
          7. 6.2.8.7. Stylesheet Call
          8. 6.2.8.8. 204 Response
          9. 6.2.8.9. Import XML Document
        9. 6.2.9. Metaphor
      3. 6.3. IFrame Call
        1. 6.3.1. Goal Story
        2. 6.3.2. Problem
        3. 6.3.3. Forces
        4. 6.3.4. Solution
        5. 6.3.5. Real-World Examples
          1. 6.3.5.1. Google Maps
          2. 6.3.5.2. Scoop framework, Kuro5hin
          3. 6.3.5.3. PXL8 Demo
          4. 6.3.5.4. HTMLHttpRequest Library
        6. 6.3.6. Code Refactoring: AjaxPatterns Sum Demo
        7. 6.3.7. Alternatives
          1. 6.3.7.1. XMLHttpRequest Call
          2. 6.3.7.2. Frame Call
        8. 6.3.8. Metaphor
      4. 6.4. HTTP Streaming
        1. 6.4.1. Goal Story
        2. 6.4.2. Problem
        3. 6.4.3. Forces
        4. 6.4.4. Solution
        5. 6.4.5. Decisions
          1. 6.4.5.1. How long will you keep the connection open?
          2. 6.4.5.2. How will you decide when to close the connection?
          3. 6.4.5.3. How will the browser distinguish between messages?
        6. 6.4.6. Real-World Examples
          1. 6.4.6.1. LivePage
          2. 6.4.6.2. Jotspot Live
          3. 6.4.6.3. Realtime on Rails
          4. 6.4.6.4. Lightstreamer engine
          5. 6.4.6.5. Pushlets framework
        7. 6.4.7. Code Refactoring: AjaxPatterns Streaming Wiki
        8. 6.4.8. Alternatives
          1. 6.4.8.1. Periodic Refresh
          2. 6.4.8.2. TCP connection
        9. 6.4.9. Related Patterns
          1. 6.4.9.1. Distributed Events
        10. 6.4.10. Metaphor
        11. 6.4.11. Want To Know More?
        12. 6.4.12. Acknowledgments
      5. 6.5. On-Demand JavaScript
        1. 6.5.1. Goal Story
        2. 6.5.2. Problem
        3. 6.5.3. Forces
        4. 6.5.4. Solution
        5. 6.5.5. Decisions
          1. 6.5.5.1. Will you use Service Eval or Script Tag Creation?
          2. 6.5.5.2. With Lazy Loading, how will you break modules down?
          3. 6.5.5.3. With Lazy Loading, at what stage will the script download the JavaScript?
        6. 6.5.6. Real-World Examples
          1. 6.5.6.1. MapBuilder
          2. 6.5.6.2. Delicious/Yahoo! APIs
          3. 6.5.6.3. Dojo packaging framework
          4. 6.5.6.4. JSAN import system
        7. 6.5.7. Code Example, AjaxPatterns On-Demand JavaScript Wiki
          1. 6.5.7.1. Introducing On-Demand JavaScript to the Wiki Demo
          2. 6.5.7.2. Separate JavaScript: Extracting upload.js
          3. 6.5.7.3. Script Tag Creation On-Demand JavaScript
          4. 6.5.7.4. Service Eval On-Demand JavaScript
        8. 6.5.8. Related Patterns
          1. 6.5.8.1. HTML Message
          2. 6.5.8.2. Predictive Fetch
          3. 6.5.8.3. Multi-Stage Download
        9. 6.5.9. Want to Know More?
    4. 7. Dynamic Behavior
      1. 7.1. User Action
        1. 7.1.1. Goal Story
        2. 7.1.2. Problem
        3. 7.1.3. Forces
        4. 7.1.4. Solution
        5. 7.1.5. Decisions
          1. 7.1.5.1. What events will the script listen for?
          2. 7.1.5.2. What attributes of the event will be inspected?
          3. 7.1.5.3. Will event handlers be registered after the page has loaded?
        6. 7.1.6. Real-World Examples
          1. 7.1.6.1. Google Reader
          2. 7.1.6.2. Google Maps
          3. 7.1.6.3. Backpack
        7. 7.1.7. Code Example: Basic AjaxPatterns Demos
        8. 7.1.8. Alternatives
          1. 7.1.8.1. “Click ‘n’ Wait”
          2. 7.1.8.2. Richer forms
        9. 7.1.9. Related Patterns
          1. 7.1.9.1. Display Morphing, Page Rearrangement
          2. 7.1.9.2. XMLHttpRequest Call, IFrame Call
      2. 7.2. Scheduling
        1. 7.2.1. Goal Story
        2. 7.2.2. Problem
        3. 7.2.3. Forces
        4. 7.2.4. Solution
        5. 7.2.5. Real-World Examples
          1. 7.2.5.1. Claude Hussenet’s Portal
          2. 7.2.5.2. Google Suggest
          3. 7.2.5.3. Apple iTunes counter
          4. 7.2.5.4. Backpack
        6. 7.2.6. Code Example: AjaxPatterns Basic Wiki
        7. 7.2.7. Alternatives
          1. 7.2.7.1. HTTP Meta Refresh
        8. 7.2.8. Metaphor
    5. 8. Extended Technologies
      1. 8.1. Richer Plugin
        1. 8.1.1. Goal Story
        2. 8.1.2. Problem
        3. 8.1.3. Forces
        4. 8.1.4. Solution
        5. 8.1.5. Decisions
          1. 8.1.5.1. Will you reuse a third-party plugin or develop your own?
          2. 8.1.5.2. What will happen if the plugin’s not installed?
        6. 8.1.6. Real-World Examples
          1. 8.1.6.1. Amazon Mini Shop
          2. 8.1.6.2. Google Toolbar and Google Suggest for Firefox
          3. 8.1.6.3. Odeo
          4. 8.1.6.4. TiddlyWiki
        7. 8.1.7. Code Example: Amazon Mini Shop
        8. 8.1.8. Alternatives
          1. 8.1.8.1. Desktop Client
        9. 8.1.9. Related Patterns
          1. 8.1.9.1. Fat Client
          2. 8.1.9.2. Single Page Application
          3. 8.1.9.3. Bookmarklet
          4. 8.1.9.4. Browser-Side Cache
        10. 8.1.10. Metaphor
        11. 8.1.11. Want to Know More?
  6. III. Programming Patterns
    1. 9. Web Services
      1. 9.1. RESTful Service
        1. 9.1.1. Developer Story
        2. 9.1.2. Problem
        3. 9.1.3. Forces
        4. 9.1.4. Solution
          1. 9.1.4.1. Motivating REST: many ways to skin a call
          2. 9.1.4.2. Introduction to RESTful principles
        5. 9.1.5. RESTful principles
          1. 9.1.5.1. URLs reflect resources
          2. 9.1.5.2. HTTP methods reflect actions
          3. 9.1.5.3. GET for queries, and only for queries
          4. 9.1.5.4. Services should be stateless
          5. 9.1.5.5. Services should be idempotent
          6. 9.1.5.6. Services use hyperlinks
          7. 9.1.5.7. Services documents themselves
          8. 9.1.5.8. Services constrain data formats
          9. 9.1.5.9. Handling arbitrary transactions
          10. 9.1.5.10. Weighing Up REST
        6. 9.1.6. Real-World Examples
          1. 9.1.6.1. Blogger API
        7. 9.1.7. Code Example: AjaxPatterns RESTful Shop Demo
          1. 9.1.7.1. Reading categories list
          2. 9.1.7.2. Reading an individual category
          3. 9.1.7.3. Reading cart contents
          4. 9.1.7.4. Changing cart contents
        8. 9.1.8. Alternatives
          1. 9.1.8.1. RPC Service
        9. 9.1.9. Related Patterns
          1. 9.1.9.1. XML Message
          2. 9.1.9.2. XML Data Island
          3. 9.1.9.3. Unique URLs
        10. 9.1.10. Metaphor
        11. 9.1.11. Want To Know More?
        12. 9.1.12. Acknowledgments
      2. 9.2. RPC Service
        1. 9.2.1. Developer Story
        2. 9.2.2. Problem
        3. 9.2.3. Forces
        4. 9.2.4. Solution
        5. 9.2.5. Real-World Examples
          1. 9.2.5.1. Kiko
          2. 9.2.5.2. Flickr API
        6. 9.2.6. Code Example: AjaxPatterns RPC Shop Demo
          1. 9.2.6.1. Reading the Categories list
          2. 9.2.6.2. Reading an individual category
          3. 9.2.6.3. Reading cart contents
          4. 9.2.6.4. Changing cart contents
        7. 9.2.7. Alternatives
          1. 9.2.7.1. RESTful Service
        8. 9.2.8. Related Patterns
          1. 9.2.8.1. Ajax Stub
          2. 9.2.8.2. Plain-Text Message, XML Message
        9. 9.2.9. Metaphor
      3. 9.3. Ajax Stub
        1. 9.3.1. Developer Story
        2. 9.3.2. Problem
        3. 9.3.3. Forces
        4. 9.3.4. Solution
        5. 9.3.5. Decisions
          1. 9.3.5.1. How will you secure the server-side function?
        6. 9.3.6. Real-World Examples
          1. 9.3.6.1. SAJAX framework
          2. 9.3.6.2. DWR framework
          3. 9.3.6.3. CL-AJAX framework
        7. 9.3.7. Code Refactoring: AjaxPatterns SAJAX Sum
        8. 9.3.8. Alternatives
          1. 9.3.8.1. XMLHttpRequest Call
          2. 9.3.8.2. XML-RPC and SOAP
        9. 9.3.9. Related Patterns
          1. 9.3.9.1. RPC Service
          2. 9.3.9.2. JSON Message
      4. 9.4. HTML Message
        1. 9.4.1. Developer Story
        2. 9.4.2. Problem
        3. 9.4.3. Forces
        4. 9.4.4. Solution
        5. 9.4.5. Decisions
          1. 9.4.5.1. At what level of granularity will the HTML apply?
          2. 9.4.5.2. How much style will be contained in the message?
        6. 9.4.6. Real-World Examples
          1. 9.4.6.1. Digg Spy
          2. 9.4.6.2. Rapha
          3. 9.4.6.3. Amazon Zuggest
          4. 9.4.6.4. TalkDigger
        7. 9.4.7. Code Example: Digg Spy
        8. 9.4.8. Alternatives
          1. 9.4.8.1. Plain-Text Message, XML Message, JSON Message
        9. 9.4.9. Related Patterns
          1. 9.4.9.1. On-Demand JavaScript
        10. 9.4.10. Metaphor
      5. 9.5. Plain-Text Message
        1. 9.5.1. Developer Story
        2. 9.5.2. Problem
        3. 9.5.3. Forces
        4. 9.5.4. Solution
        5. 9.5.5. Real-World Examples
          1. 9.5.5.1. Lace Chat
          2. 9.5.5.2. Magnetic Poetry
          3. 9.5.5.3. HousingMaps
        6. 9.5.6. Code Example: Lace Chat
        7. 9.5.7. Alternatives
          1. 9.5.7.1. XML Message
      6. 9.6. XML Message
        1. 9.6.1. Devloper Story
        2. 9.6.2. Problem
        3. 9.6.3. Forces
        4. 9.6.4. Solution
        5. 9.6.5. Decisions
          1. 9.6.5.1. How will the server generate XML?
          2. 9.6.5.2. Will you specify a DTD or Schema?
          3. 9.6.5.3. When the browser needs to render the message, how it will transform the XML?
        6. 9.6.6. Real-World Examples
          1. 9.6.6.1. Netflix Top 100
          2. 9.6.6.2. Protopage
          3. 9.6.6.3. Google Maps
        7. 9.6.7. Code Refactoring: AjaxPatterns XML Sum
        8. 9.6.8. Alternatives
          1. 9.6.8.1. Plain-Text Message
          2. 9.6.8.2. JSON Message
      7. 9.7. JSON Message
        1. 9.7.1. Developer Story
        2. 9.7.2. Problem
        3. 9.7.3. Forces
        4. 9.7.4. Solution
        5. 9.7.5. Real-World Examples
          1. 9.7.5.1. Kiko
          2. 9.7.5.2. Delicious JSON Feed
          3. 9.7.5.3. Route Planning
          4. 9.7.5.4. Ajax.Net framework
        6. 9.7.6. Code Example: Kiko
        7. 9.7.7. Alternatives
          1. 9.7.7.1. XML Message
        8. 9.7.8. Related Patterns
          1. 9.7.8.1. Ajax Stub
          2. 9.7.8.2. On-Demand JavaScript
    2. 10. Browser-Server Dialogue
      1. 10.1. Call Tracking
        1. 10.1.1. Developer Story
        2. 10.1.2. Problem
        3. 10.1.3. Forces
        4. 10.1.4. Solution
        5. 10.1.5. Real-World Examples
          1. 10.1.5.1. Ajax Client Engine (ACE) library
          2. 10.1.5.2. AjaxCaller library
          3. 10.1.5.3. libXmlRequest library
        6. 10.1.6. Code Example: Ajax Client Engine (ACE)
        7. 10.1.7. Alternatives
          1. 10.1.7.1. Fire-and-forget
          2. 10.1.7.2. Global XMLHttpRequest
        8. 10.1.8. Metaphor
        9. 10.1.9. Acknowledgments
      2. 10.2. Periodic Refresh
        1. 10.2.1. Developer Story
        2. 10.2.2. Problem
        3. 10.2.3. Forces
        4. 10.2.4. Solution
        5. 10.2.5. Decisions
          1. 10.2.5.1. How long will the refresh period be?
        6. 10.2.6. Real-World Examples
          1. 10.2.6.1. Lace Chat
          2. 10.2.6.2. Magnetic Poetry
          3. 10.2.6.3. Claude Hussenet’s portal
        7. 10.2.7. Code Examples
          1. 10.2.7.1. Lace
        8. 10.2.8. Code Refactoring: AjaxPatterns Periodic Time
        9. 10.2.9. Alternatives
          1. 10.2.9.1. HTTP Streaming
        10. 10.2.10. Related Patterns
          1. 10.2.10.1. Distributed Events
          2. 10.2.10.2. Fat Client, Browser-Side Cache, Guesstimate
          3. 10.2.10.3. Submission Throttling
          4. 10.2.10.4. Heartbeat
        11. 10.2.11. Metaphor
      3. 10.3. Submission Throttling
        1. 10.3.1. Developer Story
        2. 10.3.2. Problem
        3. 10.3.3. Forces
        4. 10.3.4. Solution
        5. 10.3.5. Decisions
          1. 10.3.5.1. How will the server deal with incoming commands? Will all commands still be valid?
          2. 10.3.5.2. How will buffer uploads be triggered?
          3. 10.3.5.3. How many buffers per browser application?
          4. 10.3.5.4. How long should the throttle period be?
        6. 10.3.6. Real-World Examples
          1. 10.3.6.1. Google Suggest
          2. 10.3.6.2. Zuggest
          3. 10.3.6.3. Gmail
          4. 10.3.6.4. Prototype framework
        7. 10.3.7. Code Example: AjaxPatterns Assistive Search
        8. 10.3.8. Related Patterns
          1. 10.3.8.1. Periodic Refresh
          2. 10.3.8.2. Progress Indicator
        9. 10.3.9. Metaphor
      4. 10.4. Explicit Submission
        1. 10.4.1. Developer Story
        2. 10.4.2. Problem
        3. 10.4.3. Forces
        4. 10.4.4. Solution
        5. 10.4.5. Decisions
          1. 10.4.5.1. How will the user request the submission?
          2. 10.4.5.2. How will you deal with frequent submissions?
        6. 10.4.6. Real-World Examples
          1. 10.4.6.1. Lace Chat
          2. 10.4.6.2. The Fonz
          3. 10.4.6.3. A9
        7. 10.4.7. Code Refactoring: AjaxPatterns Form-Based Sum
        8. 10.4.8. Alternatives
          1. 10.4.8.1. Submission Throttling
        9. 10.4.9. Related Patterns
          1. 10.4.9.1. Live Form
          2. 10.4.9.2. Progress Indicator
        10. 10.4.10. Metaphor
      5. 10.5. Distributed Events
        1. 10.5.1. Developer Story
        2. 10.5.2. Problem
        3. 10.5.3. Forces
        4. 10.5.4. Solution
        5. 10.5.5. Decisions about Distributed Events
          1. 10.5.5.1. Will you publish a history or just the current state?
          2. 10.5.5.2. For observer-style events, will you propagate the details of what’s changed, or just point to the object that’s changed?
          3. 10.5.5.3. What information will accompany the event notification?
          4. 10.5.5.4. Will events be processed synchronously or asynchronously?
        6. 10.5.6. Real-World Examples
          1. 10.5.6.1. ActiveMQ Servlet Adaptor
          2. 10.5.6.2. MapBuilder
          3. 10.5.6.3. Dojo Events Library
          4. 10.5.6.4. LivePage Library
        7. 10.5.7. Code Refactoring: AjaxPatterns Distributed Events Wiki Demo
          1. 10.5.7.1. Refactoring to an event mechanism
          2. 10.5.7.2. Introducing a watchlist
        8. 10.5.8. Related Patterns
          1. 10.5.8.1. Periodic Refresh, HTTP Streaming
          2. 10.5.8.2. RESTful Service
          3. 10.5.8.3. XML Data Island
        9. 10.5.9. Metaphor
      6. 10.6. Cross-Domain Proxy
        1. 10.6.1. Developer Story
        2. 10.6.2. Problem
        3. 10.6.3. Forces
        4. 10.6.4. Solution
        5. 10.6.5. Decisions
          1. 10.6.5.1. What external content will be accessed?
          2. 10.6.5.2. How will you connect to the external server?
          3. 10.6.5.3. How will you deal with errors and delays in accessing the service?
          4. 10.6.5.4. Under what licensing terms will you access the remote service?
        6. 10.6.6. Real-World Examples
          1. 10.6.6.1. WPLicense
          2. 10.6.6.2. Housing Maps (Craigslist and Google Maps)
          3. 10.6.6.3. Bill Gates Wealth Clock
          4. 10.6.6.4. CPaint library
        7. 10.6.7. Code Example: WPLicense
          1. 10.6.7.1. 1. Retrieving license types
          2. 10.6.7.2. 2. Retrieving license questions
          3. 10.6.7.3. 3. Handling user answers
        8. 10.6.8. Alternatives
          1. 10.6.8.1. On-Demand JavaScript
          2. 10.6.8.2. Shared document.domain
          3. 10.6.8.3. Images
        9. 10.6.9. Related Patterns
          1. 10.6.9.1. Performance Optimization patterns
        10. 10.6.10. Want to Know More?
    3. 11. DOM Population
      1. 11.1. XML Data Island
        1. 11.1.1. Developer Story
        2. 11.1.2. Problem
        3. 11.1.3. Forces
        4. 11.1.4. Solution
        5. 11.1.5. Real-World Examples
          1. 11.1.5.1. PerfectXML Demo
          2. 11.1.5.2. Mozilla.org demo
          3. 11.1.5.3. TechRepublic demo
        6. 11.1.6. Code Refactoring: AjaxPatterns XML Data Island Sum
        7. 11.1.7. Alternatives
          1. 11.1.7.1. Browser-Side XSLT
          2. 11.1.7.2. Browser-Side Templating
          3. 11.1.7.3. Browser-Side Cache
        8. 11.1.8. Metaphor
      2. 11.2. Browser-Side XSLT
        1. 11.2.1. Developer Story
        2. 11.2.2. Problem
        3. 11.2.3. Forces
        4. 11.2.4. Solution
        5. 11.2.5. Decisions
          1. 11.2.5.1. How will you obtain the XSLT stylesheet?
        6. 11.2.6. Real-World Examples
          1. 11.2.6.1. Google Maps
          2. 11.2.6.2. Kupu
          3. 11.2.6.3. AJAX-S
          4. 11.2.6.4. Sarissa framework
        7. 11.2.7. Code Refactoring: AjaxPatterns XSLT Drilldown Demo
        8. 11.2.8. Alternatives
          1. 11.2.8.1. Browser-Side Templating
        9. 11.2.9. Related Patterns
          1. 11.2.9.1. XML Message
          2. 11.2.9.2. XML Data Island
        10. 11.2.10. Metaphor
      3. 11.3. Browser-Side Templating
        1. 11.3.1. Developer Story
        2. 11.3.2. Problem
        3. 11.3.3. Forces
        4. 11.3.4. Solution
        5. 11.3.5. Decisions
          1. 11.3.5.1. How will you obtain the template?
          2. 11.3.5.2. Will the template include any code? How much?
          3. 11.3.5.3. How to prepare the template’s context?
        6. 11.3.6. Real-World Examples
          1. 11.3.6.1. Ajax Pages framework
          2. 11.3.6.2. JavaScript Templates framework
          3. 11.3.6.3. Backbase framework
        7. 11.3.7. Code Refactoring: AjaxPatterns Templating Drilldown Demo
          1. 11.3.7.1. Initial version
          2. 11.3.7.2. Refactored to render from a template
          3. 11.3.7.3. Refactored to improve template context
        8. 11.3.8. Alternatives
          1. 11.3.8.1. Browser-Side XSLT
        9. 11.3.9. Related Patterns
          1. 11.3.9.1. XML Message
          2. 11.3.9.2. JSON Message
        10. 11.3.10. Metaphor
    4. 12. Code Generation and Reuse
      1. 12.1. Server-Side Code Generation
        1. 12.1.1. Developer Story
        2. 12.1.2. Problem
        3. 12.1.3. Forces
        4. 12.1.4. Solution
        5. 12.1.5. Real-World Examples
          1. 12.1.5.1. Echo2
          2. 12.1.5.2. Ruby On Rails framework
          3. 12.1.5.3. Backbase
          4. 12.1.5.4. AjaxTags library
          5. 12.1.5.5. Comfort.ASP library
        6. 12.1.6. Code Example: Echo2 Number Guess
        7. 12.1.7. Alternatives
          1. 12.1.7.1. Browser-Side Templating
        8. 12.1.8. Related Patterns
          1. 12.1.8.1. HTML Message
      2. 12.2. Cross-Browser Component
        1. 12.2.1. Developer Story
        2. 12.2.2. Problem
        3. 12.2.3. Forces
        4. 12.2.4. Solution
        5. 12.2.5. Decisions
          1. 12.2.5.1. What browser-specific criteria is used to create the Cross-Browser Component?
          2. 12.2.5.2. What if a feature isn’t supported by the current browser?
        6. 12.2.6. Real-World Examples
          1. 12.2.6.1. HTMLHttpRequest library
        7. 12.2.7. Code Example: HTMLHttpRequest Library
        8. 12.2.8. Related Patterns
          1. 12.2.8.1. Server-Side Code Generation
          2. 12.2.8.2. On-Demand JavaScript
        9. 12.2.9. Metaphor
        10. 12.2.10. Want to Know More?
    5. 13. Performance Optimization
      1. 13.1. Browser-Side Cache
        1. 13.1.1. Developer Story
        2. 13.1.2. Problem
        3. 13.1.3. Forces
        4. 13.1.4. Solution
        5. 13.1.5. Decisions
          1. 13.1.5.1. What will be stored as keys? For values?
          2. 13.1.5.2. How will cache size be kept under control?
          3. 13.1.5.3. How will you protect against stale data?
        6. 13.1.6. Real-World Examples
          1. 13.1.6.1. libXmlRequest library
        7. 13.1.7. Code Example: Cached Sum Demo
          1. 13.1.7.1. Including the query in the response
          2. 13.1.7.2. An infinite cache
          3. 13.1.7.3. A finite cache
        8. 13.1.8. Alternatives
          1. 13.1.8.1. Built-in browser cache
          2. 13.1.8.2. Server-side cache
        9. 13.1.9. Related Patterns
          1. 13.1.9.1. Submission Throttling
      2. 13.2. Predictive Fetch
        1. 13.2.1. Developer Story
        2. 13.2.2. Problem
        3. 13.2.3. Forces
        4. 13.2.4. Solution
        5. 13.2.5. Decisions
          1. 13.2.5.1. How much information will be pre-fetched?
          2. 13.2.5.2. Will it be the server or the browser that anticipates user actions?
          3. 13.2.5.3. What information can be used to anticipate user actions?
        6. 13.2.6. Real-World Examples
          1. 13.2.6.1. Google Maps
          2. 13.2.6.2. map.search.ch
          3. 13.2.6.3. Firefox “Prefetch”
          4. 13.2.6.4. International Herald Tribune
        7. 13.2.7. Code Refactoring: AjaxPatterns Predictive Fetch Sum
        8. 13.2.8. Alternatives
          1. 13.2.8.1. Fat Client
          2. 13.2.8.2. Server priming
        9. 13.2.9. Related Patterns
          1. 13.2.9.1. Guesstimate
          2. 13.2.9.2. Browser-Side Cache
        10. 13.2.10. Metaphor
      3. 13.3. Guesstimate
        1. 13.3.1. Developer Story
        2. 13.3.2. Problem
        3. 13.3.3. Forces
        4. 13.3.4. Solution
        5. 13.3.5. Decisions
          1. 13.3.5.1. How often will real data be fetched? How often will Guesstimates be made?
          2. 13.3.5.2. How will the Guesstimate be consolidated with real data?
          3. 13.3.5.3. Will users be aware a Guesstimate is taking place?
          4. 13.3.5.4. What support will the server provide?
        6. 13.3.6. Real-World Examples
          1. 13.3.6.1. Apple iTunes counter
          2. 13.3.6.2. Gmail Storage Space
        7. 13.3.7. Code Example: iTunes Counter
        8. 13.3.8. Related Patterns
          1. 13.3.8.1. Periodic Refresh
          2. 13.3.8.2. Predictive Fetch
          3. 13.3.8.3. Fat Client
        9. 13.3.9. Metaphor
      4. 13.4. Multi-Stage Download
        1. 13.4.1. Developer Story
        2. 13.4.2. Problem
        3. 13.4.3. Forces
        4. 13.4.4. Solution
        5. 13.4.5. Decisions
          1. 13.4.5.1. How will the page be divided into blocks?
          2. 13.4.5.2. How will the page be structured?
          3. 13.4.5.3. What happens to the blocks while their content is being downloaded?
          4. 13.4.5.4. Will the calls be issued simultaneously?
        6. 13.4.6. Real-World Examples
          1. 13.4.6.1. Kayak
          2. 13.4.6.2. NetVibes
          3. 13.4.6.3. TalkDigger
        7. 13.4.7. Code Example: AjaxPatterns Portal
        8. 13.4.8. Alternatives
          1. 13.4.8.1. All-In-One
        9. 13.4.9. Related Patterns
          1. 13.4.9.1. Portlet
          2. 13.4.9.2. Guesstimate
          3. 13.4.9.3. Progress Indicator
          4. 13.4.9.4. On-Demand JavaScript
        10. 13.4.10. Metaphor
      5. 13.5. Fat Client
        1. 13.5.1. Developer Story
        2. 13.5.2. Problem
        3. 13.5.3. Forces
        4. 13.5.4. Solution
        5. 13.5.5. Decisions
          1. 13.5.5.1. How will business and application logic be implemented in the browser?
        6. 13.5.6. Real-World Examples
          1. 13.5.6.1. NumSum
          2. 13.5.6.2. Gmail
          3. 13.5.6.3. DHTML Lemmings
          4. 13.5.6.4. JS/UIX shell
        7. 13.5.7. Code Example: AjaxPatterns Basic Wiki
        8. 13.5.8. Alternatives
          1. 13.5.8.1. Thin client
          2. 13.5.8.2. Desktop client
        9. 13.5.9. Related Patterns
          1. 13.5.9.1. Periodic Refresh
          2. 13.5.9.2. Submission Throttling
          3. 13.5.9.3. Widgets
          4. 13.5.9.4. On-Demand JavaScript
          5. 13.5.9.5. Drag-And-Drop
          6. 13.5.9.6. Host-Proof Hosting
        10. 13.5.10. Metaphor
        11. 13.5.11. Want to Know More?
  7. IV. Functionality and Usability Patterns
    1. 14. Widgets
      1. 14.1. Slider
        1. 14.1.1. Goal Story
        2. 14.1.2. Problem
        3. 14.1.3. Forces
        4. 14.1.4. Solution
        5. 14.1.5. Decisions
          1. 14.1.5.1. How will you orient the Slider?
          2. 14.1.5.2. What scale will you use?
          3. 14.1.5.3. How will you present the scale?
        6. 14.1.6. Real-World Examples
          1. 14.1.6.1. Yahoo! Mindset
          2. 14.1.6.2. Amazon Diamond Search
          3. 14.1.6.3. Google Maps
          4. 14.1.6.4. Katrina-Boston map overlay
          5. 14.1.6.5. WebFX Slider Demo
        7. 14.1.7. Code Example: Yahoo! Mindset
        8. 14.1.8. Alternatives
          1. 14.1.8.1. Conventional controls: radiobuttons and selector field
        9. 14.1.9. Related Patterns
          1. 14.1.9.1. Drag-And-Drop
        10. 14.1.10. Metaphor
      2. 14.2. Progress Indicator
        1. 14.2.1. Goal Story
        2. 14.2.2. Problem
        3. 14.2.3. Forces
        4. 14.2.4. Solution
        5. 14.2.5. Decisions
          1. 14.2.5.1. What sort of Progress Indicator will you use?
          2. 14.2.5.2. How will you provide feedback during longer delays?
        6. 14.2.6. Real-World Examples
          1. 14.2.6.1. Amazon Diamond Search
          2. 14.2.6.2. Amazon Zuggest
          3. 14.2.6.3. Protopage
          4. 14.2.6.4. TalkDigger
          5. 14.2.6.5. Kayak
          6. 14.2.6.6. The Pick’em Game
        7. 14.2.7. Code Refactoring: AjaxPatterns Progress Indicator Demo
        8. 14.2.8. Related Patterns
          1. 14.2.8.1. Status Area
          2. 14.2.8.2. Popup
          3. 14.2.8.3. One-Second Spotlight
          4. 14.2.8.4. Guesstimate
          5. 14.2.8.5. Distributed Events
        9. 14.2.9. Metaphor
        10. 14.2.10. Want to Know More?
      3. 14.3. Drilldown
        1. 14.3.1. Goal Story
        2. 14.3.2. Problem
        3. 14.3.3. Forces
        4. 14.3.4. Solution
        5. 14.3.5. Decisions
          1. 14.3.5.1. Will you call on the server each time the user navigates through the Drilldown?
        6. 14.3.6. Real-World Examples
          1. 14.3.6.1. Betfair
          2. 14.3.6.2. Backbase portal
          3. 14.3.6.3. OpenRico accordian widget
        7. 14.3.7. Code Refactoring: AjaxPatterns Drilldown Portal
          1. 14.3.7.1. Overview
          2. 14.3.7.2. Browser-side implementation
          3. 14.3.7.3. Server-Side Implementation
          4. 14.3.7.4. Further refactoring: a Drilldown with dynamic content
        8. 14.3.8. Alternatives
          1. 14.3.8.1. Live Search
          2. 14.3.8.2. Tree
        9. 14.3.9. Related Patterns
          1. 14.3.9.1. Microlink
          2. 14.3.9.2. Browser-Side Cache
          3. 14.3.9.3. Portlet
      4. 14.4. Data Grid
        1. 14.4.1. Goal Story
        2. 14.4.2. Problem
        3. 14.4.3. Forces
        4. 14.4.4. Solution
        5. 14.4.5. Decisions
          1. 14.4.5.1. Will the Grid be Read-Only or Mutable?
        6. 14.4.6. Real-World Examples
          1. 14.4.6.1. OpenRico Data Grid example
          2. 14.4.6.2. NumSum
          3. 14.4.6.3. Oddpost
          4. 14.4.6.4. Delta Vacations
        7. 14.4.7. Code Example: OpenRico Data Grid
        8. 14.4.8. Related Patterns
          1. 14.4.8.1. Virtual Workspace
          2. 14.4.8.2. Browser-Side Cache
          3. 14.4.8.3. Predictive Fetch
          4. 14.4.8.4. Progress Indicator
        9. 14.4.9. Metaphor
        10. 14.4.10. Acknowledgments
      5. 14.5. Rich Text Editor
        1. 14.5.1. Goal Story
        2. 14.5.2. Problem
        3. 14.5.3. Forces
        4. 14.5.4. Solution
        5. 14.5.5. Real-World Examples
          1. 14.5.5.1. FCKEditor library
          2. 14.5.5.2. Jotspot, Dojo Rich Text Editor
          3. 14.5.5.3. Writely
          4. 14.5.5.4. Wikipedia
          5. 14.5.5.5. Rich Text Editor
        6. 14.5.6. Code Example: FCKEditor
        7. 14.5.7. Related Patterns
          1. 14.5.7.1. Virtual Workspace
          2. 14.5.7.2. Progress Indicator
          3. 14.5.7.3. Status Area
        8. 14.5.8. Metaphor
      6. 14.6. Suggestion
        1. 14.6.1. Goal Story
        2. 14.6.2. Problem
        3. 14.6.3. Forces
        4. 14.6.4. Solution
        5. 14.6.5. Decisions
          1. 14.6.5.1. What algorithm will be used to produce the Suggestions?
          2. 14.6.5.2. How will the Suggestions be ordered?
          3. 14.6.5.3. How many Suggestions will be shown?
          4. 14.6.5.4. What auxiliary information will be present with each Suggestion?
        6. 14.6.6. Real-World Examples
          1. 14.6.6.1. Kayak
          2. 14.6.6.2. Google Suggest
          3. 14.6.6.3. Delicious, Amazon
        7. 14.6.7. Code Example: Kayak
        8. 14.6.8. Alternatives
          1. 14.6.8.1. Selector
        9. 14.6.9. Related Patterns
          1. 14.6.9.1. Browser-Side Cache
          2. 14.6.9.2. Guesstimate
          3. 14.6.9.3. Predictive Fetch
          4. 14.6.9.4. Submission Throttling
          5. 14.6.9.5. Highlight
          6. 14.6.9.6. Lazy Registration
          7. 14.6.9.7. Live Search
        10. 14.6.10. Want to Know More?
        11. 14.6.11. Acknowledgments
      7. 14.7. Live Search
        1. 14.7.1. Goal Story
        2. 14.7.2. Problem
        3. 14.7.3. Forces
        4. 14.7.4. Solution
        5. 14.7.5. Decisions
          1. 14.7.5.1. How will you interpret incomplete text?
          2. 14.7.5.2. How verbose will the results be?
          3. 14.7.5.3. What will happen when there are too many results?
        6. 14.7.6. Real-World Examples
          1. 14.7.6.1. Delta Vacations
          2. 14.7.6.2. ListSomething.com
          3. 14.7.6.3. Amazon Diamond Search
          4. 14.7.6.4. Skype
        7. 14.7.7. Code Example: Delta Vacations
          1. 14.7.7.1. Delta Vacations
          2. 14.7.7.2. Assistive Search demo
        8. 14.7.8. Related Patterns
          1. 14.7.8.1. Progress Indicator
          2. 14.7.8.2. Data Grid
          3. 14.7.8.3. Virtual Workspace
          4. 14.7.8.4. One-Second Spotlight
          5. 14.7.8.5. Submission Throttling
          6. 14.7.8.6. Unique URLs
          7. 14.7.8.7. Predictive Fetch
          8. 14.7.8.8. Suggestion
      8. 14.8. Live Command-Line
        1. 14.8.1. Goal Story
        2. 14.8.2. Problem
        3. 14.8.3. Forces
        4. 14.8.4. Solution
        5. 14.8.5. Decisions
          1. 14.8.5.1. Where will the partial command be analyzed—browser or server?
          2. 14.8.5.2. How much information will the server provide?
        6. 14.8.6. Real-World Examples
          1. 14.8.6.1. YubNub
        7. 14.8.7. Code Example: AjaxPatterns Assistive Search Demo
        8. 14.8.8. Alternatives
          1. 14.8.8.1. Point-and-click
          2. 14.8.8.2. Drag-And-Drop
        9. 14.8.9. Related Patterns
          1. 14.8.9.1. Submission Throttling
          2. 14.8.9.2. Status Area
          3. 14.8.9.3. Highlight
          4. 14.8.9.4. Progress Indicator
          5. 14.8.9.5. Browser-Side Cache
          6. 14.8.9.6. Fat Client
          7. 14.8.9.7. Live Search
          8. 14.8.9.8. Suggestion
        10. 14.8.10. Want To Know More?
      9. 14.9. Live Form
        1. 14.9.1. Goal Story
        2. 14.9.2. Problem
        3. 14.9.3. Forces
        4. 14.9.4. Solution
        5. 14.9.5. Real-World Examples
          1. 14.9.5.1. WPLicense
          2. 14.9.5.2. Betfair
          3. 14.9.5.3. MoveableType Comment hack
        6. 14.9.6. Code Example: WPLicense
        7. 14.9.7. Related Patterns
          1. 14.9.7.1. Microlink
          2. 14.9.7.2. Live Search
          3. 14.9.7.3. Suggestion
          4. 14.9.7.4. Drilldown
          5. 14.9.7.5. Progress Indicator
          6. 14.9.7.6. One-Second Spotlight
    2. 15. Page Architecture
      1. 15.1. Drag-And-Drop
        1. 15.1.1. Goal Story
        2. 15.1.2. Problem
        3. 15.1.3. Forces
        4. 15.1.4. Solution
        5. 15.1.5. Decisions
          1. 15.1.5.1. What constraints will apply to the drag operation?
        6. 15.1.6. Real-World Examples
          1. 15.1.6.1. Magnetic Poetry
          2. 15.1.6.2. Backbase Portal
          3. 15.1.6.3. A9 Maps
        7. 15.1.7. Code Example: Magnetic Poetry
        8. 15.1.8. Alternatives
          1. 15.1.8.1. Separate Editing Interface
        9. 15.1.9. Related Patterns
          1. 15.1.9.1. Sprite
          2. 15.1.9.2. Portlet
          3. 15.1.9.3. Slider
      2. 15.2. Sprite
        1. 15.2.1. Goal Story
        2. 15.2.2. Problem
        3. 15.2.3. Forces
        4. 15.2.4. Solution
        5. 15.2.5. Decisions
          1. 15.2.5.1. What file format will the Sprite image be?
          2. 15.2.5.2. Will the Sprite be animated?
        6. 15.2.6. Real-World Examples
          1. 15.2.6.1. DHTML Lemmings
          2. 15.2.6.2. Google Maps
          3. 15.2.6.3. Quek
        7. 15.2.7. Code Example: DHTML Lemmings
        8. 15.2.8. Alternatives
          1. 15.2.8.1. Tiling
        9. 15.2.9. Related Patterns
          1. 15.2.9.1. Popup
          2. 15.2.9.2. Drag-And-Drop
        10. 15.2.10. Metaphor
        11. 15.2.11. Want to Know More?
        12. 15.2.12. Acknowledgments
      3. 15.3. Popup
        1. 15.3.1. Goal Story
        2. 15.3.2. Problem
        3. 15.3.3. Forces
        4. 15.3.4. Solution
        5. 15.3.5. Decisions
          1. 15.3.5.1. How will the Popup look?
          2. 15.3.5.2. How will the user open and close the Popup?
        6. 15.3.6. Real-World Examples
          1. 15.3.6.1. JSCalc
          2. 15.3.6.2. Flickr
          3. 15.3.6.3. Netflix
          4. 15.3.6.4. Hoversearch
        7. 15.3.7. Code Example: JSCalc
        8. 15.3.8. Alternatives
          1. 15.3.8.1. Portlet
          2. 15.3.8.2. Microlink
        9. 15.3.9. Related Patterns
          1. 15.3.9.1. Sprite
          2. 15.3.9.2. Drag-And-Drop
          3. 15.3.9.3. Slider
        10. 15.3.10. Metaphor
      4. 15.4. Malleable Content
        1. 15.4.1. Goal Story
        2. 15.4.2. Problem
        3. 15.4.3. Forces
        4. 15.4.4. Solution
        5. 15.4.5. Decisions
          1. 15.4.5.1. How will users locate Malleable Content and open it up for editing?
          2. 15.4.5.2. Will the Malleable Content be labelled? What auxiliary information will be included?
          3. 15.4.5.3. What content will be marked as Malleable Content? How big will the Malleable Content be?
          4. 15.4.5.4. How will the user stop editing content?
          5. 15.4.5.5. Is it okay to have several Malleable Content blocks open for editing at one time?
        6. 15.4.6. Real-World Examples
          1. 15.4.6.1. Flickr
          2. 15.4.6.2. Monket Calendar
          3. 15.4.6.3. Tiddlywiki
          4. 15.4.6.4. Thomas Baekdal’s Business Card Creator
        7. 15.4.7. Code Example: AjaxPatterns Wiki
        8. 15.4.8. Alternatives
          1. 15.4.8.1. Compound Edit
        9. 15.4.9. Related Patterns
          1. 15.4.9.1. Live Form
          2. 15.4.9.2. Rich Text Editor
          3. 15.4.9.3. Microlink
          4. 15.4.9.4. One-Second Spotlight, One-Second Motion, and One-Second Mutation
          5. 15.4.9.5. Highlight
        10. 15.4.10. Metaphor
      5. 15.5. Microlink
        1. 15.5.1. Goal Story
        2. 15.5.2. Problem
        3. 15.5.3. Forces
        4. 15.5.4. Solution
        5. 15.5.5. Decisions
          1. 15.5.5.1. What will happen to other content?
          2. 15.5.5.2. How will Microlink be presented visually?
        6. 15.5.6. Real-World Examples
          1. 15.5.6.1. TiddlyWiki
          2. 15.5.6.2. Tabtastic library
          3. 15.5.6.3. Rpad
          4. 15.5.6.4. Gmail
        7. 15.5.7. Code Example: TiddlyWiki
        8. 15.5.8. Related Patterns
          1. 15.5.8.1. Malleable Content
          2. 15.5.8.2. “One-Second” visual effects
          3. 15.5.8.3. Drilldown
          4. 15.5.8.4. Popup
          5. 15.5.8.5. Live Form
      6. 15.6. Portlet
        1. 15.6.1. Goal Story
        2. 15.6.2. Problem
        3. 15.6.3. Forces
        4. 15.6.4. Solution
        5. 15.6.5. Decisions
          1. 15.6.5.1. Will users be able to move Portlets around?
        6. 15.6.6. Real-World Examples
          1. 15.6.6.1. Claude Hussenet’s Portal
          2. 15.6.6.2. Google Homepage
          3. 15.6.6.3. Backbase
          4. 15.6.6.4. Dobrado
        7. 15.6.7. Code Example: Claude Hussenet’s Portal
        8. 15.6.8. Alternatives
          1. 15.6.8.1. Tabbed Browsing
        9. 15.6.9. Related Patterns
          1. 15.6.9.1. Periodic Refresh
          2. 15.6.9.2. Distributed Events
          3. 15.6.9.3. Drilldown
          4. 15.6.9.4. Live Form
          5. 15.6.9.5. Cross-Domain Proxy
        10. 15.6.10. Metaphor
        11. 15.6.11. Acknowledgments
      7. 15.7. Status Area
        1. 15.7.1. Goal Story
        2. 15.7.2. Problem
        3. 15.7.3. Forces
        4. 15.7.4. Solution
        5. 15.7.5. Decisions
          1. 15.7.5.1. How will you size the Status Area? What if it overflows?
          2. 15.7.5.2. How will you structure the Status Area’s content?
        6. 15.7.6. Real-World Examples
          1. 15.7.6.1. BetFair
          2. 15.7.6.2. Lace Chat
        7. 15.7.7. Code Refactoring: AjaxPatterns Status Wiki
        8. 15.7.8. Alternatives
          1. 15.7.8.1. Popup
          2. 15.7.8.2. Browser Status Bar
        9. 15.7.9. Related Patterns
          1. 15.7.9.1. Periodic Refresh
        10. 15.7.10. Metaphor
      8. 15.8. Update Control
        1. 15.8.1. Goal Story
        2. 15.8.2. Problem
        3. 15.8.3. Forces
        4. 15.8.4. Solution
        5. 15.8.5. Real-World Examples
          1. 15.8.5.1. Digg Spy
          2. 15.8.5.2. Slide
          3. 15.8.5.3. WBIR
        6. 15.8.6. Code Example: Digg Spy
        7. 15.8.7. Related Patterns
          1. 15.8.7.1. Periodic Refresh
          2. 15.8.7.2. HTTP Streaming
        8. 15.8.8. Metaphor
        9. 15.8.9. Acknowledgments
      9. 15.9. Virtual Workspace
        1. 15.9.1. Goal Story
        2. 15.9.2. Problem
        3. 15.9.3. Forces
        4. 15.9.4. Solution
        5. 15.9.5. Decisions
          1. 15.9.5.1. How will you handle panning?
          2. 15.9.5.2. How will the view appear initially?
          3. 15.9.5.3. What do you display while a region is being repopulated?
          4. 15.9.5.4. How will you handle changes to the existing view?
        6. 15.9.6. Real-World Examples
          1. 15.9.6.1. map.search.ch
          2. 15.9.6.2. OpenRico Search Demo
          3. 15.9.6.3. Giant-Ass Image Viewer (GSV) library
          4. 15.9.6.4. Dunstan Orchard’s blog
        7. 15.9.7. Code Refactoring: AjaxPatterns OpenRico Search
        8. 15.9.8. Alternatives
          1. 15.9.8.1. Virtual Magnifying Glass
        9. 15.9.9. Related Patterns
          1. 15.9.9.1. Browser-Side Cache
          2. 15.9.9.2. Predictive Fetch
          3. 15.9.9.3. Guesstimate
          4. 15.9.9.4. Multi-Stage Download
          5. 15.9.9.5. Drag-And-Drop
          6. 15.9.9.6. Slider
          7. 15.9.9.7. Unique URLs
        10. 15.9.10. Metaphor
        11. 15.9.11. Want to Know More?
        12. 15.9.12. Acknowledgments
    3. 16. Visual Effects
      1. 16.1. One-Second Spotlight
        1. 16.1.1. Goal Story
        2. 16.1.2. Problem
        3. 16.1.3. Forces
        4. 16.1.4. Solution
        5. 16.1.5. Decisions
          1. 16.1.5.1. What events will trigger a spotlight?
          2. 16.1.5.2. What color will be used?
          3. 16.1.5.3. How long should the spotlight last? How long will each transition be?
        6. 16.1.6. Real-World Examples
          1. 16.1.6.1. 37signals Backpack
          2. 16.1.6.2. chat.app
          3. 16.1.6.3. Digg Spy
          4. 16.1.6.4. Coloir
          5. 16.1.6.5. Odeo
          6. 16.1.6.6. Scriptaculous library
          7. 16.1.6.7. Fade Anything Technique (FAT) library
        7. 16.1.7. Code Refactoring: AjaxPatterns Spotlight Time
          1. 16.1.7.1. Hand-built shift effect
          2. 16.1.7.2. Fading with Scriptaculous
        8. 16.1.8. Alternatives
          1. 16.1.8.1. One-Second Mutation and One-Second Motion
        9. 16.1.9. Related Patterns
          1. 16.1.9.1. Periodic Refresh
          2. 16.1.9.2. Timeout
        10. 16.1.10. Metaphor
        11. 16.1.11. Acknowledgments
      2. 16.2. One-Second Mutation
        1. 16.2.1. Goal Story
        2. 16.2.2. Problem
        3. 16.2.3. Forces
        4. 16.2.4. Solution
        5. 16.2.5. Decisions
        6. 16.2.6. Real-World Examples
          1. 16.2.6.1. TiddlyWiki
          2. 16.2.6.2. Scriptaculous library
          3. 16.2.6.3. DHTML Lemmings
        7. 16.2.7. Code Example: TiddlyWiki
        8. 16.2.8. Alternatives
          1. 16.2.8.1. One-Second Spotlight and One-Second Motion
        9. 16.2.9. Related Patterns
          1. 16.2.9.1. Sprite
        10. 16.2.10. Metaphor
        11. 16.2.11. Acknowledgments
      3. 16.3. One-Second Motion
        1. 16.3.1. Goal Story
        2. 16.3.2. Problem
        3. 16.3.3. Forces
        4. 16.3.4. Solution
        5. 16.3.5. Decisions
          1. 16.3.5.1. What events will trigger a motion effect?
          2. 16.3.5.2. What will the element do when it reaches its destination?
        6. 16.3.6. Real-World Examples
          1. 16.3.6.1. Scriptaculous library
          2. 16.3.6.2. TiddlyWiki
          3. 16.3.6.3. Backbase Portal
          4. 16.3.6.4. DHTML Lemmings
          5. 16.3.6.5. MS-Windows
        7. 16.3.7. Code Example: Scriptaculous Effects
        8. 16.3.8. Alternatives
          1. 16.3.8.1. One-Second Spotlight and One-Second Mutation
        9. 16.3.9. Related Patterns
          1. 16.3.9.1. Sprite
          2. 16.3.9.2. Guesstimate
        10. 16.3.10. Metaphor
      4. 16.4. Highlight
        1. 16.4.1. Goal Story
        2. 16.4.2. Problem
        3. 16.4.3. Forces
        4. 16.4.4. Solution
        5. 16.4.5. Decisions
          1. 16.4.5.1. How will the Highlight look?
          2. 16.4.5.2. How will the Highlight appear and disappear?
        6. 16.4.6. Real-World Examples
          1. 16.4.6.1. Gmail
          2. 16.4.6.2. A9
          3. 16.4.6.3. Teacher!
          4. 16.4.6.4. Whitespace
        7. 16.4.7. Code Example: AjaxPatterns Wiki
        8. 16.4.8. Related Patterns
          1. 16.4.8.1. Status Area
          2. 16.4.8.2. One-Second Spotlight
        9. 16.4.9. Metaphor
    4. 17. Functionality
      1. 17.1. Lazy Registration
        1. 17.1.1. Goal Story
        2. 17.1.2. Problem
        3. 17.1.3. Forces
        4. 17.1.4. Solution
        5. 17.1.5. Decisions
          1. 17.1.5.1. What kind of data will the profile contain?
          2. 17.1.5.2. How can the profile be accumulated?
          3. 17.1.5.3. How much data should be stored in cookies?
        6. 17.1.6. Real-World Examples
          1. 17.1.6.1. Memeflow
          2. 17.1.6.2. Blummy
          3. 17.1.6.3. Kayak
          4. 17.1.6.4. Palmsphere
          5. 17.1.6.5. Amazon.com
        7. 17.1.7. Code Example: AjaxPatterns Shop Demo
          1. 17.1.7.1. Retrieval of categories and items
          2. 17.1.7.2. Cart management
          3. 17.1.7.3. Mailing cart contents
          4. 17.1.7.4. Tracking favorite categories
          5. 17.1.7.5. Verifying password and email
        8. 17.1.8. Related Patterns
          1. 17.1.8.1. Direct Login
          2. 17.1.8.2. Live Form
          3. 17.1.8.3. Timeout
          4. 17.1.8.4. Guesstimate
        9. 17.1.9. Metaphor
        10. 17.1.10. Want to Know More?
        11. 17.1.11. Acknowledgments
      2. 17.2. Direct Login
        1. 17.2.1. Goal Story
        2. 17.2.2. Problem
        3. 17.2.3. Forces
        4. 17.2.4. Solution
        5. 17.2.5. Decisions
          1. 17.2.5.1. What hashing algorithm will be used?
          2. 17.2.5.2. How will you manage the one-time seed?
        6. 17.2.6. Real-World Examples
          1. 17.2.6.1. NetVibes
          2. 17.2.6.2. Protopage
          3. 17.2.6.3. Treehouse
        7. 17.2.7. Code Examples: Ajax Login Demo
        8. 17.2.8. Related Patterns
          1. 17.2.8.1. Lazy Registration
          2. 17.2.8.2. Host-Proof Hosting
          3. 17.2.8.3. Timeout
        9. 17.2.9. Acknowledgments
      3. 17.3. Host-Proof Hosting
        1. 17.3.1. Goal Story
        2. 17.3.2. Problem
        3. 17.3.3. Forces
        4. 17.3.4. Solution
        5. 17.3.5. Decisions
          1. 17.3.5.1. What encryption algorithm and framework will be used?
          2. 17.3.5.2. When will the pass-phrase be requested?
        6. 17.3.6. Real-World Examples
        7. 17.3.7. Code Example: Host-Proof-Hosting Proof-Of-Concept
        8. 17.3.8. Alternatives
          1. 17.3.8.1. Richer Plugin
        9. 17.3.9. Related Patterns
          1. 17.3.9.1. Direct Login
          2. 17.3.9.2. Timeout
        10. 17.3.10. Metaphor
        11. 17.3.11. Want to Know More?
        12. 17.3.12. Acknowledgments
      4. 17.4. Timeout
        1. 17.4.1. Goal Story
        2. 17.4.2. Problem
        3. 17.4.3. Forces
        4. 17.4.4. Solution
        5. 17.4.5. Decisions
          1. 17.4.5.1. How long will the Timeout period be?
          2. 17.4.5.2. How will Timeout affect the user interface?
        6. 17.4.6. Real-World Examples
          1. 17.4.6.1. Lace Chat
          2. 17.4.6.2. Pandora
          3. 17.4.6.3. Session Warning Demo
          4. 17.4.6.4. Operating system Timeouts
        7. 17.4.7. Code Refactoring: AjaxPatterns Timeout Wiki
          1. 17.4.7.1. Introducing Timeout to the wiki
          2. 17.4.7.2. Initial refactoring: unconditional Timeout
          3. 17.4.7.3. Warning that Timeout is pending
          4. 17.4.7.4. Monitoring mouse movements
        8. 17.4.8. Related Patterns
          1. 17.4.8.1. Heartbeat
          2. 17.4.8.2. Periodic Refresh
          3. 17.4.8.3. Progress Indicator
          4. 17.4.8.4. Direct Login
          5. 17.4.8.5. Status Area
          6. 17.4.8.6. Popup
        9. 17.4.9. Metaphor
      5. 17.5. Heartbeat
        1. 17.5.1. Goal Story
        2. 17.5.2. Problem
        3. 17.5.3. Forces
        4. 17.5.4. Solution
        5. 17.5.5. Decisions
          1. 17.5.5.1. How will you maintain user records?
          2. 17.5.5.2. What, if anything, will cause the browser application to stop sending Heartbeats?
          3. 17.5.5.3. How much time between Heartbeats? How much delay until a user is declared inactive?
        6. 17.5.6. Real-World Examples
        7. 17.5.7. Code Refactoring: AjaxPatterns Heartbeat Wiki
        8. 17.5.8. Related Patterns
          1. 17.5.8.1. Timeout
          2. 17.5.8.2. Submission Throttling
        9. 17.5.9. Metaphor
        10. 17.5.10. Want to Know More?
      6. 17.6. Unique URLs
        1. 17.6.1. Goal Story
        2. 17.6.2. Problem
        3. 17.6.3. Forces
        4. 17.6.4. Solution
        5. 17.6.5. Decisions
          1. 17.6.5.1. How will you support search engine indexing?
          2. 17.6.5.2. What will be the polling interval?
          3. 17.6.5.3. What state differences warrant Unique URLs?
          4. 17.6.5.4. What will the URLs look like?
        6. 17.6.6. Real-World Examples
          1. 17.6.6.1. PairStairs
          2. 17.6.6.2. Dojo binding library
          3. 17.6.6.3. Really Simple History library
        7. 17.6.7. Code Refactoring: AjaxPatterns Unique URL Sum
          1. 17.6.7.1. Unique URL Sum Demo
          2. 17.6.7.2. Polling URL Sum Demo
          3. 17.6.7.3. IFrame Sum Demo
          4. 17.6.7.4. Full IFrame Sum Demo
        8. 17.6.8. Alternatives
          1. 17.6.8.1. Occasional refresh
          2. 17.6.8.2. “Here” link
        9. 17.6.9. Want to Know More?
        10. 17.6.10. Acknowledgments
  8. V. Development Patterns
    1. 18. Diagnosis
      1. 18.1. Logging
        1. 18.1.1. Developer Story
        2. 18.1.2. Problem
        3. 18.1.3. Solution
        4. 18.1.4. Decisions
          1. 18.1.4.1. Will you log during production?
          2. 18.1.4.2. How will you change log settings between development and production?
        5. 18.1.5. Tool Support
          1. 18.1.5.1. Lumberjack
          2. 18.1.5.2. fvLogger
          3. 18.1.5.3. log4js
          4. 18.1.5.4. Mochikit
        6. 18.1.6. Code Example: Using Lumberjack
      2. 18.2. Debugging
        1. 18.2.1. Developer Story
        2. 18.2.2. Problem
        3. 18.2.3. Solution
        4. 18.2.4. Tool Support
          1. 18.2.4.1. Venkman
          2. 18.2.4.2. Microsoft Script Debugger
          3. 18.2.4.3. JavaScript HTML Debugger
      3. 18.3. DOM Inspection
        1. 18.3.1. Developer Story
        2. 18.3.2. Problem
        3. 18.3.3. Solution
        4. 18.3.4. Tool Support
          1. 18.3.4.1. Firefox DOM Inspector
          2. 18.3.4.2. Firefox Web Developer Extension
          3. 18.3.4.3. View Rendered Source
          4. 18.3.4.4. IE Developer Toolbar
          5. 18.3.4.5. IEDocMon
          6. 18.3.4.6. Mouseover DOM Inspector
      4. 18.4. Traffic Sniffing
        1. 18.4.1. Developer Story
        2. 18.4.2. Problem
        3. 18.4.3. Solution
        4. 18.4.4. Tool Support
          1. 18.4.4.1. XMLHttpRequest Tracing and XMLHttpRequest Debugging
          2. 18.4.4.2. Fiddler
          3. 18.4.4.3. FlangeLib
        5. 18.4.5. Code Example: Using XMLHttpRequest Tracing
        6. 18.4.6. Related Patterns
          1. 18.4.6.1. Logging
    2. 19. Testing
      1. 19.1. Simulation Service
        1. 19.1.1. Developer Story
        2. 19.1.2. Problem
        3. 19.1.3. Solution
        4. 19.1.4. Decisions
          1. 19.1.4.1. How will you switch between different services?
        5. 19.1.5. Code Example: Simulation Service
        6. 19.1.6. Related Patterns
          1. 19.1.6.1. Service Test
        7. 19.1.7. Want to Know More?
      2. 19.2. Browser-Side Test
        1. 19.2.1. Developer Story
        2. 19.2.2. Problem
        3. 19.2.3. Solution
        4. 19.2.4. Tool Support
          1. 19.2.4.1. Scriptaculous testing framework
          2. 19.2.4.2. JsUnit framework (Hieatt)
          3. 19.2.4.3. JsUnit Framework (Schaible)
        5. 19.2.5. Code Example: Using Scriptaculous Unit-Testing
        6. 19.2.6. Related Patterns
          1. 19.2.6.1. Service Test
          2. 19.2.6.2. Logging
      3. 19.3. Service Test
        1. 19.3.1. Developer Story
        2. 19.3.2. Problem
        3. 19.3.3. Solution
        4. 19.3.4. Tool Support
          1. 19.3.4.1. Ruby Net::HTTP
          2. 19.3.4.2. Jakarta HTTPClient
          3. 19.3.4.3. PHP HTTPClient
        5. 19.3.5. Code Example: Service Test
        6. 19.3.6. Related Patterns
          1. 19.3.6.1. Simulation Service
          2. 19.3.6.2. Browser-Side Test
      4. 19.4. System Test
        1. 19.4.1. Developer Story
        2. 19.4.2. Problem
        3. 19.4.3. Solution
        4. 19.4.4. Tool Support
          1. 19.4.4.1. GhostTrain
          2. 19.4.4.2. Watir
          3. 19.4.4.3. Selenium
          4. 19.4.4.4. HTTPUnit
          5. 19.4.4.5. DojoToolkit
        5. 19.4.5. Code Example: Using Scriptaculous GhostTrain
        6. 19.4.6. Related Patterns
          1. 19.4.6.1. Browser-Side Test
          2. 19.4.6.2. Simulation Service
        7. 19.4.7. Want to Know More?
  9. VI. Appendixes
    1. A. Ajax Frameworks and Libraries
      1. A.1. JavaScript Multipurpose Frameworks
        1. A.1.1. AjaxFace (from 2005)
        2. A.1.2. Backbase (from 2003)
        3. A.1.3. Bindows (from 2003)
        4. A.1.4. Dojo (from September, 2004)
        5. A.1.5. eBusiness Applications (EBA) Ajax Components (from 2002)
        6. A.1.6. Engine for Web Applications (from 2002)
        7. A.1.7. Framework for RESTful JavaScript (Freja) (from 2006)
        8. A.1.8. Mochikit (from 2005)
        9. A.1.9. OpenRico (from May, 2005; based on earlier proprietary framework)
        10. A.1.10. Plex Toolkit
        11. A.1.11. Prototype
        12. A.1.12. qooxdoo (from May, 2005)
        13. A.1.13. Script.aculo.us (from 2005)
        14. A.1.14. SmartClient (from 2000)
        15. A.1.15. ThyAPI (from end of 2004)
        16. A.1.16. TIBCO General Interface (from 2001)
        17. A.1.17. Interactive Website Framework (from May 2005)
        18. A.1.18. Zimbra AjaxTK
      2. A.2. JavaScript Remoting Frameworks
        1. A.2.1. AjaxCaller (from May 2005)
        2. A.2.2. Ajax Client Engine (ACE) (from December 2005)
        3. A.2.3. AjaxGear (from November 2005)
        4. A.2.4. AJFORM (from June 2005)
        5. A.2.5. HTMLHttpRequest (from 2005)
        6. A.2.6. JSMX (from Aug 2005)
        7. A.2.7. LibXMLHttpRequest (from June 2003)
        8. A.2.8. MAJAX (from August 2005)
        9. A.2.9. RSLite
        10. A.2.10. Sack (from May 2005)
        11. A.2.11. Subsys_JsHttpRequest
        12. A.2.12. XHConn (from April, 2005)
      3. A.3. JavaScript Effects Frameworks
        1. A.3.1. Fade Anything Technique (FAT)
        2. A.3.2. Moo.fx (from Oct 2005)
      4. A.4. JavaScript Flash Frameworks
        1. A.4.1. AMFPHPKit
        2. A.4.2. Flash JavaScript Integration Kit
        3. A.4.3. Stream (from July, 2005)
      5. A.5. JavaScript XML Frameworks
        1. A.5.1. Google AJAXSLT (from June 2005)
        2. A.5.2. Sarissa (from February, 2003)
      6. A.6. JavaScript Specialized Frameworks
        1. A.6.1. Drag-Drop
        2. A.6.2. Giant-Ass Image Viewer (GSV)
      7. A.7. Multilanguage Ajax Frameworks
        1. A.7.1. Cross-Platform Asynchronous INterface Toolkit (CPAINT) (from May 2005)
        2. A.7.2. JavaScript Object Notation (JSON) and JSON-RPC
        3. A.7.3. JavaScript Remote Scripting (JSRS) (from 2000)
        4. A.7.4. Rialto: Rich Internet AppLication TOolkit
        5. A.7.5. SAJAX (from March 2005)
        6. A.7.6. ZK—Ajax/XUL Web Framework
      8. A.8. C++ Ajax Frameworks
        1. A.8.1. Wt
      9. A.9. ColdFusion Ajax Frameworks
        1. A.9.1. AjaxCFC
        2. A.9.2. JSMX (from August 2005)
      10. A.10. .NET Ajax Frameworks
        1. A.10.1. Ajax.NET for ASP.NET 1.x/2.0
        2. A.10.2. Anthem.NET for ASP.NET 1.x/2.0
        3. A.10.3. AjaxAspects
        4. A.10.4. Atlas (from late 2005)
        5. A.10.5. Bitkraft for ASP.NET
        6. A.10.6. ComfortASP.NET for ASP.NET 1.1/2.0
        7. A.10.7. MagicAjax.NET (from September 2005)
        8. A.10.8. MonoRail (from May 2005)
        9. A.10.9. WebORB for .NET (from August 2005)
        10. A.10.10. zumiPage
      11. A.11. Java Ajax Frameworks
        1. A.11.1. AjaxAnywhere (from September 2005)
        2. A.11.2. AJAX JSP Tag Library
        3. A.11.3. AJAX Java Server Faces Framework
        4. A.11.4. Direct Web Remoting (DWR) (from 2005)
        5. A.11.5. Echo 2 (from March 2005)
        6. A.11.6. Guise
        7. A.11.7. ICEfaces
        8. A.11.8. JSON-RPC-Java (from April 2004)
        9. A.11.9. JSP Controls Tag Library (from December 2005)
        10. A.11.10. jWic
        11. A.11.11. Struts-Layout
        12. A.11.12. SWATO (from 2005)
        13. A.11.13. Tacos Tapestry Components (from December 2005)
        14. A.11.14. ThinkCAP JX
        15. A.11.15. WebORB for Java (from August 2005)
        16. A.11.16. WidgetServer (from 2004)
      12. A.12. Lisp Ajax Frameworks
        1. A.12.1. CL-Ajax
      13. A.13. Perl Ajax Frameworks
        1. A.13.1. CGI::Ajax—Export Perl Methods to JavaScript for Ajax
        2. A.13.2. HTML::Prototype—Generate HTML and JavaScript for the Prototype Library
      14. A.14. PHP Ajax Frameworks
        1. A.14.1. AJASON
        2. A.14.2. AjaxAC (from April, 2005)
        3. A.14.3. Cajax
        4. A.14.4. HTS Web Application Framework
        5. A.14.5. JPSpan
        6. A.14.6. PEAR::HTML::Ajax
        7. A.14.7. Pipeline
        8. A.14.8. Symfony
        9. A.14.9. XAJAX
        10. A.14.10. XOAD (formerly NAJAX)
      15. A.15. Python Ajax Frameworks
        1. A.15.1. CrackAJAX
        2. A.15.2. Turbo Gears
      16. A.16. Ruby Ajax Frameworks
        1. A.16.1. Ruby On Rails
    2. B. Setting Up the Code Examples
    3. C. Patterns and Pattern Languages
    4. D. References
  10. About the Author
  11. Colophon
  12. Special Upgrade Offer
  13. Copyright