phpAjax

来源:互联网 发布:怎么申请做淘宝客服 编辑:程序博客网 时间:2024/06/05 06:43

一、           Introduction

ajax,asynchronous  javascript and  xml,异步javascript和xml。是可以与服务器进行交互的技术之一。语言载体是javascript。最大特点是页面不刷新,用户体验好。

比如,用户注册时,不刷新提示用户名是否使用。

二、           使用ajax

1.       ajax向服务器发起请求

       function f1(){

              //1,创建ajax对象

              var xhr = newXMLHttpRequest();

              // var xhr = newActiveXObject("Msxml2.XMLHTTP.6.0");

              //2,创建一个新的http请求协议,并设置请求的服务端地址

              //对象.open(请求方式get/post,url服务器地址)

              xhr.open('get','./ajax1.php')

              //3,把http请求发送给服务器

              //对象.send(null/post请求数据)

              xhr.send(null);

       }

2.       ajax接收服务器返回信息

浏览器可以接收的信息,ajax都可以接收,例如字符串、html标签、css样式内容、xml内容、json内容等。需要结合readyState/onreadystatechange/responseText等属性操作。

<!DOCTYPE html>

<html lang="en">

<head>

       <metacharset="UTF-8">

       <title>Document</title>

       <style>

       </style>

       <script>

       function f1(){

              //1,创建ajax对象

              var xhr = newXMLHttpRequest();

              // var xhr = newActiveXObject("Msxml2.XMLHTTP.6.0");

              //2,创建一个新的http请求协议,并设置请求的服务端地址

              //对象.open(请求方式get/post,url服务器地址)

              xhr.open('get','./ajaxres.php')

              //3,把http请求发送给服务器

              //对象.send(null/post请求数据)

              xhr.send(null);

              xhr.onreadystatechange= function(){

                     if(xhr.readyState==4){

                            console.log(xhr.responseText);

                            document.getElementById("getres").innerHTML= xhr.responseText;

                     }

                    

              }

       }

      

       </script>

</head>

<body>

       <h2>ajax发起请求</h2>

       <inputtype="button" value="qingqiu" onclick="f1()"/>

       <div id="getres"></div>

</body>

</html>

php页面

<?php

 

echo "<div style='color:red;''>返回ajax的请求</div>";

3.       get和post方式的ajax请求

get和post的不同

给浏览器传递数据数量,get方式大小受限于浏览器,大部分是2k限制。post原则没有限制,php.ini默认限制为8M。

安全方面,post传递数据相对安全。

传递数据的形式不一样,get方式在url地址后边以请求字符串形式传递参数。post方式是把form表达的数据请求出来以xml形式传递给服务器。

ajax的get请求需要注意,在url地址后边以请求字符串形式传递数据;对中文、=、&等特殊符号处理。在浏览器中通过get参数传递一些特殊符号信息会被误解混淆,例如&、=等。为了避免这种情况,可以对该信息进行编码处理。在php里使用函数urlencode()/urldecode()对特殊符号进行编码,反编码处理。javascript里通过encodeRUIComponent()对特殊符号等信息进行编码。

使用get方式处理编码的例子:

       function checkname(){

              var name =document.getElementById("username").value;

              name =encodeURIComponent(name);

              var xhr = newXMLHttpRequest();

              xhr.onreadystatechange= function(){

                     if(xhr.readyState==4){

                            alert(xhr.responseText);

                     }

                    

              }

              xhr.open('get','./ajaxres.php?name='+name);

              xhr.send(null);

       }

php页面

<?php

 

// echo "<div style='color:red;''>返回ajax的请求</div>";

$arr = array("haha","hehe","heiheie");

// print_r($_GET);

$name = $_GET['name'];

if(in_array($name, $arr)) {

       echo "用户名已经存在";

} else {

       echo "可以使用";

}

post方式发送ajax请求

       function checkname(){

              var name =document.getElementById("username").value;

              // name =encodeURIComponent(name);

              var xhr = newXMLHttpRequest();

              // 把传递到服务其的数据组织为请求字符串

              var info ='name='+name+'&age=12';

              xhr.onreadystatechange= function(){

                     if(xhr.readyState==4){

                            alert(xhr.responseText);

                     }

                    

              }

              xhr.open('post','./ajaxres.php');

              //通过把数据模拟为form表单的样子提交给服务器

              //form表达的数据组织为xml格式传递给服务器端

              xhr.setRequestHeader('content-type','application/x-www-form-urlencoded');

              xhr.send(info);

       }

