AJAX核心--XMLHttpRequest五步法

本文详细解析了AJAX(异步JavaScript+XML)技术,包括其核心知识点和实现过程。通过实例代码,阐述了AJAX与传统Web开发的区别,以及思维方式的转变。重点介绍了XMLHttpRequest对象的使用方法,包括建立对象、注册回调函数、设置基本交互信息、发送数据和处理响应。同时,讨论了AJAX在未来可能被新技术替代的趋势。

引言:


AJAX=异步Javascript + XML,AJAX是一种用于创建快速动态网页的技术。


开门见山:


解读:AJAX使用XHTML和CSS为网页表示,DOM动态显示和交互,XML进行数据交换和处理,XMLHttpRequest进行数据检索,Javascript将以上技术融合。


AJAX与传统的Web开发有什么区别?


用一句话总结:在页面跳转时传统是整个页面刷新的;AJAX是一部分数据改变。


思维方式的转变:传统web应用时页面交互为主导、同步响应、非标准方式布局和开发、主要代码在服务器端,AJAX是数据交互为主导的、异步响应、有标准布局、页面段需要更多地代码。


AJAX的核心知识点(一):XMLHttpRequest对象


总结XMLHttpRequest五步使用法:

1、建立XMLHttpRequest对象

2、注册回调函数

3、使用open方法设置和服务端交互的基本信息

4、设置发送的数据,开始和服务器端交互

5、在回调函数中判断交互是否结束,响应是否正确,并根据需要获取服务器端返回的数据,更新页面。


/* 
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
//使用封装方法的人,只关心提供http的请求方法,url地址,成功和失败的方法
//类的构造定义,主要职责就是新建出XMLRequest对象
var MyXMLHttpRequest = function(){
    //定义的不同浏览器的封装
    var xmlhttprequest;
    if(window.XMLHttpRequest){
        xmlhttprequest = new XMLHttpRequest();
        if(xmlhttprequest.overrideMimeType){
            xmlhttprequest.overrideMimeType("text/xml");
        }
    }else if (window.ActiveXObject){
        var activeName = ["MSXML2.XMLHTTP","Microsoft.XMLHTTP"];
        for(var i = 0; i < activeName.length;i++){
            try{
                xmlhttprequest = new ActiveXObject(activeName[i]);
                break;
            }catch(e){
            
            }
        }
    }
  if(xmlhttprequest === undefined || xmlhttprequest === null){
      alert("XMLHttpRequest对象创建失败!!");
  }else {
      this.xmlhttp = xmlhttprequest;
  }
 };
//用户发送请求的方法
MyXMLHttpRequest.prototype.send = function(method,url,data,callback,failback) {
    if(this.xmlhttp !== undefined && this.xmlhttp !== null){
        method = method.toUpperCase();
        if(method !== "GET" && method !=="POST"){
            alert("HTTP的请求方法必须是GET或POST!!");
            return;
        }
        if(url === null || url === underfined){
            alert("HTTP的请求地址必须设置!");
            return;
        }
        var tempxmlhttp = this.xmlhttp;
        this.xmlhttp.onreadystatechange = function(){
               //请求发生改变的事件触发器
               if(tempxmlhttp.readyState === 4){
                    //4=完成,响应数据接收完成
                    if(tempxmlhttp.status === 200){
                    var responseText = tempxmlhttp.responseText;
                    //服务器相应的文本内容
                    var responseXML = tempxmlhttp.responseXML;
                    //服务器相应的XNL内容对应的DOM对象

                        if(callback === undefined || callback === null){
                        alert("没有设置处理数据正确返回的方法!");
                        alert("返回的数据:" + responseText);
                    }else{
                        callback(responseText,responseXML);
                    }
                }else{
                    if(failback === undefined || failback === null){
                        alert("没有设置处理数据返回失败的处理方法!");
                        alert("HTTP的响应码:" + tempxmlhttp.status + ",响应码的文件信息:" + 
                                temphttp.status);
                    }else{
                        failback(tempxmlhttp.status,tempxmlhttp.statusText);
                    }
                }
            }
        };
        //解决缓存的转换
        if(url.indexOf("?") >= 0){
            url = url + "&t" + (new Date()).valueOf();
        }else{
            url = url + "?" + (new Date()).valueOf();
        }
        //解决跨域问题
        if(url.indexOf("http://") >= 0){
            url.replace("?","&");
            url = "Proxy?url=" + url;
        }
        
        this.xmlhttp.open(method,url,true);
        
        //如果是POST方式,需要设置请求头
        if(method === "POST"){
            this.xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");           
        }
        
        this.xmlhttp.send(data);
    }else{
        alert("XMLHttpRequest对象创建失败,无法发送数据!");
    }
};
MyXMLHttpRequest.prototype.abort = function(){
    this.xmlhttp.abort();
};



分析代码:

代码大体上是说:首先对XMLHttpRequest对象的构造函数定义,其中就是对不同浏览器的封装;之后是定义了一个send方法,这个方法有几个参数:method有两个数“GET”和“POST”,url表示请求的服务器的地址,data是向服务器返回的数据;之后是注册回调方法onreadystaechange,readstate有5个值,我们只关心值为4的时候,即相应数据接收成功;之后解决了一些小问题:跨域和Post缓存问题用url转换;最后封装了放弃使用request对象的方法,使用的时候,可以调用内部写的自己的方法。


callback和fallback实在javascript中写的。


总结:


AJAX会在之后会有更好的东西替代它,它只是我们学习的一个阶段。一种新的事物,我们现在看可能是新的,比较传统的东西,会有它的不同点,一般人看到的可能更多地是它不同的地方,往往会忽略它与传统的共同点,我们换一种思维方式,就会发现,我们掌握了传统的基础之后,新的事物的不同的地方很容易掌握。


数据介绍根据《中华人民共和国文物保护法》,“历史文化名城”是指保存文物特别丰富,具有重大历史文化价值和革命意义的城市。这些城市通常拥有悠久的历史、丰富的文化遗产和独特的城市风貌。中国历史文化名镇是由住房和城乡建设部和国家文物局共同组织评选的,保存文物特别丰富,且具有重大历史价值或纪念意义的,能较完整地反映一些历史时期传统风貌和地方民族特色的镇。中国历史文化名村是指保存文物特别丰富且具有重大历史价值或者革命纪念意义的村。这些村庄通常拥有悠久的历史和独特的文化风貌,是乡村文化的重要组成部分。中国历史文化名城、名镇、名村以及传统村落的数量之多、分布之广、价值之高,都令人叹为观止。这些宝贵的文化遗产不仅是我们民族的骄傲,更是我们传承和发扬中华优秀传统文化的重要基础。让我们共同珍惜这些文化遗产,让它们在新时代焕发出更加绚丽的光彩!数据名称:中国历史文化名城、名镇、名村数据数据格式:shp、excel坐标系:Wgs1984相关数据及指标名称、省份、批次、经度、纬度。数据概述1.中国历史文化名城名单.xlsx2.中国历史文化名镇名单,xlsx3.中国历史文化名村名单.xlsx4.中国历史文化名街名单.xlsx中国历史文化名城.dbf中国历史文化名城.pr中国历史文化名城.sbn中国历史文化名城.sbx中国历史文化名城.shp中国历史文化名城.shx中国历史文化名村.dbf中国历史文化名村.prj中国历史文化名村.sbn中国历史文化名村.sbx中国历史文化名村.shp中国历史文化名村.shx中国历史文化名镇.dbf中国历史文化名镇.prj中国历史文化名镇.sbn中国历史文化名镇.sbx中国历史文化名镇.shp中国历史文化名镇.shx
评论 39
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值