一.xmlHttpRequest对象的创建

ajax的核心的XMLHttpRequest对象,下面的代码给出了兼容各个浏览器的方法实现

function createXHR(){
    if(typeof XMLHttpRequest !="undefined"){
        return new XMLHttpRequest();
    }else if(typeof ActiveXObject != 'undefined'){
        if(typeof arguments.callee.activeXString !="string"){
            var versions=["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"];
            var i,len;
            ;len=versions.length;i++){
                try{
                    new ActiveXObject(versions[i]);
                    arguments.callee.activeXString=versions[i];
                    break;
                }catch(ex){

                }
            }
        }
        return new ActiveXObject(arguments.callee.activeXString);
    }else{
        throw new Error("no XHR object available...");
    }
}

事实上,如果不理会IE7之前的版本,使用原生的CHR就能够实现。

二,XHR常用方法

1)xhr.open():接受三个参数,请求类型(get,post),请求的url,是否是异步请求(是为true,否为false)

对于xhr来说,传入open()方法的url末尾的查询字符串必须使用encodeURIComponent()经过正确的编码,下面给出了向现有url添加查询字符串的方法

function addUrlParam(url,name,value){
    url+=(url.indexOf(?"?":"&");
    url+=encodeURIComponent(name)+"="+encodeURIComponent(value);
    return url;
}

2)xhr.send():get为null,post为要发送的数据。

3)xhr.setRequestHeader(),设置请求头

4)xhr.onreadystatechage 设置异步请求的回调函数,为了保证浏览器的兼容性,需要在open()之前指定该回调

5)xhr.timeout 设置请求的超时时间

6) xhr.ontimeout 超时回调函数

在请求过程中,xhr对象的readystate属性会发生变化

1)0:尚未初始化,尚未成功调用open()方法

2)1:启动,已经调用open(),尚未调用send()

3) 2: 发送,已经调用send()

4) 3: 接收,已经接收到部分响应

5)4:完成,已经接收到全部响应数据,客户端可以使用

在收到响应后,响应数据会自动填充xhr对象的下列属性:

1)responseText:响应文本

2) responseXML 如果响应类型是"text/xml"或者"application/xml",该属性有值,否则为空

3)status 响应状态码,一般200是成功的标志,304代表从缓存中取得数据

4)statusText 响应状态说明,最好不要使用,在跨浏览器中不太可靠

三、xhr用法示例

function sendGet(url){
    var xhr=createXHR();
    xhr.onreadystatechange=function(){
        ){
            &&xhr.status<||xhr.status==){
                alert(xhr.responseText);
            }else{
                alert("request was fail");
            }
        }
    }
    xhr.open("get",url,true);
    xhr.send(null);
}

post请求与之类似

四、备注

1)以上方法只是XMLHttpRequest1级的相关方法,XMLHttpRequest1又在此基础上拓展了相关API,这里不再赘述

五、跨域问题解决

1.CORS(跨域资源共享),是W3C的一个工作草案,其背后思想是,使用自定义的http头部,让浏览器与服务器进行沟通,从而决定请求或相应应该成功还是失败。这是自己之前在chrom下跨域请求发现Options方法,以及status为0的原因,具体细节不再展开。这种方法需要修改服务器端代码。

2.图像ping, 图像的src属性不存在跨域问题,可以使用图像的onload和onerror事件处理程序来确定是否接受到了响应,不过这种方法具有两个缺点:1)只能发送get请求,2)无法访问服务器的响应文本,只是一种单向的通信

3.jsonp:利用原生的javascript的时候,通过动态script元素,将其src属性指定为一个跨域的url。当然也可以通过jquery的ajax实现。此时服务器端需要修改,将返回的json字符串包围在回调函数中,而回调函数的名称在请求中由queryString指定。

1)利用原生javascript实现jsonp跨域请求

function handleResponse(response){
    console.log("response:"+response);
    alert(response.name);
}
EventUtil.addHandler(document,"DOMContentLoaded",function(){
    var url="http://127.0.0.1:8888/Bobo1/servlet/TestServlet";
    url=addUrlParam(url,"callback","handleResponse");
    console.log("url:"+url);
    var scriptElem=document.createElement("script");
    scriptElem.setAttribute("src",url);
    document.body.appendChild(scriptElem);
});

与之对象的服务器端代码

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        String callback=request.getParameter("callback");
        String result=callback+"({\"name\":\"bobo\"})";
        out.println(result);
    }

2)利用jquery实现jsonP

$(function(){
    $.ajax({
        url:"http://127.0.0.1:8888/Bobo1/servlet/TestServlet?callback=handleResponse",
        type:"get",
        dataType:"jsonp",
        success:function(){
            handleResponse();
        }
    });

});

服务器端同上

4,推送(comet):具体细节可以参照教材,这里不再详细叙述。

