var oBtn = document.getElementById("btn");oBtn.onclick = function(){var xhr = null;if(window.XMLHttpRequest){xhr = new XMLHttpRequest();}else{xhr = new ActiveXObject(‘Microsoft.XMLHTTP");}xhr.open("get","1.txt",true); //设置请求信息 xhr.send();//提交请求//等待服务器返回内容 xhr.onreadystatechange = function() { if ( xhr.readyState == 4 ) { //如果内容响应成功,并解析完成alert( xhr.responseText ); //弹出内容 } }}下面我们就讲到 ,xhr.send();这一句呢才是真正请求数据的,open方法只是设置了一些请求参数。
所以我们的代码要做进一步的改进
var oBtn = document.getElementById("btn");oBtn.onclick = function(){var xhr = null;if(window.XMLHttpRequest){xhr = new XMLHttpRequest();}else{xhr = new ActiveXObject("Microsoft.XMLHTTP");}xhr.open("get","1.txt",true); //设置请求信息 xhr.send();//提交请求//等待服务器返回内容 xhr.onreadystatechange = function() { if ( xhr.readyState == 4 ) { if(xhr.status == 200) {//如果响应成功,并且服务器相应内容正确alert( xhr.responseText );//弹出内容 }else{alert("出错了" + xhr.status); //否则告知出错并弹出错误原因} }}Ajax的大概流程就是这样的。当然还存在一些细节方面的问题需要注意的,继续往下看把。
xhr.open("get","1.get.php?username=沐晴&age=21",true);后台代码不变
<?phpheader("content-type:text/html;charset="utf-8""); //设置编码格式,以及文档类型error_reporting(0);$username = $_GET["username"];//获取get请求方式的数据$age = $_GET["age"];echo "你的名字:{$username},年龄:{$age}"; //输出内容现在点击肯定会弹出你的名字沐晴,年龄21 了。
echo "欢迎,你的名字:{$username},年龄:{$age}"; //输出内容虽然后台代码变了,但是GET请求访问网址依然是 1.get.php?username=沐晴&age=21,所以后台会去浏览器缓存找,结果弹出的还是原来的。大家可以自行测试。
xhr.open("get","1.get.php?username=沐晴&age=21&"+new.Date.getTime(),true);这样就不会存在缓存问题了。有些人会这样写,会在后面给它起个名字t,这个时候如果后台也有个变量叫t,可能就会出问题了,所以不是很推荐。
xhr.open("get","1.get.php?username=沐晴&age=21&t="+new.Date.getTime(),true);post 请求
xhr.setRequestHeader("content-type", "application/x-www-form-urlencoded");xhr.send("username=沐晴&age=21&");无缓存问题,因为单单是往服务器提交数据,提交数据是不会被缓存的,获取数据才会被缓存。这就是web的机制。
<?phpheader("content-type:text/html;charset="utf-8"");error_reporting(0);$arr1 = array("le","mo"); // 索引类型的数据$arr2 = array("username"=>"le","age"=>32); // 2 对应关系的数据echo json_encode($arr1); // ["le","mo"] 索引类型 输出为数组格式echo json_encode($arr2); // {"username":"le","age":32} 对应关系的数据 输出为json格式虽然后端输出的内容格式上是数组和json但是我之前提到过 alert( xhr.responseText );//这里弹出的可都是字符串类型,所以尽管格式上看着是json和数组,但实际的数据类型还是字符串。
<!DOCTYPE HTML><html><head><meta charset=utf-8"><title>无标题文档</title><!--<script src="jquery.js"></script>--><script>window.onload = function() {var oBtn = document.getElementById("btn"); oBtn.onclick = function() {var xhr = null;if(window.XMLHttpRequest){xhr = new XMLHttpRequest();}else{xhr = new ActiveXObject("Microsoft.XMLHTTP");} xhr.open("get","getNews.php",true);xhr.send();xhr.onreadystatechange = function() {if ( xhr.readyState == 4 ) {if ( xhr.status == 200 ) {//alert( xhr.responseText ); 后端传来的格式是一个数组里面很多条json 自己可以测试下var data = JSON.parse( xhr.responseText ); // 将后台获取的内容转为json类型 每一个json里面有两个键:title和datevar oUl = document.getElementById("ul1"); //获取显示新闻列表的节点var html = "";for (var i=0; i<data.length; i++) { // 循环所有的json数据,并把每一条添加到列表中html += "<li><a href="">"+data[i].title+"</a> [<span>"+data[i].date+"</span>]</li>";}oUl.innerHTML = html; //把内容放在页面里} else {alert("出错了,Err:" + xhr.status);}}}}}</script></head><body><input type="button" value="按钮" id="btn" /><ul id="ul1"></ul></body></html> <?phpheader("content-type:text/html;charset="utf-8"");error_reporting(0);$news = array(array("title"=>"女总理默克尔滑雪时摔倒 骨盆断裂","date"=>"2014-1-6"),array("title"=>"驻英外交官撰文互称对方国家为"伏地魔"","date"=>"2014-1-6"),array("title"=>"安倍:望与中国领导人会面 中方:你关闭了大门","date"=>"2014-1-6"),array("title"=>"揭秘台湾驻港间谍网运作 湖北宜昌副市长被查","date"=>"2014-1-6"),array("title"=>":嫦娥三号是货真价实的中国创造","date"=>"2014-1-6"),);echo json_encode($news);好了今天的Ajax就唠到这,希望大家有所收获,如果有错误的希望大家指正,看到好多人看头像进来的,伦家真是不知道说什么,还是希望大家能理性多提点意见拉拉,下次会讲下对于Ajax的封装,以及一些实际应用。