Difference between revisions of "JavaScript"
Line 5: | Line 5: | ||
=Asynchronous JavaScript And XML= | =Asynchronous JavaScript And XML= | ||
− | AJAX is a | + | AJAX, Asynchronous Javascript And XML, is a group of related web development techniques, standards, and technologies used on the client (web browser) side of the standard web server-client communication model. Although other languages can be used, the most common is to use javascript to send asynchronous requests to the web server in order to retrieve XML data that the javascript then uses to produce dynamic, fast, user-friendly web pages. The key idea is that most of the work happens at the web browser, keeping waiting times for data to come back over the network to a minimum. |
− | XMLHttpRequest is supported by all | + | The javascript ''XMLHttpRequest'' object is used to exchange data with the web servers without needing to reload the entire web page in the browser. This ''XMLHttpRequest'' object is now supported by all major browsers, although some browsers implement support in slightly different ways, leading to different behavior of the same code on different platforms. For this course, you should focus on supporting Firefox, but in any real production website it's very important to do validation testing using all of the major browsers including Firefox, Internet Explorer, Safari, and Opera as a minimum. |
== XMLHttpRequest Object == | == XMLHttpRequest Object == |
Revision as of 20:27, 19 September 2009
Contents
Javascript
You should start by reading the w3schools javascript tutorial, which covers most of the important features of the language:
http://www.w3schools.com/js/default.asp
Asynchronous JavaScript And XML
AJAX, Asynchronous Javascript And XML, is a group of related web development techniques, standards, and technologies used on the client (web browser) side of the standard web server-client communication model. Although other languages can be used, the most common is to use javascript to send asynchronous requests to the web server in order to retrieve XML data that the javascript then uses to produce dynamic, fast, user-friendly web pages. The key idea is that most of the work happens at the web browser, keeping waiting times for data to come back over the network to a minimum.
The javascript XMLHttpRequest object is used to exchange data with the web servers without needing to reload the entire web page in the browser. This XMLHttpRequest object is now supported by all major browsers, although some browsers implement support in slightly different ways, leading to different behavior of the same code on different platforms. For this course, you should focus on supporting Firefox, but in any real production website it's very important to do validation testing using all of the major browsers including Firefox, Internet Explorer, Safari, and Opera as a minimum.
XMLHttpRequest Object
XMLHttpRequest provides the communication with the remote servers. Hence, the first thing you need is to initialize it.
var xmlHttp; xmlHttp=new XMLHttpRequest();
Once you have an XMLHttpRequest, you can use it to send data to a server. Initially, you need to connect your server side page:
xmlHttp.open("METHOD","REMOTE_URL",ASYNCRONOUS_FLAG);
where METHOD is "GET" or "POST", REMOTE_URL is the page that you want to communicate and ASYNCRONOUS_FLAG is whether the call is going to asyncronous. In asyncronous communication, you can let your client do other things while waiting for server response. Once you have the object initialized, you can then use send method to send your request. Note that, there is not explicit data setting. That is because you send your data withing the url.
xmlHttp.send(null);
XMLHttpRequest object has an attribute readyState that stores the state of the current status.
State | Description |
---|---|
0 | The request is not initialized |
1 | The request has been set up |
2 | The request has been sent |
3 | The request is in process |
4 | The request is complete |
For example, when a request is sent, the state is set to 3. Every time its state change,the object calls a function specified by the attribute onreadystatechange. So before calling a remote site, you should setup a new function:
xmlHttp.onreadystatechange=function() { alert('state changed to '+xmlHttp.readyState); }
This is where the asyncronousity comes. Once you send a request, you access the response only onreadystatechange function. Meanwhile, your client page can be doing other things. If you are waiting for a response from the server, you should check whether the readyState is 4, corresponding to completed request. The server response is returned at XMLHttpRequest's responseText attribute.
xmlHttp.onreadystatechange=function() { if(xmlHttp.readyState==4){ .... do some cool stuff ... } }
For example, lets assume you have following html file server.html
<html>
<body>
hello world
</body>
</html>
This server page just prints hello world message.
Here is an AJAX implementation that gets the message from the server and prints it.
<html>
<body>
<script>
var xmlHttp;
xmlHttp=new XMLHttpRequest();
xmlHttp.open("GET","server.html",true);
xmlHttp.onreadystatechange=function() {
if(xmlHttp.readyState==4){
var pElement=document.getElementById("msg");
pElement.innerHTML=xmlHttp.responseText;
}
}
xmlHttp.send(null);
</script>
<p id="msg"></p>
</body>
</html>
Sending Parameters
The parameters are send either in the url (to, for example, a PHP page) or through send function. Consider following PHP code that takes two parameters, multiplies them and return the result.
multiply.php
<html>
<body>
<? echo $_GET["x"]*$_GET["y"]?>
</body>
</html>
We can then use AJAX to get the multiplication of two numbers:
multiply-ajax.php
<html>
<body>
<script>
function multiply (){
var xmlHttp;
xmlHttp=new XMLHttpRequest();
var x,y;
x=document.getElementById("input_x").value;
y=document.getElementById("input_y").value;
xmlHttp.open("GET","multiply.php?x="+x+"&y="+y,true);
xmlHttp.onreadystatechange=function() {
if(xmlHttp.readyState==4){
var pElement=document.getElementById("msg");
pElement.innerHTML=xmlHttp.responseText;
}
}
xmlHttp.send(null);
}
</script>
x:<input id="input_x" type="text"/ ><br>
y:<input id="input_y" type="text"/>
<a href="javascript:multiply();">Multiply</a>
<br>
------------------------</br>
Result:
<p id="msg"></p>
</body>
</html>
Note that x and y values are sent in url. You can also send them in send function, provided that your receiving page asumes they are form posts.
multiply-post.php
<html>
<body>
<? echo $_POST["x"]*$_POST["y"]?>
</body>
</html>
multiply-ajax.php
<html>
<body>
<script>
function multiply (){
var xmlHttp;
xmlHttp=new XMLHttpRequest();
var x,y;
x=document.getElementById("input_x").value;
y=document.getElementById("input_y").value;
var req="x="+x+"&y="+y;
xmlHttp.open("POST","multiply.php",true);
xmlHttp.onreadystatechange=function() {
if(xmlHttp.readyState==4){
var pElement=document.getElementById("msg");
pElement.innerHTML=xmlHttp.responseText;
}
}
xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlHttp.setRequestHeader("Content-length", req.length);
xmlHttp.setRequestHeader("Connection", "close");
xmlHttp.send(req);
}
</script>
x:<input id="input_x" type="text"/ ><br>
y:<input id="input_y" type="text"/>
<a href="javascript:multiply();">Multiply</a>
<br>
------------------------</br>
Result:
<p id="msg"></p>
</body>
</html>
Moving a target with Jquery
<html>
<head>
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
<script type="text/javascript">
// these are for storing target locations
var targetLeft=0;
var targetTop=0;
function moveTarget(){
targetLeft+=10; //increase target location
targetTop+=10;
$("#target").css("top",targetTop); //move target to (top,left)
$("#target").css("left",targetLeft);
if(targetLeft<200) { //stop if we reached left=200
window.setTimeout("moveTarget()",200); //set the next timer
}
}
$(document).ready(function() { //at the beginning create a clock timeout
window.setTimeout("moveTarget()",200); //call this function in 200 ms.
});
</script>
</head>
<body>
<!-- this is my target-->
<img id="target" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/85/Smiley.svg/180px-Smiley.svg.png" style="position:relative"/>
</body>
</html>