4.       同步、异步

ajax对象.open(方式get/post,url地址,[异步true]同步false);

ajax可以与服务器进行异步或同步交互。异步,同一个时间点允许执行多个进程;同步,同一个时间点只允许执行一个进程。

绝大多数情况,使用异步请求,有时候也使用同步请求。例如页面有两部分内容,ajax请求内容和html内容输出,如果html内容输出包括ajax请求的内容,就需要使得ajax请求完成了再进行html内容输出,这样就需要一前一后调用,需要同步请求。

三、           ajax无刷新分页效果

使用传统的刷新页面的分页的方式,对带宽、服务器资源、用户等待时间都有额外的损耗,如果使用ajax无刷新分页,对各方面资源的使用都有相应的节省,很必要。

       <scripttype="text/javascript">

       function showPage(url){

              var xhr = newXMLHttpRequest();

              xhr.onreadystatechange= function(){

                     if(xhr.readyState==4){

                            //alert(xhr.responseText);

                            vardivresult = document.getElementById('result');

                            divresult.innerHTML= xhr.responseText;

                     }

              }

              xhr.open('get',url)

              xhr.send(null);

       }

       //页面加载完毕,就获得ajax请求的信息

       window.onload = function(){

              showPage('./data.php?page=1');

       }

 

       </script>

四、           ajax对xml信息的接收和处理

ajax负责处理xml和接收xml,dom负责处理xml信息。比如,开发微信接口,微信里边大部分数据都是通过xml形式给组织起来的。

       function showXML(){

              //ajax负责获得服务器端的xml信息

              //javascript的dom技术负责解析xml信息

              var xhr = newXMLHttpRequest();

              xhr.onreadystatechange= function(){

                     if(xhr.readyState==4){

                            //alert(xhr.responseText);//以字符串接收服务端信息

                            //alert(xhr.responseXML);//以xml接收服务端信息(类似document对象)

                            varxmldom = xhr.responseXML;

                            varmessage = xhr.responseXML.firstChild

                            console.log(message.childNodes);//空白也算作子节点

                            varmsgs = xmldom.getElementsByTagName("msg");

                            console.log(msgs);

                            /*for(vark in msgs[0]){

                                   //console.log(k);//输出元素节点对象的成员名称。

                            }*/

                            var s= "";

                            for(vari=0; i<msgs.length; i++){

                                   varsender = msgs[i].getElementsByTagName('sender')[0].firstChild.nodeValue;

                                   varrec = msgs[i].getElementsByTagName('recieve')[0].firstChild.nodeValue;

                                   varcont = msgs[i].getElementsByTagName('content')[0].firstChild.nodeValue;

                                   s+= "发送者:"+sender+",接收者:"+rec+",内容:"+cont+"<br />";

                            }

                            document.getElementById("res").innerHTML= s;

                     }     

              }

              xhr.open('get','./ajax.xml');

              xhr.send(null);

       }

五、           ajax对缓存的处理

css、img、js等文件可以缓存,但是动态程序文件如php文件不能缓存,即使缓存一般也需要其缓存效果。浏览器对动态程序文件的缓存的处理是,给请求的地址设置随机数;给动态程序设置header头信息,禁止浏览器对其缓存。

xhr.open('get','./ajax1.php?'+Math.random());

或者

//禁止浏览器缓存当前动态程序文件

header("Cache-Controller:no-cache");

header("Pragma:no-cache");

header("Expires:-1");

六、           thinkphp框架使用ajax

创建失去焦点的事件

function checkname(){                                      

    //获得用户输入的用户名信息

    var name =document.getElementById("User_username").value;

    if(name==""){

       document.getElementById('usernamemsg').innerHTML = "请填写名字"

        return false;

    }

    var xhr = newXMLHttpRequest();

    xhr.onreadystatechange =function(){

        if(xhr.readyState==4){

            //alert(xhr.responseText);

            document.getElementById('usernamemsg').innerHTML= xhr.responseText;

        }

    }

    //tp框架所有需求都通过控制操作实现

   xhr.open('get','{$smarty.const.__CONTROLLER__}/checkNM/name/'+name);

    xhr.send(null);

}

user控制器的检验方法

    public functioncheckNM($name){

        // $name = $_GET('name');

        $result =D('User')->where("username='$name'")->find();

        if($result===null){

            echo "<spanstyle='color:green;'>可以使用</span>";

        } else {

            echo "<spanstyle='color:red;'>不可以使用</span>";

        }

        exit;

    }

