1、ajax是什么?

ajax: asynchronous javascript and xml: 异步的javascript和xml。

ajax是一种用来改善用户体验的技术,其本质是利用浏览器内置的一种特殊的对象(XMLHttpRequest)异步(即发送请求时,浏览器不会销毁当前页面,用户可以继续在当前页面做其它的操作)的向服务器发送请求,并且利用服务器返回的数据(不再是一个完整的页面,只是部分的数据,一般使用文本或者xml返回)来部分更新当前页面。

使用ajax技术之后,页面无刷新,并且不打断用户的操作。

2、ajax对象

(1)如何获得ajax对象?

XMLHttpRequest并没有标准化,要区分浏览器:

function getXhr()

{

var xhr;

if(window.XMLHttpRequest){

xhr = new XMLHttpRequest();    // 非ie浏览器

}else{

xhr = new ActiveXObject('Microsoft.XMLHttp');   // ie浏览器

}

}

(2)ajax对象的属性

a. onreadystatechange: 绑订一个事件处理函数(即: 注册一个监听器)

当ajax对象的readyState值发生了改变(比如,

从0-->1),就会产生readystatechange事件。

b. responseText: 获得服务器返回的文本

c. responseXML:  获得服务器返回的XML dom对象

d. status:        获得状态码

e. readyState:   返回ajax对象与服务器通讯的状态。返回值是一个number类型的值,不同的值表示不同的含义:

0: (为初始化)    --> 对象已建立,但是尚未初始化(尚未调用 open方法)

1: (初始化)     --> 对象已建立,尚未调用send方法

2: (发送数据)   --> send方法已调用

3: (数据传送中) --> 已接受部分数据

4: (响应结束)   --> 接收了所有的数据

(3)ajax编程的基本步骤

1) 获取ajax对象(XmlHttpRequest)

2) 使用 XmlHttpRequest向服务器发送请求

3) 在服务器端处理请求

4) 在监听器当中,处理服务器返回的响应

1) 获取ajax对象(XmlHttpRequest)

var xhr = getXhr();

2) 发送请求

xhr.open(请求方式, 请求地址, 异步还是同步);

请求方式: get/post

请求地址:如果是get请求,请求参数要添加到请求地址的后面。

true表示异步请求: ajax对象发请求的同时,用户可以对当前

页面做其它的操作。一般常用异步。

false表示同步请求:ajax对象发请求的同时,浏览器会锁订当

前页面,用户需要等待处理完成之后才能做下一步操作。

方式一: get请求

var xhr = getXhr();

xhr.open('get', 'check_name.action?name=zs', true);

xhr.onreadystatechange=f1;

xhr.send(null);

方式二: post请求

var xhr = getXhr();

xhr.open('post', 'check_username.action', true);

// 如果发送的是 post请求,需要设置消息头的编码格式为 “application”

xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded');

xhr.onreadystatechange=f1;

xhr.send('username=' + $F('username'));

注意:

因为按照http协议的要求,如果发送的post请求,请求数据包里面,应该有一个消息头 content-type。但是,ajax对象默认没有,所以,需要调用setRequestHeader方法。

3) 编写服务器端的代码,服务器端一般不需要返回完整的页面,只需要返回部分的数据,比如一个简单的字符串。

4) 编写监听器

function f1(){

if(xhr.readyState == 4){

//获得服务器返回的数据

var txt = xhr.responseText;

//dom操作

}

}

<script type="text/javascript">

function $(id) // ajax常用函数的定义

{

return document.getElementById(id);

}

function $F(id) {

return document.getElementById(id).value;

}

function getXhr() // 获取 XMLHttpRequest

{

var xhr;

if(window.XMLHttpRequest){

xhr = new XMLHttpRequest();    // 非ie浏览器

}else{

xhr = new ActiveXObject('Microsoft.XMLHttp');   // ie浏览器

}

}

GET方式:

function check_name()

