javaScript学习之ajax
一.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的更多相关文章
- JavaScript学习总结 Ajax和Http状态字
Ajax及其工作原理 AJAX 是一种与服务器交换数据无需刷新网页的技术,最早由Google公司在谷歌地图里使用,并迅速风靡. AJAX是不能跨域的,如需跨域,可以使用document.domain= ...
- 高性能javascript学习笔记系列(6) -ajax
参考 高性能javascript javascript高级程序设计 ajax基础 ajax技术的核心是XMLHttpRequest对象(XHR),通过XHR我们就可以实现无需刷新页面就能从服务器端读 ...
- javascript学习笔记一
今天看的javascript 应用开发实践指南 看了js库 jquery ,明确了要深入学习jquery的想法. 对于javascript原生态的ajax写法(兼容性只需考虑ie6),封装为函数: f ...
- 嘿嘿。今天学习了AJAX的几个方法
原文:嘿嘿.今天学习了AJAX的几个方法 今天学习了AJAX的几个方法,其实我很早在公司实习的时间就认识了它,但是对它一无所知,也并没有去学习它,今天学习它让我感到很兴奋因为重新了解了它,嘿嘿,下面就 ...
- Javascript学习6 - 类、对象、继承
原文:Javascript学习6 - 类.对象.继承 Javasciprt并不像C++一样支持真正的类,也不是用class关键字来定义类.Javascript定义类也是使用function关键字来完成 ...
- JavaScript学习--(智能社视频)
JavaScript学习,这是智能社官网上的JS视频,讲解的挺不错的,就是没有视频的demo,在视频中附上自己编写的一些demo... 下载地址:http://pan.baidu.com/s/1cPz ...
- javascript进阶之AJAX
AJAX 一 AJAX预备知识:json进阶 1.1 什么是JSON? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.JSON是用字符串来表示Javas ...
- JavaScript之使用AJAX(适合初学者)
网上关于AJAX的教程和分享层出不穷,现实生活中关于AJAX的书籍也是琳琅满目,然而太多的选择容易令人眼花缭乱,不好取舍.事实是,一般的教程或书籍都不会讲Web服务器的搭建,因此,对于初学者(比如 ...
- JavaScript学习历程和心得体验
一.前言 在过去,JavaScript只是被用来做一些简单的网页效果,比如表单验证.浮动广告等,所以那时候JavaScript并没有受到重视.自从AJAX开始流行后,人们发现利用JavaScript可 ...
随机推荐
- jQuery中添加/改变/移除改变CSS样式例子
在jquery中对于div样式操作我们会使用到CSS() removeClass() addClass()方法来操作了,下面我们就整理了几个例子大家一起来看看吧. CSS()方法改变CSS样式 ...
- 只要项目是maven构建的,pom.xml中依赖的jar包全都默认去你电脑本地仓库去找
只要项目是maven构建的,pom.xml中依赖的jar包全都默认去你电脑本地仓库去找
- 送给使用phpstorm+thinkphp开发者的福利
送给使用phpstorm+thinkphp开发者的福利 记得两年前的这个时候,我开始学习php.我选择了thinkphp入门,写了我的第一个简单的cms.当时我什么都不懂,但是这里的技术氛围好的, ...
- wordpress 自定义面板显示不了挂件区问题
刚才在写一个wordpress主题,遇到一个问题.注册好的挂件区在控制面板(dashboard)上显示,在自定义面板上却不显示. 查询了下,发现几个老外朋友也遇到了这个问题: http://wordp ...
- lvs nginx HAProxy优缺点
LVS的优点:1、抗负载能力强、工作在第4层仅作分发之用,没有流量的产生,这个特点也决定了它在负载均衡软件里的性能最强的;无流量,同时保证了均衡器IO的性能不会受到大流量的影响;2、工作稳定,自身有完 ...
- image hover
http://www.nxworld.net/tips/css-image-hover-effects.html
- ArcGIS for Sever 10.1 服务迁移与恢复
=== 声明:以下内容本是自己写给单位内部同事的参考手册,但是被传到百度文库中.陆续有用户就这方面的问题,通过电话,邮件等方式联系我.首先,感到荣幸.其次是,由于本人当时测试和编写的时候,由于仓促,可 ...
- 如何获取DIV的id
$(obj).attr("id");参数可以是id也可以是其他例如name等属性
- 九 spring和mybatis整合
1 spring和mybatis整合 1.1 整合思路 需要spring通过单例方式管理SqlSessionFactory. spring和mybatis整合生成代理对象,使用Sq ...
- ubuntu挂载其他分区到/home下,将当前分区内容替换
有时候,我们装系统时,可能因为没注意,把某一个分区分小了,导致到最后,我们的那个盘容不下了, 这时,面临的两个选择就是:要么卸载一些软件,要么重新分区,重装系统,其实,还可以这样,去把其他 多余的盘分 ...