七、           JSON

json,javascript  object notation,javascript对象符号。是js的一个字面量对象。也是一种数据交换格式。

json的生成和处理要比xml更加方便,因此在许多领域json正在取代xml。

1.       json的使用

json在javascript中的就是字面量对象,格式为var  obj = {名称:值,名称:值,名称:function(){}…}

通过php生成json信息

json_encode(数组/对象)生成json信息

json_encode(关联数组)json对象

json_encode(索引数组)json数组

json_encode(索引关联数组)json对象

json_encode(对象)json对象

<?php

//生成json信息

//关联数组

$user = array('user'=>'haha','pass'=>'1234','age'=>'13');

$jn_user = json_encode($user);

echo $jn_user;

echo "<hr />";

//索引数组

$stu = array('stu1','stu2','stu3');

$jn_stu = json_encode($stu);

echo $jn_stu;

2.       php处理json信息

json_decode(json信息,boolean);//反编码json信息

对json字符串信息进行反编码,变为当前语言可以识别的信息。

json_decode(json字符串,true);//编码为array

json_decode(json字符串,false);//编码为object

默认为false。

<?php

//生成json信息

//关联数组

$user = array('user'=>'haha','pass'=>'1234','age'=>'13');

$jn_user = json_encode($user);

echo $jn_user;

echo "<hr />";

//索引数组

$stu = array('stu1','stu2','stu3');

$jn_stu = json_encode($stu);

echo $jn_stu;

echo "<hr />";

$fan_user = json_decode($jn_user,true);

var_dump($fan_user);

//对一个json格式的字符串进行反编码操作,要求json字符串是""括住

$jn_per ='{"p1":"haha","p2":"heie","p3":"llele"}';

$fan_per = json_decode($jn_per,true);

echo "<hr />";

var_dump($fan_per);

3.       javascript对json的接收和处理

function f1(){

       var xhr = new XMLHttpRequest();

       xhr.onreadystatechange =function(){

              if(xhr.readyState==4){

                     eval("varjn_info="+xhr.responseText);//把json格式的字符串信息转换为对象信息

                     console.log(jn_info.user);

                     console.log(jn_info.pass);

                     console.log(jn_info.age);

              }

       }

       xhr.open('get','./json2.php');

       xhr.send(null);

}

4.       使用json改进的无刷新页面

       function showPage(url){

              var xhr = newXMLHttpRequest();

              xhr.onreadystatechange= function(){

                     if(xhr.readyState==4){

                            eval("varjn_info="+xhr.responseText);

                            //   var divresult = document.getElementById('result');

                            //   divresult.innerHTML = xhr.responseText;

                           

                            console.log(jn_info);

                            //alert(jn_info);

                            //遍历jn_info

                            vars="<table><tr><td>id</td><td>名称</td><td>重量</td><td>价格</td><td>数量</td></tr>";

                            for(varm=0; m<jn_info.length-1; m++){

                                   s+= "<tr>";

                                   s+= "<td>"+jn_info[m].i+"</td>";

                                   s+= "<td>"+jn_info[m].u+"</td>";

                                   s+= "<td>"+jn_info[m].w+"</td>";

                                   s+= "<td>"+jn_info[m].p+"</td>";

                                   s+= "<td>"+jn_info[m].n+"</td>";

                                   s+= "</tr>";

                            }

                            s += "<tr><tdcolspan='5'>"+jn_info[jn_info.length-1]+"</td></tr>";

                            s +="</table>";

                            document.getElementById('result').innerHTML= s;

                     }

              }

              xhr.open('get',url);

              xhr.send(null);

       }

       //页面加载完毕,就获得ajax请求的信息

       window.onload = function(){

              showPage('./data.php?page=1');

       }

八、           其他

1.       ajax收集form表达以及使用html5的新特性快速收集表单

window.onload = function(){

       var fm =document.getElementsByTagName('form')[0];

       fm.onsubmit =function(evt){

              //收集表单域信息,并把收集的信息提交给服务器端

              /*var nm =document.getElementById('username').value;

              var ps =document.getElementById('password').value;

              var em =document.getElementById('email').value;*/

              //html5快速收集表单信息的方法,使用FormData

              //使用注意,

              //1,无需调用setRequestHeader方法,

              //2,必须设置input的name属性值

              //3,表单域信息内部有特殊符号,无须编码

              var fd = newFormData(fm);

              // var info ="name="+nm+"password="+ps+"em="+em;

              var xhr = newXMLHttpRequest();

              xhr.onreadystatechange= function(){

                     if(xhr.readyState==4){

                            alert(xhr.responseText);

                     }

              }

              xhr.open('post','11.php');

              //xhr.setRequestHeader("content-type","application/x-www-form-urlencoded");

              xhr.send(fd);

              //阻止浏览器form表单的提交动作

              evt.preventDefault();

       }

}

