异步的JavaScript和XML
Ajax对象的创建
实现程序:
var oBtn = document.getElementById('bt');
oBtn.noclick = function(){
var xhr = new XMLHttpRequest();
xhr.open('get','1.txt',true);
xhr.send();
xhr.onreadystatechange = function(){
if(xhr.readyState == 4){
alert(xhr.responseText);
}
}
浏览器兼容ajax对象
在ie6中不支持XMLHttpRequest对象的使用,所以考虑兼容问题
方法一:判断是否支持Ajax对象
方法一:判断是否支持Ajax对象而你采取不同方式
var oBtn = document.getElementById('bt');
oBtn.noclick = function(){
/*
1.创建一个Ajax对象
ie6以下new ActiveXObject('Microsoft.XMLHTTP');
*/
var xhr = null;
if(window.XMLHttpRequest){//判断是否支持Ajax对象
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);
}
}
方法二:采取异常机制try catch
var oBtn = document.getElementById('bt');
oBtn.noclick = function(){
/*
1.创建一个Ajax对象
ie6以下new ActiveXObject('Microsoft.XMLHTTP');
*/
var xhr = null;
try{
xhr = new XMLHttpRequest();
}catch(e){
xhr = new ActiveXObject('Microsoft.XMLHTTP');
}
xhr.open('get','1.txt',true);
xhr.send();
xhr.onreadystatechange = function(){
if(xhr.readyState == 4){
alert(xhr.responseText);
}
}
open()方法和表单
表单
表单:数据的提交
action : 数据提交的地址,默认是当前页面
method : 数据提交的方式,默认是get方式
1.get
把数据名称和数据值用=号连接。多个数据用&串联。数据是显示传送到后台的
url长度限制的原因,我们不要通过get方式传递过长的数据
2.post
理论上长度无限制,可以修改。
enctype:数据提交的格式,默认格式为applicatiom/x-www-form-urlencoded
代码:
<body>
<form action="1.get.php" method="get">
<input type="text" name="username"/>
<input type="submit" value="提交" />
</form>
</body>
open( )
open(para1,para2,para3)
para1:发送方式
para2:请求资源文件
para3:同步和异步模式
同步:阻塞模式
异步:非阻塞模式
等待服务器返回
请求状态监控
readyState : ajax工作状态
responseText: ajax请求返回的内容
readystatechange:对于服务器状态的监听,当readyState状态只发生改变是触发
**容错处理**
XMLHttpRequst.status:服务器状态,http状态码,比如404,102等等
xhr.onreadystatechange = function(){
if(xhr.readyState == 4){
if(xhr.status == 200){//容错处理
alert(xhr.responseText);
}else{
alert("出错了");
}
}
}
数据的传递JSON
客户端:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>ajax_demo1</title>
</head>
<body>
<input id="Bt" type="button" value="按钮" />
<ul id="ul1"></ul>
<script type="text/javascript">
window.onload = function(){
var oBtn = document.getElementById('Bt');
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);
var oUl = document.getElementById('ul1');
var html = '';
for (var i=0; i<data.length; i++) {
html +='<li><a href="#">'+data[i].title+'</a>[<span>'+data[i].date+'</span>]</li>';
}
oUl.innerHTML = html;
}else{
alert("出错了ERR" + xhr.status);
}
}
}
}
}
</script>
</body>
</html>
注意:ie7及以下的IE浏览器不支持JSON对象,需要到官网下载文件以便是ie7以下的浏览器支持JSON对象。
服务器端:
这里写代码<?php
header('content-type:text/html;charset="utf-8"');
error_reporting(0);
$news = array(
array('title'=>'上海10月8日起调整出租车运价 起租价调为','date'=>'2014'),
array('title'=>'德国收紧巴尔干难民法律 加强边境管制','date'=>'2015'),
array('title'=>'中国逮捕两名日本间谍嫌疑人 或判死刑','date'=>'2014'),
array('title'=>'泪目!学生时代最后悔没做的22件事','date'=>'2014'),
array('title'=>'庞贝古城木乃伊接受CT扫描 死前惊恐表情曝光','date'=>'2014'),
array('title'=>'南京虐童案养母被判刑6个月(图)','date'=>'2014'),
);
echo json_encode($news);//以JSON对象返回
以下代码运行成功,实现每秒自动刷新数据显示
json.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>ajax_demo1</title>
<script src="./ajax.js" type="text/javascript"></script>
</head>
<body>
<input id="Bt" type="button" value="按钮" />
<ul id="ul1"></ul>
<script type="text/javascript">
window.onload = function(){
var oBtn = document.getElementById('Bt');
oBtn.onclick = function(){
ajax('get','getNews.php','',function(data){
var data = JSON.parse(data);
var oUl = document.getElementById('ul1');
var html = '';
for (var i=0; i<data.length; i++) {
html +='<li><a href="#">'+data[i].title+'</a>[<span>'+data[i].date+'</span>]</li>';
}
oUl.innerHTML = html;
});
setInterval(function(){
ajax('get','getNews.php','',function(data){
var data = JSON.parse(data);
var oUl = document.getElementById('ul1');
var html = '';
for (var i=0; i<data.length; i++) {
html +='<li><a href="#">'+data[i].title+'</a>[<span>'+data[i].date+'</span>]</li>';
}
oUl.innerHTML = html;
});
},1000)
}
}
</script>
</body>
</html>
ajax.js
function ajax(method, url, data, success){
var xhr = null;
//浏览器是否支持XMLHttpRequest对象
if(window.XMLHttpRequest){
xhr = new XMLHttpRequest();
}else{
xhr = new ActiveXObject('Microsoft.XMLHTTP');
}
//请求方式的不同,传参方式的不同
if(method == 'get' && data){
url += '?' + data;
}
xhr.open(method,url,true);
if(method == 'get'){
xhr.send();
}else{
xhr.setRequestHeader('content-type','applicatiom/x-www-form-urlencoded');
xhr.send(data);
}
xhr.onreadystatechange = function(){
if(xhr.readyState == 4){
if(xhr.status == 200){
//判断是否传入函数,并执行回调success函数
success && success(xhr.responseText);
}else{
alert("出错了ERR" + xhr.status);
}
}
}
}
getNews.php
<?php
header('content-type:text/html;charset="utf-8"');
error_reporting(0);
$news = array(
array('title'=>' 起租价调为df ','date'=>'2014'),
array('title'=>'德国收紧巴尔干难民法律 加强边境管制','date'=>'2015'),
array('title'=>'中国逮捕两名日本间谍嫌疑人 或判死刑','date'=>'2014'),
array('title'=>'泪目!最后悔没做的22件事','date'=>'2014'),
array('title'=>'庞贝古城木乃伊接受CT扫描 死前惊恐表情曝光','date'=>'2014'),
array('title'=>'南京虐童案养母被判刑6个月(图)','date'=>'2014'),
);
echo json_encode($news);//以JSON对象返回