ajax入门之建立XHR对象

今天帮朋友写了一个简单的ajax的demo,发现了一些东西,决定写一篇文章记录一下,避免以后挖坑。

创建XMLHttpRequest
通常
 function createXHR(){
if(XMLHttpRequest){
return new XMLHttpRequest();
}else{
return new ActiveXObject('Microsoft.XMLHTTP')
}
}

这一段js代码来源自w3school,用于创建兼容各浏览器的XMLHttpRequest对象的含义:

检测客户端是否有XMLHttpRequest,否则使用ActiveXObject

关于XMLHttpRequest对象,IE5是第一个引入XHR对象的浏览器,在IE5中,XHR是通过activeX对象实现的.因此在IE中可能遇到三种不同版本的XHR对象,MXSML2.XMLHTTP,MXSML2.XMLHttp.3.0和MXSML2.XMLHttp.6.0。

IE的坑

为了向我们伟大的IE浏览器“致敬”,我们必须添加额外的代码进行创建 以下代码适用与IE7以下的情况:

function createXHR(){
if(typeof argument.callee.activeXString != 'string'){
var versions = ['MXSML2.XMLHTTP','MXSML2.XMLHttp.3.0','MXSML2.XMLHttp.6.0'];
var i len;
for(i = 0;len=versions.length;i<len;i++){
try{
new ActiveXObject(varsions[i]);
argument.callee.activeXString = varsions[i];
}catch{
<!-- 跳过 -->
}
}
}
return new ActiveXObject(argument.callee.activeXString);
}
完整走一遍

但往往我不会考虑这么多,能看懂前面的函数也是很不容易了,再让我写出来,我的天!当大家和我这么懒的时候,可以直接使用第一份代码,也就是w3school那一套代码,我们使用原生的XHR对象进行创建。 当然,我们这里也给出完整的代码。

