AJaX for weblogs

The Asynchronous JavaScript + XML (AJaX) solution is one that can bring happiness and bliss to web designers and web developers alike. However, as with many whiz-bang solutions caution is advised. Google uses it to great effect and personally I think they take it a bit too far. If a page changes in a way that its context changes then it should move to a new URI. People often bookmark content within a specific context. As soon as this is no longer true it maybe a clue that you’ve gone to far.

The first thing I noticed is that remote scripting seems tylormade for the heavier and more complicated web applications. Not surprising. Web applications suffer from the constraints that web browser impose on them. This solution gives them a way to check for dynamic content without reloading the current page. Ajax, to a point, releaves the developers from the back button burdon.

‘So what does this remote script thingy do then?’ I here you ask.

Well it’s very simple. It uses Javascript to get data from a remote source usually some serverside script and then loads it’s output into a specified target. Whatever content you like to wherever you like on the page.
Jesse James Garrett of Adaptive Path has written an essay that covers the basics and provides more information on AJaX.

But lets get this sucker running, that’s the fun bit. And it’s pretty easy.

Step 1

Check if your web client can actually handle the http requests. We’ll need to use a Javascipt to do this.
(I niked this from somebody, but for the life of me I can’t remember from who.)

var ajax=false;
/*@cc_on @*/
/*@if (@_jscript_version >= 5)
try {
ajax = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
ajax = new ActiveXObject("Microsoft.XMLHTTP");
} catch (E) {
ajax = false;
}
}
@end @*/
if (!ajax && typeof XMLHttpRequest!=‘undefined’) {
ajax = new XMLHttpRequest();
}

Step 2

Add the script that will pick up your data. In this case I’m not picking up XML data. But the weblog of your choice and in my case it’s ExpressionEngine will return the xHTML Which in turn will be inserted via the javascript innerHTML methode.

function getMyHTML(serverPage, objID) {
if((serverPage.indexOf("http://www.yourdomain.com/")!=0)) return;
var obj = document.getElementById(objID);
ajax.open("GET", serverPage);
ajax.onreadystatechange = function() {
if (ajax.readyState == 4 && ajax.status == 200) {
obj.innerHTML = ajax.responseText;
}
  }
  ajax.send(null);
}


Step 3

The page that will display the dynamic content will need a placeholder element (tag) with a unique ID. The ID attribute will be used in the second script as a reference point to allow for insertion of the new dynamic content.

<html>
  <head>
  <title>AJaX test</title>
  </head>
  <body onload=“getMyHTML(‘serverpage.php’,‘placeholder’)”>
  <div id=“placeholder”>
    <p>The ‘getMyHTML’ script will overwrite
    this paragraph.</p>
  </div>
  </body>
</html>

This URI in the ‘onload’ is the one which will generate the content.


Step 4

The dynamic bit is parsed by the engine of your choice like; Movable Type, Expression Engine, Word Press etc. Of course you can use any other method of collecting content form a database.

In Expression Engine I’m calling a template that collects the data for my calendar. The whole calendar is outputted as HTML and inserted via the script.

Lets say the URI is ‘http://www.yourdomain.com/tempate/pageid/’
This could in fact be a PHP file or any other serverside script solution. The page only needs to return html. Here is an example in PHP.

<?php
echo ‘<p>this is a php echo text</p>’;
?>

And that’s about it. It’s all pretty old school but there you have it.

Update: The infamous Kottke has posted an interesting variation that I think is worth having a look at.

Next entry: IE7, patch or full upgrade?
Previous entry: Expression Engine in full flight