Introduction
AJAX is abbrieviated from Asynchrounous javascript and XML. It's not a new technology, but the implementation of a group of technologies to achieve a seamless interaction between client and server.
Typically, xhtml and css to present the information, javascript is used to handle user interactions, and a server side language to perform the users' requests (and normally return data in XML format, in this tutorial, we won't do that), and it all is happening in the background using the Javascript XMLHttpRequest. Javascript plays a main role tie all these technologies together and create the asynchronous interaction between client ans server.
AHAH (Asynchrounous HTML and HTTP) is a subset of AJAX which is another technique, Inspite of retreiving XML, AHAH is retreiving HTML content. Both of them are basically the same, the only difference is the content it returns. Generally, most people will simply call it AJAX, but technically, we should call it AHAH. In this tutorial, AHAH is used.
The Good, Bad and Solutions
The Goodies:
- Reduce connections and bandwidth to the server, images, scripts, stylesheets only need to be downloaded once
- Reduce loading timew. User doesnt have to load pages again and again, it all happens in a same page!
- Increase responsiveness and end user experiences.
The Badies:
- Browser Back button. AJAX web pages cannot connect with browser history engine. If you clicked on back button, you can't navigate those AJAX content.
- Bookmark will not work on AJAX webpages. Due to the dynamic content, you might bookmark the homepage instead of the desired page.
- Javascript is needed. To run AJAX based website, your browser need to have javascript enabled.
The Solutions:
AJAX is not a perfect technology, but some of the limitations can be overcame with some simple solutions. I found this very userful plugin called jquery.history.js. It solves Browser Back Button. For the bookmark problem, we can solve it by appending a hash value in the end of the url.For the last one - javascript, we are going to ignore it. It can be done but I want to keep this tutorial simple.
And, of course, you'll need a good web server as well, if you're hunting for a web hosting company, you can click here to read reviews about the best web hosting out there! iPage Review
Requirements
You will need the following items and environment to run this script
- Web server with PHP support - XAMPP (mac, win and linux)
- jQuery
- history.js
1. HTML
I will provide two versions of HTML code. The first one is the most basic elements you will need to get it working. And the last one is the one I created with some design
Simplified versions<ul> <li><a href="#page1" rel="ajax">Home</a></li> <li><a href="#page2" rel="ajax">Portfolio</a></li> <li><a href="#page3" rel="ajax">About</a></li> <li><a href="#page4" rel="ajax">Contact</a></li> </ul> <div class="loading"></div> <div id="content"> <!-- Ajax Content --> </div>
2. CSS
This is really really simple, just have to keep the loading and content hidden
#loading { background: url(images/load.gif) no-repeat; display:none; } #content { font-family:arial; font-size:11px; display:none; }
3. Javascript
I have added comments in every single lines of the code.
$(document).ready(function () { //Check if url hash value exists (for bookmark) $.history.init(pageload); //highlight the selected link $('a[href=' + document.location.hash + ']').addClass('selected'); //Seearch for link with REL set to ajax $('a[rel=ajax]').click(function () { //grab the full url var hash = this.href; //remove the # value hash = hash.replace(/^.*#/, ''); //for back button $.history.load(hash); //clear the selected class and add the class class to the selected link $('a[rel=ajax]').removeClass('selected'); $(this).addClass('selected'); //hide the content and show the progress bar $('#content').hide(); $('#loading').show(); //run the ajax getPage(); //cancel the anchor tag behaviour return false; }); }); function pageload(hash) { //if hash value exists, run the ajax if (hash) getPage(); } function getPage() { //generate the parameter for the php script var data = 'page=' + document.location.hash.replace(/^.*#/, ''); $.ajax({ url: "loader.php", type: "GET", data: data, cache: false, success: function (html) { //hide the progress bar $('#loading').hide(); //add the content retrieved from ajax and put it in the #content div $('#content').html(html); //display the body with fadeIn transition $('#content').fadeIn('slow'); } }); }
4. PHP
We will not go further on PHP code, this time, I'm using a basic switch to grab the content. The content for the page is being assigned to a variable called "page". And the last line, output the content.
To debug the php script, you can access it by passing data into it, for example:
http://www.someurl.com/loader.php?page=page1
It should display the content for page1. If you know about php and database, you can store the content in the database and retrieve it. Make a simple form to edit the content and BANG... you got yourself a customized content management system.
//Get the page parameter from the url switch($_GET['page']) { case 'page1' : $page = 'Page 1'; break; case 'page2' : $page = 'Page 2'; break; case 'page3' : $page = 'Page 3'; break; case 'page4' : $page = 'Page 4'; break; } echo $page;
Conclusion
That's it. Make sure you check out the demo and download the source code and play with it. If you have created your own, feel free to drop your link in the comment section to show off! : )
Last but not least, I need your support :) If you like this article, please help me to promote it by adding this post to your bookmark. Or you can subscribe to my RSS for more jQuery tutorial and design inspiration posts! Thanks!
Comments will be moderated and
rel="nofollow"
will be added to all links. You can wrap your coding with[code][/code]
to make use of built-in syntax highlighter.and also the content of all the pages are loading at once.....check your download .zip files again.......
and this one didnt work for me
//Get the page parameter from the url
switch($_GET['page']) {
case '#page1' : include 'page1.html';
break;
case '#page2' : include 'page2.html';
break;
case '#page3' : include 'page3.html';
break;
case '#page4' : include 'page4.html';
break;
}
http://www.apachefriends.org/en/xampp-windows.html
Can you try to access to your page by using the loader directly?
http://www.someurl.com/loader.php?page=page1 (you will have to change page1 according to your setup)
Use firebug "Net" tab to see if the jquery script calling loader.php. You should able to see data passed to loader.php and also data returned by it.
Let me know how it goes.
i have started to implement on my website. but i have to confess without knowing php its useless to working on it.
i really appreciated for your help.
A work around I found was binding the scripts to the ajax after I called them. For this, I think you can bind whatever callback you want to be done.
I believe this could work:
change
//add the content retrieved from ajax and put it in the #content div
$('#content').html(html);
to
//add the content retrieved from ajax and put it in the #content div
$('#content').load(html,function(){
$("#button").click(function(){ //Locate the button within the loaded content
//Whatever validation or clickage you want to be done
})
});
This *should* allow for whatever post pages called with ajax to see that it you want addition actions to be taken upon it.....or i could be completly wrong and things may blow up.
<?
switch($_GET['page']) {
case 'bio' : $page = include ($_SERVER['DOCUMENT_ROOT'].'/bio/index.php'); break;
case 'clients' : $page = include ($_SERVER['DOCUMENT_ROOT'].'/clients/index.php'); break;
case 'portfolio' : $page = include ($_SERVER['DOCUMENT_ROOT'].'/portfolio/index.php'); break;
case 'contact' : $page = include ($_SERVER['DOCUMENT_ROOT'].'/contact/index.php'); break;
}
?>
From there I wanted to allow for Deep Linking and this script will do the trick:
<?php
if( isset( $_SERVER['HTTP_X_REQUESTED_WITH'] ) && ( $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' ) )
{
} else {
header("Location: ../#/portfolio");
}
?>
Where it says header (Location etc. just put where you want the page to redirect to. This should be the first thing on the page. In this example the first thing on the Portfolio page.
This way you can send out a link without a hash. So for example http://44lizards.com/portfolio deep links to http://44lizards.com/portfolio
Thank you,
Ian
Thanks in advance
http://php.net/manual/en/function.include.php
I then tried placing a string for example placeload("#home") or the full url place("/#home"); but nothing worked.
Any help? (im using include to load my pages)
if(window.location.pathname=="/") window.location.replace("/#home");
but im not sure if its a good permanent option
<li><a href="#page4" rel="ajax" title="Contact Title Put Here">Contact</a></li>
Then, inside this: $('a[rel=ajax]').click(function () {
add this line:
$('title').html($(this).attr('title'));
Should work.
I would like to ask you for a solution for a blank first page, preferrably inside the javascript part..
best regards
This is an example from my loader page.
switch($_GET['page']) {
/*------------------------ ------------------------ ------------------------ ------------------------ */
case '#YELLOW' :
$page = '
<div id="slider">
<ul>
<li><a href=""><img src="http://localhost/easy/archive/YELLOW/images/1.jpg" alt="" /></a></li>
<li><a href=""><img src="http://localhost/easy/archive/YELLOW/images/2.jpg" alt="" /></a></li>
<li><a href=""><img src="http://localhost/easy/archive/YELLOW/images/3.jpg" alt="" /></a></li>
</ul>
</div>
<script type="text/javascript">
$(document).ready(function(){
$("#slider").easySlider();
});
</script>
';
break;
I am pretty sure that the problem is with passing the javascript through the ajax, although at times it seems like a css error.
I also read somewhere that I should use the eval(); function, but I am not sure really how that would work.
Thanks for the help in Advance.
<script type="text/javascript">
$("#slider").easySlider();
</script>