javaScript学习之ajax的更多相关文章

  1. JavaScript学习总结 Ajax和Http状态字

    Ajax及其工作原理 AJAX 是一种与服务器交换数据无需刷新网页的技术,最早由Google公司在谷歌地图里使用,并迅速风靡. AJAX是不能跨域的,如需跨域,可以使用document.domain= ...

  2. 高性能javascript学习笔记系列(6) -ajax

    参考 高性能javascript javascript高级程序设计 ajax基础  ajax技术的核心是XMLHttpRequest对象(XHR),通过XHR我们就可以实现无需刷新页面就能从服务器端读 ...

  3. javascript学习笔记一

    今天看的javascript 应用开发实践指南 看了js库 jquery ,明确了要深入学习jquery的想法. 对于javascript原生态的ajax写法(兼容性只需考虑ie6),封装为函数: f ...

  4. 嘿嘿。今天学习了AJAX的几个方法

    原文:嘿嘿.今天学习了AJAX的几个方法 今天学习了AJAX的几个方法,其实我很早在公司实习的时间就认识了它,但是对它一无所知,也并没有去学习它,今天学习它让我感到很兴奋因为重新了解了它,嘿嘿,下面就 ...

  5. Javascript学习6 - 类、对象、继承

    原文:Javascript学习6 - 类.对象.继承 Javasciprt并不像C++一样支持真正的类,也不是用class关键字来定义类.Javascript定义类也是使用function关键字来完成 ...

  6. JavaScript学习--(智能社视频)

    JavaScript学习,这是智能社官网上的JS视频,讲解的挺不错的,就是没有视频的demo,在视频中附上自己编写的一些demo... 下载地址:http://pan.baidu.com/s/1cPz ...

  7. javascript进阶之AJAX

    AJAX 一 AJAX预备知识:json进阶 1.1 什么是JSON? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.JSON是用字符串来表示Javas ...

  8. JavaScript之使用AJAX(适合初学者)

      网上关于AJAX的教程和分享层出不穷,现实生活中关于AJAX的书籍也是琳琅满目,然而太多的选择容易令人眼花缭乱,不好取舍.事实是,一般的教程或书籍都不会讲Web服务器的搭建,因此,对于初学者(比如 ...

  9. JavaScript学习历程和心得体验

    一.前言 在过去,JavaScript只是被用来做一些简单的网页效果,比如表单验证.浮动广告等,所以那时候JavaScript并没有受到重视.自从AJAX开始流行后,人们发现利用JavaScript可 ...

随机推荐

  1. NBUT 1028 该减肥了(简单递推)

    [1028] 该减肥了 时间限制: 1000 ms 内存限制: 65535 K 问题描述 由于长期缺乏运动,Teacher Xuan发现自己的身材臃肿了许多,于是他想健身,更准确地说是减肥.Teach ...

  2. CSS权威指南 - 基础视觉格式化 2

    行内元素 em a 非替换元素 img 替换元素 两者在内联内容处理方式不一样. inline有时候被翻译成内联,比如inline content,有时候被翻译成行内 inline box. 行布局 ...

  3. Apache Spark源码走读之9 -- Spark源码编译

    欢迎转载,转载请注明出处,徽沪一郎. 概要 本来源码编译没有什么可说的,对于java项目来说,只要会点maven或ant的简单命令,依葫芦画瓢,一下子就ok了.但到了Spark上面,事情似乎不这么简单 ...

  4. 20145235 《Java程序设计》第6周学习总结

    教材学习内容总结 10.1 InputStream与OutputStream 串流设计的概念 Java将输入/输出抽象化为串流,数据有来源及目的地,衔接两者的是串流对象. 从应用程序角度来看,如果要将 ...

  5. InnoDB , MyISAM :MySQL 5.7 Supported Storage Engines

    http://dev.mysql.com/doc/refman/5.7/en/storage-engines.html https://en.wikipedia.org/wiki/ACID https ...

  6. delphi 创建DBASE和FOXPRO两类DBF数据文件的差异

    delphi 创建DBASE和FOXPRO两类DBF数据文件的差异,主要有几点: 1.创建方法不同 DBASE的创建方法: Self.Table1.Close; Self.Table1.Active ...

  7. jsonObject jsonarray

    1.JAR包简介 要使程序可以运行必须引入JSON-lib包,JSON-lib包同时依赖于以下的JAR包: commons-lang.jar commons-beanutils.jar commons ...

  8. 【总结】使用jdbc+servlet开发一个bug管理系统的经验总结

    开发背景: 公司目前使用Teambition里面的task作为bug管理系统,既没有bug的当前状态,也不能写上bug的详细复现步骤,被assign了任务(该修复bug或者验证bug是否被修复)也没有 ...

  9. js中!!的作用

    js中!!的作用是: !!一般用来将后面的表达式转换为布尔型的数据(boolean) ===表示类型什么的全部相等(自己写一个if测试一下就好了)!==表示要全部不想等包括类型(一样写一个if)||或 ...

  10. Android笔记:C memory copy

    socket通讯问题之一: 在c中按字节发送数据  比如设备1状态(1字节)值(1字节)设备2状态(1字节)值(1字节)....这种格式拆分的问题 在c中可以利用struct的 memory copy ...