{

// 第一步: 获得 ajax对象

var xhr = getXhr();

// 第二步: 发送请求

xhr.open('get', 'check_name.action?name=' + $F('uname'), true);

// 第三步: ajax函数: 注册一个事件监听器

xhr.onreadystatechange = function()   //此函数为 匿名函数,内部函数

{

// 只有ajax对象的readyState值为4时,才能获得服务器返回的数据

if(xhr.readyState == 4)

{

// 获得服务器返回的文本数据

var txt = xhr.responseText;

// 更新页面

${'name_msg'}.innerHTML = txt;

}

}

$('name_msg').innerHTML = '正在验证....';

// 第四步: 发送请求

xhr.send(null);

}

POST方式:

function check_name()

{

// 第一步: 获得 ajax对象

var xhr = getXhr();

// 第二步: 发送请求

xhr.open('post', 'check_name.action', true);

xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded');

// 第三步: ajax函数

xhr.onreadystatechange = function()   //此函数为 匿名函数,内部函数

{

// 只有ajax对象的readyState值为4时,才能获得服务器返回的数据

if(xhr.readyState == 4)

{

// 获得服务器返回的文本数据

var txt = xhr.responseText;

// 更新页面

${'name_msg'}.innerHTML = txt;

}

}

$('name_msg').innerHTML = '正在验证....';

// 第四步: 发送请求

xhr.send('username=' + $F('uname'));

}

用GET 还是 POST?

与 POST 相比,GET 更简单也更快,并且在大部分情况下都能用。然而,在以下情况中,请使用 POST 请求:

(1) 无法使用缓存文件(更新服务器上的文件或数据库)

(2) 向服务器发送大量数据(POST 没有数据量限制)

(3) 发送包含未知字符的用户输入时,POST 比 GET 更稳定也更可靠

ajax编程中的编码问题

(1) 发送get请求:

ie浏览器内置的ajax对象,对中文参数使用gbk编码,而其它浏览器(firefox,chrome)使用utf8编码。

服务器端默认使用iso-8859-1去解码。

解决方案:

1) 服务器对get请求中的参数使用指定的编码格式进行解码。

比如: 对于tomcat,可修改conf/server.xml(添加URIEncoding="UTF-8")

即: 告诉服务器,对于所有的get请求,使用utf-8进行编码/解码

2) 对请求地址,使用encodeURI函数进行统一的编码(UTF-8)

该函数的作用: 对请求地址中的中文进行“UTF-8”编码。

var uri = 'check_username.action?username=' + $F{'username'};

var uri2 = encodeURI(uri); // 进行编码,欺骗浏览器,防止出现乱码

xhr.open('get', uri2, true);

总结:

解决get请求传递中文参数乱码问题:

(1) 修改 tomcat下的 server.xml, 在 Connection后添加

URIEncoding="UTF-8", 告诉服务器,对于get请求中的数据,使用UTF-8解码。

(2) 在 ajax在发送get请求前,添加:

var uri = 'check_uname.action?uname=' + $F{'uname'};

xhr.open('get', encodeURI(uri), true);

用上面2步,可结果ajax中get请求参数 中文乱码问题(对所以浏览器都适用).

(2)发送post

所有浏览器内置的ajax对象都会使用utf-8进行编码。

解决方案:

request.setCharacterEncoding("utf-8");

ajax应用中的缓存问题:

当使用IE浏览器时,如果使用get方式发请求,浏览器会将数据缓存起来。

这样,当再此发送请求时,如果请求地址不变,IE浏览器不会真正地向服务器发送请求,而是将之前缓存的数据显示给用户 。

解决方式1: 使用post方式发请求。

解决方式2: 在请求地址后面添加一个随机数:

xhr.open('get', 'some?tt=' + Math.random(), true);

5、发送同步请求

xhr.open('post','check_username.do',false);