2.       无刷新附件上传

dom方式只可以收集普通的表单域信息,并且浏览器由于安全方面的限制也禁止通过javacript语言操作本地文件。

可以利用FormData实现附件信息的收集,普通表单域和上传文件域均可以收集。

window.onload = function(){

       var fm = document.getElementsByTagName('form')[0];

       fm.onsubmit =function(evt){

              //收集表单域信息,并把收集的信息提交给服务器端

              /*var nm =document.getElementById('username').value;

              var ps =document.getElementById('password').value;

              var em =document.getElementById('email').value;*/

              //html5快速收集表单信息的方法,使用FormData

              //使用注意,

              //1,无需调用setRequestHeader方法,

              //2,必须设置input的name属性值

              //3,表单域信息内部有特殊符号,无须编码

              var fd = newFormData(fm);

              // var info ="name="+nm+"password="+ps+"em="+em;

              var xhr = newXMLHttpRequest();

              xhr.onreadystatechange= function(){

                     if(xhr.readyState==4){

                            alert(xhr.responseText);

                     }

              }

              xhr.open('post','11.php');

              //xhr.setRequestHeader("content-type","application/x-www-form-urlencoded");

              xhr.send(fd);

              //阻止浏览器form表单的提交动作

              evt.preventDefault();

       }

}

php页面

<?php

 

// print_r($_POST);

// echo "file:";

// print_r($_FILES);

if($_FILES['userpic']['error']>0){

       exit('附件有错误');

}

$path = "./upload/";

$name = date("YmdHis").'-'.mt_rand(1000,9999);

$name_arr = explode('.',$_FILES['userpic']['name']);

$ext = '.'.$name_arr[count($name_arr)-1];

$pathname = $path.$name.$ext;

$z = move_uploaded_file($_FILES['userpic']['tmp_name'], $pathname);

if($z){

       echo "success";

}else{

       echo "fail";

}

3.       上传大附件进度条设置

php.ini中设置开放大附件上传限制,post_max_size = 220M  upload_max_filesize = 200M

ajax对象->upload->ongrogress。这个ongrogress事件每隔100ms左右就执行一次,执行的过程中会感知附件的总大小和已经上传大小等信息。利用这些信息可以设置进度条信息。

<!DOCTYPE html>

<html lang="en">

<head>

       <metacharset="UTF-8">

       <title>Document</title>

       <script>

window.onload = function(){

       var fm =document.getElementsByTagName('form')[0];

       fm.onsubmit =function(evt){

              //收集表单域信息,并把收集的信息提交给服务器端

              /*var nm =document.getElementById('username').value;

              var ps =document.getElementById('password').value;

              var em =document.getElementById('email').value;*/

              //html5快速收集表单信息的方法,使用FormData

              //使用注意,

              //1,无需调用setRequestHeader方法,

              //2,必须设置input的name属性值

              //3,表单域信息内部有特殊符号,无须编码

              var fd = newFormData(fm);

              // var info ="name="+nm+"password="+ps+"em="+em;

              var xhr = newXMLHttpRequest();

              xhr.onreadystatechange= function(){

                     if(xhr.readyState==4){

                            alert(xhr.responseText);

                     }

              }

              xhr.upload.onprogress= function(evt){

                     //该事件每间隔100s左右执行一次,并通过事件对象感知上传信息

                     //console.log(evt);

                     var load =evt.loaded;

                     var total =evt.total;

                     //上传百分比

                     var per =Math.floor((load/total)*100)+"%";

                     document.getElementById("son").style.width= per;

                     document.getElementById("son").innerHTML= per;

              }

              xhr.open('post','11.php');

              //xhr.setRequestHeader("content-type","application/x-www-form-urlencoded");

              xhr.send(fd);

              //阻止浏览器form表单的提交动作

              evt.preventDefault();

       }

}

       </script>

       <style>

              #pat{

                     width:460px;height:30px;border:2pxsolid blue;

              }

              #son{

                     width:0;height:101%;background-color:red;

              }

       </style>

