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. bueroeinsnull|blog » Blog Archive » ajax  on August 30th, 2006

    [...] Ajax Design Patterns: Fading Roses & Raging Viruses [...]

    Reply

  2. bueroeinsnull|blog » Blog Archive » //ajax  on August 30th, 2006

    [...] Ajax Design Patterns: FadingRoses & Raging Viruses [...]

    Reply

  3. Greg  on September 2nd, 2006

    Many thanks for tutorial and code.

    Reply

  4. John Andersen  on September 18th, 2006

    Thank you for a good turtorial!
    Unfortunately it does not cover the issue, where javascript is not available and thus the developed site will not work!
    If you have to use AJAX, ensure that your site will work the same with and without javascript!
    And before you ask :D , yes, I am developing a site that does exactly that.
    Best wishes,
    John, Latvia

    Reply

  5. Snyke  on September 18th, 2006

    Thanks for your feedback, it helps improving for the future.
    Downgradability has been a big issue with Ajax applications and I think the nicest solution until now is the behaviour library of Ben Nolan. It helps keeping the Javascript side separated from the actual HTML code and allows you to dynamically change the behaviour (thus the name ^^) of elements.
    Give it a try, it will help ^^

    Reply

  6. Javascript-Channel.com / AJAX  on September 20th, 2006

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

    Reply

  7. Goresan Tinta Mucharom :: 30 Links to AJAX Tutorials :: September :: 2006  on September 26th, 2006

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

    Reply

  8. Huge list of Ajax tutorials | Ajax Blog  on October 2nd, 2006

    [...] Ajax Design Patterns at Snyke [...]

    Reply

  9. All Cusco | Blog » Blog Archive » Top - 126 tutoriales Ajax  on October 2nd, 2006

    [...] Ajax Design Patterns : at Snyke [...]

    Reply

  10. Ajax Tutorials « Blooming Webs  on October 7th, 2006

    [...] Slide Show with Controls at ZapatecCreate Your Own Ajax Effects animated text; at ThinkVitamin Make all your tables sortable at Kryogenix Ajax Design Patterns at Snyke [...]

    Reply

  11. TechnoRepublic » Blog Archive » Top 126 AJAX Tutorial  on October 7th, 2006

    [...] Ajax Design Patterns : at Snyke [...]

    Reply

  12. Good AJAX Tutorials at A.JAX  on October 15th, 2006

    [...] Ajax Design Patterns : at Snyke [...]

    Reply

  13. Fading Roses & Raging Viruses »  on October 17th, 2006

    [...] [::[ Tue 17 Oct 2006 ]::[ General ]::[ ]::] Back in february when I wrote my first two tutorials on how to build an Ajax Portal, I explained how to make the pages bookmarkable. Bookmarks in Ajax Applications are very different from bookmarks in Web 1.0. In classic Web applications bookmarks pointed to a Resource (always remember that URI stands for Uniform Resource Identifier) and that was really why bookmarks were (and still are) so usefull, you could save the URL, come back later and find the same content, send it to a friend and he would see the same thing as you did, this sharing is really popular today (see Digg.com and del.icio.us). Bookmarks in Ajax Applications go far beyond this resource identification, they conceptually save the state of the Ajax Application itself, so that the state can be resumed at a later time. Going back to the example I used in the tutorials, the currently displayed content will certainly be important to save, so saving the currently displayed document in the URL is important, on the other hand the automagically updating list of online users is not context relevant and is not important to save to the URL. in fact the user list is volatile, updates independently from the page itself and would be a complete overkill to put into your URL.To sum it up:KISS: Keep it simple stupid, don’t overload the URLs with useless state information that isn’t necessary. Creating too many differing URLs is not good coding style, keep them short and easy to remember, even better if it is something that makes sense.The reason why I write this article is that just today I received a comment on my old tutorial asking how to save Form data in the URL. First of all: it wasn’t possible in Web 1.0, why should you want to in Web 2.0? Forms submitted with the POST-Method isn’t saved in classic URLs either, and we never complained about this. In Web 2.0 we now have to first answer a conceptual question: is the data sent from the Form worth saving to the URL? If I have a Registration Form I wouldn’t want a user to be able to save the Page after the Form, because it would mean that every time he opens this page it would issue a new Registration request. Where saving Form data may be relevant is a Search feature where the searchtherm is saved, but again this is no big deal because you can simply add a parameter to the URL.Although the difference may be subtle it is still important to keep this in mind, there are things that are nice to be bookmarkable, others aren’t, the question of what is best is to be answered by you when developing [...]

    Reply

  14. H.G.M. Blog » Blog Archive » Helpful tutorials to learn Ajax.  on October 25th, 2006

    [...] Ajax Design Patterns : at Snyke [...]

    Reply

  15. Pawan  on October 25th, 2006

    Hi..

    Its a good help…

    Will get back with some Ajax related issues

    Reply

    • Trevon  on December 13th, 2011

      You have the monopoly on useful ifnomtraion-aren’t monopolies illegal? ;)

      Reply

  16. Raman  on October 26th, 2006

    Simply great demonstration. I am planning to implement what you wanted to do. Though I dislike incorporating DOJO here. But its OK.

    Reply

  17. Ajax Girl » Huge list of Ajax tutorials  on November 10th, 2006

    [...] Ajax Design Patterns at Snyke [...]

    Reply

  18. David Escorts  on November 15th, 2006

    Great tutorial. Ajax is the future. Hope this tut helps me. Thx.

    Reply

  19. Lautreamont  on November 15th, 2006

    Wow! I’ll try to use some of this in next theme for my site. Just hope this does not become to hard for an Ajax newbie like me.

    Thanks so much, dude.

    :o ]

    Reply

  20. James  on November 21st, 2006

    Hi All Experts,
    I want to use AJAX (Asynchronous JAVA script with XML ). How can i Optimize the site SEO.
    as Java script and flash is not recommended by search engines. Any suggestion or help is welcomed. With Regards.

    Reply

  21. DLife » AJAX资料大全  on November 24th, 2006

    [...] AJAX Design Patterns – “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.” by Christian Decker [...]

    Reply

  22. 130 Ajax Tutorials. - Ajax.pro  on November 24th, 2006

    [...] AJAX Design Patterns – “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.” by Christian Decker [...]

    Reply

  23. Amir’s Blog » Blog Archive » A Great List of Ajax Tutorials  on November 25th, 2006

    [...] AJAX Design Patterns – “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.” by Christian Decker [...]

    Reply

  24. JaSk  on November 26th, 2006

    I’ve tried to replicate the example, but I keep getting an error with $ not defined, what can it be?.

    Thanks

    Reply

  25. Christian Decker  on November 26th, 2006

    This might be due that you didn't install the prototype library, try to see if it loads all right and that you did put the right permissions ^^

    Reply

  26. 130 Ajax Tutorials. - Ajax.pro  on November 27th, 2006

    [...] AJAX Design Patterns- “Is this tutorial any different from the others? Well yes and no, itis different in being a tutorial on how to design and build a completesite and not just some fancy little details like how to turn caching inAJAX off or how to create a fancy widget.”by Christian Decker [...]

    Reply

  27. james  on December 3rd, 2006

    Hey,

    when is the next part of your tutorial going to be released.

    Reply

  28. JUST GOOD DESIGN | BLOG » AJAX time!  on December 6th, 2006

    [...] Ajax Design Patterns [...]

    Reply

  29. Huge list of Ajax tutorials at readxml  on December 7th, 2006

    [...] Ajax Design Patterns at Snyke [...]

    Reply

  30. guest  on December 18th, 2006

    你老母

    Reply

  31. Top 126 Ajax Tutorials : Ultimate Web Developer Lists : eConsultant  on December 29th, 2006

    [...] Ajax Design Patterns : at Snyke [...]

    Reply

  32. 137.sunnyjacob.co.uk » Blog Archive » AJAX Tutorials  on February 5th, 2007

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

    Reply

  33. » 100 Ajax Tutorials and Resources - Photoshop Tutorial - The Tutorial Blog  on February 5th, 2007

    [...] Ajax Design Patterns [...]

    Reply

  34. Ajax Plugins » Blog Archive » About for Ajax  on February 11th, 2007

    [...] Ajax Design Patterns: Fading Roses & Raging Viruses [...]

    Reply

  35. Bear  on February 13th, 2007

    I’m trying out this app. Now i would like to load a list with the possible effet of drag and drop… only when the page is loaded into the app it stop working…anyone a idea?

    Reply

  36. Ajax Plugins » Blog Archive » Top 126 Ajax Tutorials  on February 17th, 2007

    [...] Ajax Design Patterns : at Snyke [...]

    Reply

  37. Ajax para tu web!! » |KENAVIK | BLOG  on March 13th, 2007

    [...] Ajax Design Patterns [...]

    Reply

  38. robert  on March 18th, 2007

    hi all. nice blog. its very ineresting article.

    Reply

  39. AJAX Tutorials « designcreatology  on March 20th, 2007

    [...] AJAX Design Patterns – 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. [...]

    Reply

  40. Dicas Neosite » Blog Archive » 138 tutoriais Ajax Javascript gratuitos  on March 24th, 2007

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

    Reply

  41. AJAX Tutorials « Blogtology  on April 8th, 2007

    [...] AJAX Design Patterns – 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. [...]

    Reply

  42. alex  on April 12th, 2007

    hi nice site.

    Reply

  43. SachinKRaj - get something useful from web 100 AJAX & JavaScript Tutorials «  on April 18th, 2007

    [...] Ajax Design Patterns [...]

    Reply

  44. Tutorials « Kunal Vijan  on May 3rd, 2007

    [...] Ajax Design Patterns [...]

    Reply

  45. AJAX Widgets and Tutorials « SKRaghav-Moves with Latest Updates  on May 12th, 2007

    [...] Ajax Design Patterns [...]

    Reply

  46. hebertphp » 138 tutoriais de Ajax e Javascript gratuitos  on May 25th, 2007

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

    Reply

  47. Top 15 Ajax Tutorials : Technical Lists : eConsultant  on June 8th, 2007

    [...] AJAX Design Patterns 02. AJAX Live Search 03. AJAX Q and A on Yedda 04. Ajax tutorial with prototype 05. AJAX vote with [...]

    Reply

  48. decimus  on August 3rd, 2007

    Hi,
    is there any possibility to translate this tutorial to Polish?
    let me know.
    thx in advance!

    Reply

  49. Fading Roses & Raging Viruses » Blog Archive » Ajax, CSS, DOM and JS-related resources  on September 4th, 2007

    [...] Ajax Design Patterns & Site design using Prototype: although I usually don’t plug my own stuf, I’m proud of these two creations So that’s it from my side, if you have more resources you’d like to share with the rest of the world post them on the original article.Popularity: unranked [?] [...]

    Reply

  50. 100 Ajax Tutorials and Resources - Host and web design tools  on September 14th, 2007

    [...] Ajax Design Patterns [...]

    Reply


Leave a Reply