ajax是什么的更多相关文章

  1. jQuery之ajax实现篇

    jQuery的ajax方法非常好用,这么好的东西,你想拥有一个属于自己的ajax么?接下来,我们来自己做一个简单的ajax吧. 实现功能 由于jq中的ajax方法是用了内置的deferred模块,是P ...

  2. Ajax及跨域

    概念 Ajax Ajax,Asynchronous JavaScript and XML,字面意思:异步的 JavaScript 和 XML,是指一种创建交互式网页应用的网页开发技术. 用于异步地去获 ...

  3. 一个粗心的Bug,JSON格式不规范导致AJAX错误

    一.事件回放  今天工作时碰到了一个奇怪的问题,这个问题很早很早以前也碰到过,不过没想到过这么久了竟然又栽在这里. 当时正在联调一个项目,由于后端没有提供数据接口,于是我直接本地建立了一个 json ...

  4. ABP文档 - Javascript Api - AJAX

    本节内容: AJAX操作相关问题 ABP的方式 AJAX 返回信息 处理错误 HTTP 状态码 WrapResult和DontWrapResult特性 Asp.net Mvc 控制器 Asp.net ...

  5. ajax异步请求

    做前端开发的朋友对于ajax异步更新一定印象深刻,作为刚入坑的小白,今天就和大家一起聊聊关于ajax异步请求的那点事.既然是ajax就少不了jQuery的知识,推荐大家访问www.w3school.c ...

  6. 调用AJAX做登陆和注册

    先建立一个页面来检测一下我们建立的用户名能不能用,看一下有没有已经存在的用户名吗 可以通过ajax提示一下 $("#uid").blur(function(){ //取用户名 va ...

  7. Ajax 概念 分析 举例

    Ajax是结合了访问数据库,数据访问,Jquery 可以做页面局部刷新或者说是页面不刷新,我可以让页面不刷新,仅仅是数据的刷新,没有频繁的刷页面,是现在比较常用的一种方式做页面那么它是怎么实现页面无刷 ...

  8. ajax

    常见的HTTP状态码状态码:200 请求成功.一般用于GET和POST方法 OK301 资源移动.所请求资源移动到新的URL,浏览器自动跳转到新的URL Moved Permanently304 未修 ...

  9. 学习笔记之MVC级联及Ajax操作

    由于刚转型到MVC,MVC的架构模式很多不是很清楚,比如今天就想做个级联的操作,因为之前的ASP.NET的方式是通过:控件-->添加事件-->后台编写级联事件进行触发,但是这个MVC就不同 ...

  10. javascript表单的Ajax 提交插件的使用

    Ajax 提交插件 form.js 表单的下载地址:官方网站:http://malsup.com/jquery/form/ form.js 插件有两个核心方法:ajaxForm()和ajaxSubmi ...

随机推荐

  1. 51nod算法马拉松14

    这次太丢人了只搞出来了A到D,那就将就写一写A到D... A 棋盘问题 脑筋急转弯题,不难发现每一次两个人只能染白奇数个格子,所以数数有奇数还是偶数个白格子就行了. #include<cstdi ...

  2. BZOJ4127: Abs

    Description 给定一棵树,设计数据结构支持以下操作 1 u v d 表示将路径 (u,v) 加d 2 u v 表示询问路径 (u,v) 上点权绝对值的和 Input 第一行两个整数n和m,表 ...

  3. poj 1847 最短路简单题,dijkstra

    1.poj  1847  Tram   最短路 2.总结:用dijkstra做的,算出a到其它各个点要改向的次数.其它应该也可以. 题意: 有点难懂.n个结点,每个点可通向ki个相邻点,默认指向第一个 ...

  4. FMS直播流发布时 Microphone Speex 编码设置注意事项

    1.为何要用 Speex?FP的默认音频编码是 NellyMoser,而FP10之后加入了 Speex.实际应用中,用默认的 NellyMoser 编码音频,会有个很大的问题,就是无法控制流码率浮动. ...

  5. 利用jdk自带的运行监控工具JConsole观察分析Java程序的运行

    利用jdk自带的运行监控工具JConsole观察分析Java程序的运行 原文链接 一.JConsole是什么 从Java 5开始 引入了 JConsole.JConsole 是一个内置 Java 性能 ...

  6. Implement strStr()

    Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if needle ...

  7. php中提示Undefined index的解决方法

    我们经常接收表单POST过来的数据时报Undefined index错误,如下: $act=$_POST['action']; 用以上代码总是提示 Notice: Undefined index: a ...

  8. JAVA 线程同步异步简单实例

    package test; public class testThread { public static void main(String[] args) { Example example = n ...

  9. cursor 手型样式

    cursor:hand 与 cursor:pointer 的效果是一样,都像手形光标.但用FireFox浏览时才注意到使用cursor:hand在FireFox里并被支持.cursor:hand :I ...

  10. vue 一些开发姿势

    .vue : <template></template><script></script> .js :import Vue from 'vue'