</head>

<body>

       <formmethod="post" action="./111.php" >

              <p>用户名:<input type="text" id="username"name="username" /></p>

              <p>密码:<input type="text" id="password"name="password" /></p>

              <p>邮箱:<input type="text" id="email"name="email" /></p>

              <divid="pat"><div id="son"></div></div>

              <p>头像:<input type="file" name="userpic"></p>

              <p>提交:<input type="submit" value="注册"></p>

       </form>

</body>

</html>

九、           案例

1.       ajax聊天室

反向推技术就是轮询技术,在客户端每间隔一定事件就去完成一定的任务。

<script type="text/javascript">

 

//及时显示聊天内容

//利用ajax每间隔2s就去服务器获得一次聊天信息

var maxID = 0;

function showmsg(){

    var xhr = new XMLHttpRequest();

    xhr.onreadystatechange =function(){

        if(xhr.readyState==4){

            eval("varjn_info="+xhr.responseText);

            //jn_info = [{},{}]

            //遍历jn_info

            var s = "";

            for(var i=0;i<jn_info.length; i++){

                s += "<pstyle='color:"+jn_info[i].color+"'>"+jn_info[i].sender+"&nbsp;对&nbsp;"

                s +=jn_info[i].receiver+"&nbsp;"+jn_info[i].biaoqing+"&nbsp;说:";

                s +=jn_info[i].msg+"("+jn_info[i].add_time+")</p>";

                maxID =jn_info[i].id;

 

            }

            var showdiv =document.getElementById('show_msg');

            showdiv.innerHTML +=s;

            //设置滚动条卷起高度

            //alert(showdiv.scrollHeight);

            showdiv.scrollTop =showdiv.scrollHeight-328;

        }

    }

   xhr.open('get','./data.php?id='+maxID);

    xhr.send(null);

}

window.onload = function(){

    showmsg();

   setInterval("showmsg()",2000);

}

 

</script>

 

<style type="text/css">

</style>

<script>

function sendmsg(){

    var fm =document.getElementsByTagName('form')[0];

    //Formdata收集表单信息

    var fd = new FormData(fm);

    var xhr = newXMLHttpRequest();

    xhr.onreadystatechange =function(){

        if(xhr.readyState==4){

            document.getElementById('sendresult').innerHTML= xhr.responseText;

            //表单域归位处理

           document.getElementById('color').value = "";

           document.getElementById('biaoqing').value = "";

           document.getElementById('receiver').value = "";

            document.getElementById('msg').value ="";

            //2s后清除一次提示信息

           setTimeout('hideresult()',2000);

        }

    }

   xhr.open('post','./send.php');

    xhr.send(fd);

}

//发表聊天的提示小时

function hideresult(){

   document.getElementById('sendresult').innerHTML = "";

}

</script> 

获取消息的php页面

<?php

header("content-type:text/html;charset=utf-8");

//获得最新的聊天信息

@$link = mysql_connect('localhost','root','123456');

$id = $_GET['id'];

mysql_select_db('shop',$link);

mysql_query('set names utf8');

$sql = "select * from message where id > $id";

$qry = mysql_query($sql);

$info = array();

while($rst = mysql_fetch_assoc($qry)){

       $info[] = $rst;

}

echo json_encode($info);

发送消息的php页面

<?php

//收集发表的聊天信息,并存储

header("content-type:text/html;charset=utf-8");

//获得最新的聊天信息

@$link = mysql_connect('localhost','root','123456');

mysql_select_db('shop',$link);

mysql_query('set names utf8');

$color = $_POST['color'];

$biaoqing = $_POST['biaoqing'];

$receiver = $_POST['receiver'];

$msg = $_POST['msg'];

$sql = "insert into messagevalues(null,'$msg','admin','$receiver','$color','$biaoqing',now())";

$qry = mysql_query($sql);

if($qry){

       echo "<spanstyle='color:green;'>发表成功</span>";

}else{

       echo "<spanstyle='color:red;'>发表失败</span>";

}

2.       设置天气预报

浏览器由于安全方面的问题,禁止ajax跨域请求其他网站的数据。解决方法是利用本域php代理间接获得其他网站的数据。

不同地区需要显示该地区对应的天气信息。利用ip地址获得城市信息,然后根据城市信息获得城市编码,根据城市编码获得对应的url。

通过ip地址接口可以获得ip地址所在的城市。

 

原创粉丝点击