AJAX Design Patterns

WidgetBucks - Trend Watch - WidgetBucks.com

By now the entire World has heard about AJAX, even those who don't care about Web-Development have seen the potential of this new technology. Everybody is tired of endless introductions on how cool AJAX is and those endless lists of good examples like Google Suggest, GMail and alike, so I decided to cut a long story short and jump right into the real tutorial.

Advertisement BadgeKeep your web page design in mind when you are deciding how to set up your site, considering the fact that web design makes up a huge part of usability and thus return traffic, making web site design a very good investment whether that investment is time to learn design concepts or money hiring a good design service.

Is this tutorial any different from the others? Well yes and no, it is different in being a tutorial on how to design and build a complete site and not just some fancy little details like how to turn caching in AJAX off or how to create a fancy widget. To keep the tutorial readable, and to avoid having to implement low level functionality, I'm using the dojo toolkit, I tried prototype too and really enjoyed working with being a really nice and easy to use Library, but dojo provides much more functionality bundled with it. For both frameworks one thing is true: documentation is scarse, and I spent alot time debugging and reading posts on the newsgroups.

For debugging I suggest using Firefox Venkman and the really nice Firebug extension, which make AJAX a lot easier to understand, especially FireBug's "Log each Request" Feature.

In this tutorial we will try to design a community portal as it has a wide range of different components that give a good overview of what is archievable with AJAX, also it should provide you with the basic tools that will help you in more complex applications.

What we want

As developers we need to know where we want to go, before starting right away. The requirements analysis is not part of this tutorial so I'll just write down the basic functionality for our Portal:
  • Pages: Load and show simple HTML Formatted content.
  • User: we want to be a community so the possibility for users to register themselfs, create a Profile and communicate with others is fundamental.
  • Messages: some sort of messaging center is nice too, and not too difficult to implement, it allows private communication between the users.
  • Forum: talking about communications, what could be better than a Forum to let the Users talk about whatever they want?
Many more things will be added later but for now this should be enough for some sleepless nights =D

The Layout

Although the focus should be on the development of the functionality, the layout is still as important as the application itself. It gets even more important because the application can be good but without an interface that is functional it is useless. We'll use a layout that is easy yet functional:

  1. The content area.
  2. A sidebar for context related options.
  3. The main menu (basically this just selects between modules).
  4. The title, nothing fancy here
  5. A list with the online users.

Modules

Basically with AJAx we step away from the classic one page-at-a-time view of doing things, and we have to start talking about a more Event Driven architecture, or MVC-Model if you prefer.
We'll define an API that abstracts from the actual page so that we can then create modules that do more complex tasks.

To get back to this tutorial we will have several small modules that represent parts on the site, along with real modules we will have some virtual modules that take care of some functionality, but more on this later. Modules in this tutorial include:

  • Page: this will be the first module we will be implementing, it allows to simply display the contents of a file in the contents area of the site, it does nothing fancy.
  • User: this module is used for several different tasks:
    • Register: register a new User
    • Login
    • Profile: show the profile of a User
  • Online: once we have users we can easily implement a component that allows us to show which users are online, and with AJAX this is possible almost in realtime. It is a nice effect and very easy to implement.
  • Forum: what would a community site be without a Forum?

The implementation