function createXHR(){
if(typeof XMLHttpRequest != 'undefined'){
return new XMLHttpRequest();
}else if(typeof argument.callee.activeXString != 'string'){
var versions = ['MXSML2.XMLHTTP','MXSML2.XMLHttp.3.0','MXSML2.XMLHttp.6.0'];
var i len;
for(i = 0;len=versions.length;i<len;i++){
try{
new ActiveXObject(varsions[i]);
argument.callee.activeXString = varsions[i];
}catch{
<!-- 跳过 -->
}
}
return new ActiveXObject(argument.callee.activeXString);
}else{
throw new Error("没有XHR对象存在");
}
}
用法
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>demo</title>
</head>
<body>
<form> <button onclick="returnText();return false">登陆</button>
</form>
<script type="text/javascript">
function returnText(){
var xhr = createXHR();
xhr.onreadystatechange = function(){
if(xhr.readyState == 4){
if((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){
alert(xhr.responseText);
}else{
alert('获取失败'+xhr.status)
}
}
}
xhr.open('get','demo.php',true);
xhr.send(null); }
function createXHR(){
if(typeof XMLHttpRequest != 'undefined'){
return new XMLHttpRequest();
}else{
return new ActiveXObject('Microsoft.XMLHTTP')
}
}
</script>
</body>
</html>

创建好XHR对象只是第一步,才是我们各种操作的开始。

open()

open()函数会启动一个请求,但并不是发送,可以看作办事之前的准备。 它接受三个函数:

open(get/post,url,false/true)
  1. 请求类型:最常用的就是get和post

  2. 路径:就是要请求的操作的文件的url

  3. 是否异步,一般会使用 true ,用 false 毫无意义...

我们这是使用的是get方式,因为我们并没有要发送的数据。异步我们选择了true,无意中发现在使用false时候,火狐出现了警告:

主线程中同步的 XMLHttpRequest 已不推荐使用,因其对终端用户的用户体验存在负面影响。

具体需要再了解。

send(data); 

自然而然,准备好了就要发送,send()只接受一个参数,那就是要发送的数据。我们使用的是get,数据已经在URL中,那就null好了。

php

因为这篇文章主要是讲ajax,所以php部分我只用了最简单的echo

<?php
echo '成功了';
?>

这样就能在接受到请求后返回一个字符串。

回调函数

我们怎么样才能直到php文件将数据处理完,返回给客户端了呢? 这时候我们就需要监测XHR的readyState属性。先介绍以下readyState属性:

  1. 0:初始化未完成,未调用open()

  2. 1: 启动调永了open()函数,但是还没有send

  3. 2:发送,调用了send()函数,还没有接收到响应

  4. 3:开始接收,接收到部分的数据

  5. 4:完成,接收到了全部数据。

所以在上面的函数中我们可以看到,我们去监测readyState属性,等到等于4的时候,也就是数据接收完成之后,我们开始对数据进行处理。

小结

这是一个手动创建XHR对象并使用最简单的方法。以后回继续进行更新。介绍其更详细的用法。

ajax入门之建立XHR对象 (1)的更多相关文章

  1. 深入理解ajax系列第一篇——XHR对象

    × 目录 [1]创建对象 [2]发送请求 [3]接收响应[4]异步处理[5]实例演示 前面的话 ajax是asynchronous javascript and XML的简写,中文翻译是异步的java ...

  2. Ajax 入门之 GET 与 POST 的不同 (2)

    在之前的随笔中,本着怀旧的态度总结了一篇 兼容不同浏览器 建立XHR对象的方法: 在建立好XHR对象之后,客户端需要做的就是,将数据以某种方式传递到服务器,以获得相应的响应,在这里,  Ajax技术总 ...

  3. Ajax原生XHR对象

    前端学了有一段时间了,在项目中我通常使用的都是jQuery封装好的Ajax函数($.ajax.$.get.$.post),使用非常的简单方便,但为了更清楚的了解Ajax,需要学习原生xhr对象.   ...

  4. 深入理解 ajax系列第一篇(XHR 对象)

    1999年,微软公司发布了IE5, 第一次引入新功能:允许javascript 脚本向服务器发起 hffp 请求.这个功能方式并没有被引起注意,知道2004年 Gmail 发布和 Google Map ...

  5. 为XHR对象所有方法和属性提供钩子 全局拦截AJAX

    摘要 ✨长文 阅读约需十分钟 ✨跟着走一遍需要一小时以上 ✨约100行代码 前段时间打算写一个给手机端用的假冒控制台 可以用来看console的输出 这一块功能目前已经完成了 但是后来知道有一个腾讯团 ...

  6. 本文使用springMVC和ajax,实现将JSON对象返回到页面

    一.引言 本文使用springMVC和ajax做的一个小小的demo,实现将JSON对象返回到页面,没有什么技术含量,纯粹是因为最近项目中引入了springMVC框架. 二.入门例子 ①. 建立工程, ...

  7. 掌握 Ajax,第 1 部分: Ajax 入门简介

    转:http://www.ibm.com/developerworks/cn/xml/wa-ajaxintro1.html 掌握 Ajax,第 1 部分: Ajax 入门简介 理解 Ajax 及其工作 ...

  8. AJAX入门---DOM操作HTML

    AJAX入门---DOM操作HTML 一边学习AJAX一边坐着总结加深印象.上次写的是怎样简单的使用XMLHttpRequest对象.今天写的是DOM(文档对象模型(Document Object M ...

  9. Django学习——图书管理系统图书修改、orm常用和非常用字段(了解)、 orm字段参数(了解)、字段关系(了解)、手动创建第三张表、Meta元信息、原生SQL、Django与ajax(入门)

    1 图书管理系统图书修改 1.1 views 修改图书获取id的两种方案 1 <input type="hidden" name="id" value=& ...

随机推荐

  1. 什么是j2ee ??EJB与j2ee的关系?? 请看百度百科

    首先,EJB是j2ee的一部分. http://baike.baidu.com/link?url=SGmNOVWoaZ62WCjb7a_yzz-GBGsDT3jyFM1hsvv8ycAwusdmo_D ...

  2. python------unicode字符串转换为其他类型

    问题描述: 一下字符串转换为json类型 {u'src': u'crawl', u'cid': u'Ctengbangguoji', u'datatype': u'ItemBase', u'times ...

  3. XCode 7上传遇到ERROR ITMS-90535 Unexpected CFBundleExecutable Key. 的解决办法

    去第三方的info.plist文件中,比如TencentOpenApi_IOS_Bundle.bundel 的info.plist ,删除 executable file 这一行

  4. 编译时.test文件报错无法解决的方法,关闭test编译

    有几次遇到从网上下载到的iOS开源代码编译报错,报错位置为Test Target的源文件,我就挺奇怪我又没做测试为啥会编译Test Target的源文件,之前的暴力解决方法是把Test Target直 ...

  5. 【转】 Vim多行缩进及高级命令

    学习别人的帖子,把内容变成自己的就是成长,此处MARK下 Vim多行缩进技巧 1.按v进入visual状态,选择多行,用>或<缩进或缩出 2. 通常根据语言特征使用自动缩进排版:在命令状态 ...

  6. jsp发布后应用根目录

    1.发布到tomcat后获取应用的根目录 ServletContext s1=this.getServletContext(); String temp=s1.getRealPath("/& ...

  7. linux内核——1.概述

    1.结构 linux中,我们把操作系统分为内核空间和用户空间.用户通过用户空间与操作系统打交道.用户要通过系统调用访问内核空间.下图为Linux体系结构,shell应该为在最顶层. 系统调用,下面链接 ...

  8. UVa 10074 - Take the Land

    题目大意:和UVa 836 - Largest Submatrix差不多,只需要修改一下数据就可以了. #include <cstdio> #include <cstring> ...

  9. 4、安卓数据存储——sqlite

    朋友圈里的每一个消息体里面的数据,当下拉刷新从服务器下载数据包后,存入sqlite:用户名.图片url.点赞.评论等等.上拉加载的时候,从数据库里取出最近的5条数据加载到朋友圈上. Android通过 ...

  10. UWP 中实现一个颜色选择器 UWPColorPickerControl

    最近在实现一个远程数字白板时,发现UWP平台上颜色选择不方便,因此自己动手写了一个. 效果图 实现 <UserControl x:Class="UWPColorPickerLibrar ...