zoukankan      html  css  js  c++  java
  • ajax(1)

    ajax是什么?

    ①ajax(asynchronouse javascript and xml)异步的javascript和xml。

    ②ajax技术包含了七种技术(javascript xml css xstl dom xhtml xmlHttpRequest),ajax是一个粘合剂。

    传统的客户端和服务器响应方式

    1.数据是整体提交

    2.整个页面有刷新

    3.用户体验不好

    4.占带宽(最要命,4:1)

    ③ajax是一个与服务器端语言无关的技术,即可以用在(php, java ee,.net)。

    ④ajax可以给客户端返回三种格式数据(文本格式,xml,json格式)

    json是原生态数据,非常好用。

    ⑤无刷新数据交换技术有以下:flash,java applet,框架,iframe,ajax

    ajax运行原理示意图:

    传统的请求方式:

    一个请求对应一个响应,他们是同步机制。

    使用ajax

    在发送请求时,会创建一个ajax引擎对象(xmlHttpRequest),ajax引擎对象向服务器发送http请求,服务器会响应ajax引擎对象。http响应有三种数据(文本格式,xml,json格式)。

    为什么可以异步处理?

    ajax用于:

    1.动态加载数据,按需取得数据。

    如果不使用ajax,加载省市县乡镇会非常要命。

    使用了ajax可以动态加载数据。

    2.改善用户体验。

    3.电子商务

    4.访问第三方服务

    5.数据的局部刷新。

    ajax在什么地方用得多。

    ajax经典案例--无刷新验证用户名

    传统网页提交数据就会清空原有数据。

    只要web开发,其底层协议就是Http协议,http协议底层就是TCP/IP协议。

    ajax请求本质就是http请求。

    犯了一个大错误,document.getElementById("id"),函数参数里放的就是元素的id,不是元素的name.

    <!DOCTYPE html>
    <html>
    <head>
    <title>用户注册</title>
    <meta charset="utf-8">
    <script language="javascript" type="text/javascript" >
        //创建ajax引擎
        function getXmlHttpObject(){
        
            var xmlHttpRequest;
            //不同浏览器获取xmlHttpRequest对象方法不一样
            if(window.ActiveXObject){
                //window.alert("ie");
                xmlHttpRequest=new ActiveXObject("Microsoft.XMLHTTP");
            }else{
                //window.alert("no ie");
                xmlHttpRequest=new XMLHttpRequest();
            }
            return xmlHttpRequest;
        }
        
        
        var myXmlHttpRequest="";
        //验证用户名是否存在
        function checkName(){
            
            myXmlHttpRequest=getXmlHttpObject();
            //怎么判断创建ok
            if(myXmlHttpRequest){
                //window.alert("创建成功");
                //通过myXmlHttpRequest对象发送请求到服务器的某个页面
                //第一个参数表示请求的方式,"get"/"post"
                //第二个参数指定url,对哪个页面发出ajax请求(本质仍然是http请求)
                //第三个参数表示true 表示使用异步机制,如果false表示不使用异步
                var url="/ajaxProject/registerProcess.php?username="+$("username").value;
                //window.alert(url); 
                myXmlHttpRequest.open("get", url, true);
                //回调函数
                //指定回调函数.chuli是函数名
                myXmlHttpRequest.onreadystatechange=chuli;
                
                //真的发送请求,如果是get请求则填入 null即可
                //如果是post请求,则填入实际的数据
                myXmlHttpRequest.send(null);
                //状态改变的触发器
                //myXmlHttpRequest.open("get");
            }else{
                //window.alert("创建失败");
            }
            
        }
        
        //回调函数
        function chuli(){
            //window.alert("处理函数被调回"+myXmlHttpRequest.readyState);
            //readyState
            //我要取出从regiseterPro.php页面返回的数据
            if(myXmlHttpRequest.readyState==4){
                //取出值,根据返回信息的格式定.text
                window.alert("服务器返回"+myXmlHttpRequest.responseText);
            }
        }
        
        function $(id){
            return document.getElementById(id);
        }
        
    </script>
    </head>
    <body>
    <form>
    
    <h1>你好</h1>
    用户名字<input type="text" name="username" id="username" /><input type="button" value="验证用户名" onclick="checkName()"/><br/>
    用户密码<input type="password" name="pwd" id="pwd"/><br/>
    电子邮件<input type="text" name="email" id="email"/><br/>
    
    </form>
    </body>
    
    </html>

    1.使用ajax完成用户名验证

    使用get方式发出请求,如果提交的用户名不变化,浏览器将不会真的发请求,而是缓存数据,url

    解决方法

    ①.url后带一个总是变化的参数(比如当前时间)

    var url="/registerProcess.php?"+new Date()+"username="+$("username").value;

    ②.在服务器回送结果的时候禁用缓存。

    //这里两句话很重要,第一句话告诉浏览器返回的数据是xml格式
        header("Content-type: text/xml; charset=utf-8");
        //告诉浏览器不要缓存数据
        header("Cache-Control:no-cache");

    registerProcess.php里面的内容不是直接运行,而是给register.php,这是ajax行为。

    onkeyup()每次按下按键,就进行验证,onkeydown和其他都不好使。

    在获取registerProcess.php的运行结果时,出现了一个很奇怪的问题。截图如下所示:

     

    经过长时间的检查,发现出错的地方在于

    var url="/registerProcess.php?"+new Date()+"username="+$("username").value;

    这条语句写错了。改成这样就对了。

    var url="/registerProcess.php?username="+new Date()+$("username").value;

    原来无法实现验证更新

    var url="/registerProcess.php?username="+new Date()+$("username").value;

    后来改成如下代码就实现了

    var url="/registerProcess.php?mytime="+new Date()+"&username="+$("username").value;

    完整代码如下所示:

    register.php

    <!DOCTYPE html>
    <html>
    <head>
    <title>用户注册</title>
    <meta charset="utf-8">
    <script language="javascript" type="text/javascript" >
        //创建ajax引擎
        function getXmlHttpObject(){
        
            var xmlHttpRequest;
            //不同浏览器获取xmlHttpRequest对象方法不一样
            if(window.ActiveXObject){
                //window.alert("ie");
                xmlHttpRequest=new ActiveXObject("Microsoft.XMLHTTP");
            }else{
                //window.alert("no ie");
                xmlHttpRequest=new XMLHttpRequest();
            }
            return xmlHttpRequest;
        }
        
        
        var myXmlHttpRequest="";
        //验证用户名是否存在
        function checkName(){
            
            myXmlHttpRequest=getXmlHttpObject();
            //怎么判断创建ok
            if(myXmlHttpRequest){
                //window.alert("创建成功");
                //通过myXmlHttpRequest对象发送请求到服务器的某个页面
                //第一个参数表示请求的方式,"get"/"post"
                //第二个参数指定url,对哪个页面发出ajax请求(本质仍然是http请求)
                //第三个参数表示true 表示使用异步机制,如果false表示不使用异步
                //var url="/registerProcess.php?username="+new Date()+$("username").value;
                var url="/registerProcess.php?mytime="+new Date()+"&username="+$("username").value;
                //window.alert(url); 
                myXmlHttpRequest.open("get", url, true);
                //回调函数
                //指定回调函数.chuli是函数名
                myXmlHttpRequest.onreadystatechange=chuli;
                
                //真的发送请求,如果是get请求则填入 null即可
                //如果是post请求,则填入实际的数据
                myXmlHttpRequest.send(null);
                //状态改变的触发器
                //myXmlHttpRequest.open("get");
            }else{
                //window.alert("创建失败");
            }
            
        }
        
        //回调函数
        function chuli(){
            //window.alert("处理函数被调回"+myXmlHttpRequest.readyState);
            //readyState
            //这应该是4号线
            //我要取出从regiseterPro.php页面返回的数据
            if(myXmlHttpRequest.readyState==4){
                //取出值,根据返回信息的格式定.text
                //window.alert("服务器返回"+myXmlHttpRequest.responseText);
                $("myres").value=myXmlHttpRequest.responseText;
                //window.alert(myXmlHttpRequest.responseText);
            }
        }
        
        function $(id){
            return document.getElementById(id);
        }
        
    </script>
    </head>
    <body>
    <form >
    
    用户名字<input type="text" onkeyup="checkName()" name="username1" id="username" /><input type="button" value="验证用户名" onclick="checkName()"/>
    <input type="text" style="border-0;color:red" id="myres"/>
    <br/>
    用户密码<input type="password" name="password" id="password"/><br/>
    电子邮件<input type="text" name="email" id="email"/><br/>
    <input type="submit" value="用户注册"/><br/><br/>
    
    
    
    用户名字<input type="text" name="username1" />
    <input type="text" style="border-0;color:red"/>
    <br/>
    用户密码<input type="password" name="password"/><br/>
    电子邮件<input type="text" name="email"/><br/>
    <input type="button" value="用户注册"/>
    
    </form>
    </body>
    
    </html>

    registerProcess.php

    <?php 
    
        //这里两句话很重要,第一句话告诉浏览器返回的数据是xml格式
        header("Content-type: text/xml; charset=utf-8");
        //告诉浏览器不要缓存数据
        header("Cache-Control:no-cache");
        //接收数据
        $username=$_GET['username'];
    
        if($username=="shunping"){
            echo "username is unavailable";//注意,这里数据是返回给请求的页面
        }else if($username!=""){
            echo "username is available";
        }
        //echo "用户名是".$username;//3号线
    ?>

    ajax经典案例--无刷新验证用户名(post).

    ajax的post方式请求

    在前面的案例上进行修改

     需要改变的地方就在这里

    var url="/registerProcess.php";
                //这个是要发送的数据
                var data="username="+$("username").value;
                //打开请求
                myXmlHttpRequest.open("post", url, true);
                //还有一句话,这句话必须
                //在编程过程中,建议用Post,post会更好一些
                myXmlHttpRequest.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
                //指定回调函数.chuli是函数名
                myXmlHttpRequest.onreadystatechange=chuli;
                
                //真的发送请求,如果是get请求则填入 null即可
                //如果是post请求,则填入实际的数据
                myXmlHttpRequest.send(data);

    registerProcess.php

    //接收数据(这里要和请求方式对应 _POST 还是 _GET
        $username=$_POST['username'];

    完整代码如下所示:

    <!DOCTYPE html>
    <html>
    <head>
    <title>用户注册</title>
    <meta charset="utf-8">
    <script language="javascript" type="text/javascript" >
        //创建ajax引擎
        function getXmlHttpObject(){
        
            var xmlHttpRequest;
            //不同浏览器获取xmlHttpRequest对象方法不一样
            if(window.ActiveXObject){
                //window.alert("ie");
                xmlHttpRequest=new ActiveXObject("Microsoft.XMLHTTP");
            }else{
                //window.alert("no ie");
                xmlHttpRequest=new XMLHttpRequest();
            }
            return xmlHttpRequest;
        }
        
        
        var myXmlHttpRequest="";
        //验证用户名是否存在
        function checkName(){
            
            myXmlHttpRequest=getXmlHttpObject();
            //怎么判断创建ok
            if(myXmlHttpRequest){
                //window.alert("创建成功");
                //通过myXmlHttpRequest对象发送请求到服务器的某个页面
                //第一个参数表示请求的方式,"get"/"post"
                //第二个参数指定url,对哪个页面发出ajax请求(本质仍然是http请求)
                //第三个参数表示true 表示使用异步机制,如果false表示不使用异步
                //var url="/registerProcess.php?username="+new Date()+$("username").value;
                /*var url="/registerProcess.php?mytime="+new Date()+"&username="+$("username").value;*/
                var url="/registerProcess.php";
                //这个是要发送的数据
                var data="username="+$("username").value;
                //打开请求
                myXmlHttpRequest.open("post", url, true);
                //还有一句话,这句话必须
                //在编程过程中,建议用Post,post会更好一些
                myXmlHttpRequest.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
                //指定回调函数.chuli是函数名
                myXmlHttpRequest.onreadystatechange=chuli;
                
                //真的发送请求,如果是get请求则填入 null即可
                //如果是post请求,则填入实际的数据
                myXmlHttpRequest.send(data);
                //状态改变的触发器
                //myXmlHttpRequest.open("get");
            }else{
                //window.alert("创建失败");
            }
            
        }
        
        //回调函数
        function chuli(){
            //window.alert("处理函数被调回"+myXmlHttpRequest.readyState);
            //readyState
            //这应该是4号线
            //我要取出从regiseterPro.php页面返回的数据
            if(myXmlHttpRequest.readyState==4){
                //取出值,根据返回信息的格式定.text
                //window.alert("服务器返回"+myXmlHttpRequest.responseText);
                $("myres").value=myXmlHttpRequest.responseText;
                //window.alert(myXmlHttpRequest.responseText);
            }
        }
        
        function $(id){
            return document.getElementById(id);
        }
        
    </script>
    </head>
    <body>
    <form >
    
    用户名字<input type="text" onkeyup="checkName()" name="username1" id="username" /><input type="button" value="验证用户名" onclick="checkName()"/>
    <input type="text" style="border-0;color:red" id="myres"/>
    <br/>
    用户密码<input type="password" name="password" id="password"/><br/>
    电子邮件<input type="text" name="email" id="email"/><br/>
    <input type="submit" value="用户注册"/><br/><br/>
    
    
    
    用户名字<input type="text" name="username1" />
    <input type="text" style="border-0;color:red"/>
    <br/>
    用户密码<input type="password" name="password"/><br/>
    电子邮件<input type="text" name="email"/><br/>
    <input type="button" value="用户注册"/>
    
    </form>
    </body>
    
    </html>

    以上返回的文本格式是Text(又称html格式)。

    现在要求返回xml格式。因为有时候数据比较复杂,需要用到xml格式。xml格式对于数据的描述能力比Text强大得多。

  • 相关阅读:
    获取spring源码并导入到eclipse
    Android的EditText设置可编辑与不可编辑的方法
    漫谈设计模式笔记:模板模式
    jfreechar中文乱码设置主题样式解决
    FrameLayout布局下让图片居中的方法
    java典型模块实例1:英文,数字,中文混合的验证码
    学习Lucene笔记一:创建索引
    How to Display a PDF File in a HTML Web Page
    NET数据类型及字节数
    2012年1月编程语言排行榜
  • 原文地址:https://www.cnblogs.com/liaoxiaolao/p/9812954.html
Copyright © 2011-2022 走看看