We will encapsulate all of our functionality in JavaScript variables, this is similar to static classes in Java and makes it possible to have some sort of clean namespace division between the modules. First of all we will have to create the engine. The engine is the part that handles loading of all the other modules and gives them abstract ways to interact with the page. The idea behind this is that the page interface (layout, stylesheet, ...) and Engine build an abstraction layer so that it is easier to implement the functionality easier, without having to bother about representational issues. In other words we build an API.
The first and morst important thing the engine has to do is initialize everything.
var Engine = {
  bootstrap: function(){
    this.setStatus("Loading...");
    dojo.require("dojo.io.*");
    dojo.hostenv.writeIncludes();
    if((""+document.location).indexOf('#') < 0){
      Engine.loadPage("#Page/Welcome");
    }else{
      Engine.loadPage("" + document.location);
    }
  },
This part is easy to understand it does nothing else than set the status to "Loading...", then include some dojo packages and then display a page using Engine.loadPage() as is shown later on. As you can see everything is bundled into a variable named "Engine" thus making it easy to reference it from outside. The bootstrap function is called by the following code in the page:
<body onload="Engine.bootstrap()"></body>
The next thing to do is to give the Engine the ability to load modules, this is done by downloading a JavaScript file that contains the Module (again encapsulated in its own namespace) and then calling init() of the Module which will initialize the module:
  loadedModules: new Array(),
  modules: new Array(),
 
  loadModule: function(module){
    if(Engine.loadedModules[module])
      return;
    dojo.io.bind({
      url: "javascript/" + module + ".js",
      sync: true,
      error: function(type, evaldObj){Engine.showError("Error while loading module.");},
      load: function(type, data, evt){
        eval(data);
        Engine.modules[module].execute(uri);
      }
    });
  },
For performance issues we don't want to download the modules more than once, that's why we use the two arrays in the first two lines: loadedModules[] is an array of booleans which to every modulename tells us if it was loaded or is yet to be loaded, the second array contains references to the Modules themselfs (being variables they can be referenced like this). loadModules() itself does nothing fancy, it just issues a Synchronous XMLHTTPRequest to download the Module's source code. It's synchronous because we don't want anything to happen at this stage, a call to a function that is not yet loaded for example, this gives us a certain security. Notice that the code is evaluated using eval().
Now we move on to the real magic: loadPage(). It will get a URI as input and it will then load the correct module and pass control to the module, which will then take care of the rest:
  uri: &quot;/&quot;,
 
  loadPage: function(url){
    Engine.setStatus("Loading...");
    if(!url)
      url = "" + document.location;
    var hashIndex = url.indexOf('#');
    if(hashIndex < 0 || hashIndex <= url.length-2)
      return Engine.hideStatus;
    uri = url.substring(hashIndex + 1);
    var moduleLength;
    if(uri.indexOf('/') > 0)
      moduleLength = uri.indexOf('/');
    else
      moduleLength = uri.length;
    var module = uri.substring(0,moduleLength);
    uri = uri.substring(uri.indexOf('/'));
    if(Engine.loadedModules[module] && ! dojo.lang.isUndefined(Engine.modules[module])){
      Engine.modules[module].execute(uri);
    }else{
      Engine.loadModule(module);
    }
  },
The URI is there so other modules and function get work with it easily without having to parse it over again. As you can see loadPage() mainly interprets the URL. Determining the module to load is fairly easy being the first part of the Query string. Some may ask why we're using URLs like "http://www.example.com/Page#This/is/a/long/string". This is because we don't want to break the ability to bookmark the pages. AJAX itself does break the bookmarkability because everythin happens in a single page, whereas without AJAX every URL identified a single resource. We use the part behind the '#' because the browser does not issue another request to the webserver, which would unload the entire AJAX application, yet we assign a resouce to a unique URL. bootstrap() also loads the requested page from the URL using loadPage(). Cutting a long story short: a user can browse through our site then copy&paste the URL somewhere and when he returns to the URL he will see exaclty the page he left.

The URL is interpreted in the following way:
  1. Everything in front of the '#' is discarded as it is only the location of the application.
  2. The part between the '#' and the first '/' is the module name which will be loaded if it isn't yet.
  3. Everything from the '/' to the end of the URL is the argument that is passed to the Module's execute() function (see the Page module below as an example).

All that is left now to do is implementing some helper functions that will later be used by the modules:
  setStatus: function(message){
    if($('status') != null){
      $('status').parentNode.removeChild($('status'));
    }
    var body = document.getElementsByTagName("body")[0];
    var div = document.createElement("div");
    div.style.position = "absolute";
    div.style.top = "50%";
    div.style.left = "50%";
    div.style.width = "200px";
    div.style.margin = "-12px 0 0 -100px";
    div.style.border = "0px";
    div.style.padding = "20px";
    div.style.opacity = "0.85";
    div.style.backgroundColor = "#353555";
    div.style.border = "1px solid #CFCFFF";
    div.style.color = "#CFCFFF";
    div.style.fontSize = "25px";
    div.style.textAlign = "center";
    div.id = 'status';
    body.appendChild(div);
    div.innerHTML = message;
  },
 
  hideStatus: function(){
    Engine.opacityDown($('status'));
  },
 
  opacityDown: function(theElement){
    if(theElement == null)
      return;
    var opacity = parseFloat(theElement.style.opacity);
    if (opacity < 0.08){
      theElement.parentNode.removeChild(theElement);
    }else{
      opacity -= 0.07;
      theElement.style.opacity = opacity;
      setTimeout(function(){Engine.opacityDown(theElement);}, 50);
    }
    return true;
  },
  setContent: function(content){
    $('content').innerHTML = content;
  },
 
  showError: function(message){
    Engine.setStatus(message);
    setTimeout("Engine.hideStatus()",10000);
  }
}
This completes the engine. You can find the full script here.

The first module

Now we'll move on to implement our first real module. It's task is to load an external resource (an HTML page in this specific case) asynchronously and then display it in the content area.
var Page = {
  init: function(){
    Engine.modules["Page"] = Page;
    Engine.loadedModules["Page"] = true;
  },
 
  execute: function(uri){
    try{
      dojo.io.bind({
        url: "resources" + uri + ".php",
        sync: false,
        error: function(type, evaldObj){
          Engine.showError("Error while loading Content.");},
        load: function(type, data, evt){
          Engine.setContent(data);
          Engine.hideStatus();
      });
    }catch(e){
      alert(e);
    }
  }
}
Page.init();
When the module is loaded it will register itself to the Engine (see the init() function) and the Engine will then call execute() which does nothing else than to load the page in the background and then display it in the content area. Easy isn't it?
But you can already see that we can create really complex modules too as will be shown in a later part of this tutorial when we'll create a Forum as a Module.
The source of the Page module can be found here.
Use AJAX with your ecommerce hosting for powerful inline shopping cart functions, and deliver custom content based on your internet marketing services. With an open web site design the use of AJAX can streamline the delivery of key content, even if you don't use the best hosting provider, AJAX runs efficiently on any hosting service. Does your website hosting choice make a difference in your AJAX scripts and performance? Naturally the responsiveness of the web hosting service and speed of the communicating web server need to be adequate - but you will find that today's cheap hosting is typically par with premium web site hosting services of the past.

Putting it all together

You can take a look at the running version of this application or download the entire source code and analyse it. I hope this tutorial was usefull and helped you understand how to design your application. See you all in the next part discussing an Online display.

»crosslinked«

Did you like this? Share it:

114 Responses to “AJAX Design Patterns”

  1. Darren Straight’s Blog  on February 6th, 2006

    [...] Read the rest here. [...]

    Reply

  2. 阳春面的学习笔记 »Blog Archive » AJAX Design Patterns  on February 6th, 2006

    [...] read more | digg story • • • [...]

    Reply

  3. jDavid.net “@” gmail.com  on February 7th, 2006

    [...] http://snyke.net/blog/2006/02/05/ajax-design-patterns/ No Comments so far Leave a comment RSS feed for comments on this post. TrackBack URI Leave a comment Line and paragraph breaks automatic, e-mail address never displayed, HTML allowed: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong> [...]

    Reply

  4. Thomas Winston Thorpe » Blog Archive » links for 2006-02-07  on February 7th, 2006

    [...] AJAX Design Patterns (tags: ajax) [...]

    Reply

  5. DoNews Time » Blog Archive » Fading Roses & Raging Viruses  on February 7th, 2006

    [...] Fading Roses & Raging Viruses AJAX Design Patterns [...]

    Reply

  6. A practical AJAX tutorial — My Stuff Archive  on February 7th, 2006

    [...] Is this tutorial any different from the others? Well yes and no, it is different in being a tutorial on how to design and build a complete site and not just some fancy little details like how to turn caching in AJAX off or how to create a fancy widget. It also provides a practical example of the use of the dojo toolkit. [...]

    Reply

  7. Ryan Sholin's J-School Blog  on February 7th, 2006

    [...] Fading Roses & Raging Viruses Some instructional ajax stuff that I’m clearly unprepared to learn at this juncture. (tags: ajax) [...]

    Reply

  8. Whole Ball o’ Wax » Today’s del.icio.us bookmarks  on February 7th, 2006

    [...] AJAX Design Patterns – This site describes several of the application design patterns that can utilize AJAX. Tagged as: ajax javascript tutorial webdesign [...]

    Reply

  9. 百无禁忌 » Blog Archive » links for 2006-02-07  on February 7th, 2006

    [...] Fading Roses & Raging Viruses (tags: ajax) [...]

    Reply

  10. Bohr’s Blog » links for 2006-02-07  on February 7th, 2006

    [...] AJAX Design Patterns [...]

    Reply

  11. Ronald Yau » Blog Archive » AJAX Design Patterns  on February 7th, 2006

    [...] read more | digg story [...]

    Reply

  12. Internation 1.0 » AJAX …  on February 8th, 2006

    [...] De ‘buzz’ rond AJAX is al een tijdje bezig, in deze korte tutorial legt collega-blogger Snyke in klare taal uit hoe hij AJAX gebruikt om het framework voor een website te maken. [...]

    Reply

  13. Ajax Lessons » Blog Archive » AJAX Design Patterns  on February 11th, 2006

    [...] Christian Decker has posted an interesting tutorial on his blog Fading Roses & Raging Viruses about AJAX design patterns. He is using the dojo toolkit framework in his tutorial to get you started on you AJAX application. By now the entire World has heard about AJAX, even those who don’t care about Web-Development have seen the potential of this new technology. Everybody is tired of endless introductions on how cool AJAX is and those endless lists of good examples like Google Suggest, GMail and alike, so I decided to cut a long story short and jump right into the real tutorial. [...]

    Reply

  14. Tiziano ’s Blog » AJAX Design Patterns  on February 13th, 2006

    [...] read more | digg story [...]

    Reply

  15. Ajax学习笔记 »Blog Archive » All about Ajax….  on February 16th, 2006

    [...] AJAX Design Pattern以GMail为例子介绍Ajax设计模式 [...]

    Reply

  16. jiangws » Blog Archive » AJAX Design Patterns  on March 16th, 2006

    [...] Fading Roses & Raging Viruses: Snyke wrote this terribly early in the morning: [...]

    Reply

  17. Ajaxian » Ajax Tutorial Round-up  on March 17th, 2006

    [...] AJAX Design Patterns [...]

    Reply

  18. Ilija Studen  on March 18th, 2006

    Sorry, it cleaned up the code. Can you reformat it or it is lost permanently?

    Reply

  19. Snyke  on March 18th, 2006

    This is a bit trickier than you suggest because if the user bookmarks this page he will come back to it sooner or later, this means that he is using the bookmarked page as entry point…
    You’d have to duplicate the AJAX detection for every URL…

    Reply

  20. Ilija Studen  on March 18th, 2006

    I don't like the way you created URLs. If you want to keep URLs bookmarkable you can simple use something like:

    Edit this document

    If JS is enabled Engine will execute event (pass whatever params you want) and return false. If not we are using the good old application to handle the request with refresh.

    Or I'm missing something important here :)

    Reply

  21. nxmxbbd  on March 18th, 2006

    Ajax 网摘及教程…

    Ajax 网摘及教程…

    Reply

  22. Iago Blog » Tutoriales Ajax  on March 18th, 2006

    [...] AJAX Design Patterns [...]

    Reply

  23. Ilija Studen  on March 18th, 2006

    You are right.

    With the method I’m suggesting you can’t replicate the page if your coming with bookmarked link, but it works really well because routing of such request is easier and it works without JS enabled.

    Reply

  24. Snyke  on March 18th, 2006

    I think your point is absolutely right though, one would only have to check if JavaScript is enabled somewhere in the header and redirect to the BasePage if it is, otherwise the classical One-Page-at-a-time approach is used.
    Thank you for pointing me out this option :-) I will probably include it in the next tutorial.

    Reply

  25. Wordpress » Blog Archive » Ajax Tutorial Round-up  on March 19th, 2006

    [...] AJAX Design Patterns [...]

    Reply

  26. Art and Technology »  on March 20th, 2006

    [...] AJAX Design Patterns Excellent tutorial on how to build an AJAX powered website, with dynamic page loads. [...]

    Reply

  27. Roger  on March 28th, 2006

    Ajax Design is good…

    Reply

  28. Jeff  on March 29th, 2006

    Round-up of 30 AJAX Tutorials…

    There are quite a few AJAX demos and examples on the web right now. While these are invaluable to learning AJAX, some people need a bit more information than just a raw piece of code. In todays environment there are many ways to learn AJAX including, b…

    Reply

  29. ScriptSe  on April 8th, 2006

    Nice code. But seems demo doesn’t work (forum e.t.c. show an database error)

    Reply

  30. Anonymous  on April 8th, 2006

    AJAX Design Patterns…

    In this tutorial we will try to design a community portal as it has a wide range of different components that give a good overview of what is archievable with AJAX, also it should provide you with the basic tools that will help you in more complex appl…

    Reply

  31. Chrono Tron - 100% » Blog Archive » AJAX, Get Started, Resources & Tutorials  on April 11th, 2006

    [...] AJAX Pattern for websites, a fascinating tutorial to build a community portal using AJAX alone. [...]

    Reply

  32. Saahil Chopra » Blog Archive » Ajax For Beginners  on April 12th, 2006

    [...] AJAX Pattern for websites, a fascinating tutorial to build a community portal using AJAX alone. [...]

    Reply

  33. CodeRecipe Official Blog » Blog Archive » Ajax round up — Top 30  on April 30th, 2006

    [...] AJAX Design Patterns Excellent tutorial on how to build an AJAX powered website, with dynamic page loads. [...]

    Reply

  34. JanuMedia » 30 Links to AJAX Tutorials  on May 16th, 2006

    [...] AJAX Design Patterns [...]

    Reply

  35. ngsld  on May 28th, 2006

    Hi, Nice!

    Reply

  36. sdfsdfx  on June 11th, 2006

    Design Patterns Excellent tutorial on how to build an AJAX powered website, with dynamic page loads

    Reply

  37. sdfsdfx  on June 11th, 2006

    嗨,,,干嘛要这样的哦,,,气死了,

    Reply

  38. sdfsdfx  on June 11th, 2006

    你妈妈的哦,,,,叼死你,,他妈的,

    Reply

  39. sdgfsdge  on June 11th, 2006

    打你死,,,打你全家

    Reply

  40. sdfsdfw  on June 11th, 2006

    你妈妈的哦,,,,叼死你,,他妈的,
    嗨,,,干嘛要这样的哦,,,气死了,

    Reply

  41. sdfsdfx  on June 11th, 2006

    妈妈的哦,,,,叼死你,,他妈的

    Reply

  42. COLD CASE » Blog Archive » AJAX Design Patterns  on June 14th, 2006

    [...] read more | digg story Explore posts in the same categories: coldcase [...]

    Reply

  43. The Art Of Mind :: AJAX, Get Started, Resources & Tutorials :: June :: 2006  on June 22nd, 2006

    [...] AJAX Pattern for websites, a fascinating tutorial to build a community portal using AJAX alone. [...]

    Reply

  44. Fading Roses & Raging Viruses » Site design using Prototype  on July 4th, 2006

    [...] This is why in this tutorial I’ll try to give you an idea on how the actual design works. I’ll be heavily relying on my last tutorial for the layout of the final application, but we’ll go much more into detail about the decisions we take. Some parts may be applicable to non-Web-2.0 Web design and some even come in handy when designing completely non-web related applications [...]

    Reply

  45. Sammy  on July 14th, 2006

    Great!

    As I am a newbie, what tools to be used for Ajax development?

    Reply

  46. worzelhund  on July 20th, 2006

    Great Script,

    Buuuut, Whats about URL Parameters for php scripts i.e.?

    Reply

  47. worzelhund  on July 20th, 2006

    Aaand What is this: uri: "/", =)

    Reply

  48. Programming » AJAX Design Patterns  on August 23rd, 2006

    [...] In this tutorial we describe how to build a modularized architecture to create complex AJAX Applications. Unlike most of the AJAX tutorials we focus on the design and implementation of a whole application and not on the low level details.read more | digg story [...]

    Reply


Leave a Reply