Javascript AJAX

什么是 AJAX?

AJAX = 异步 JavaScript 和 XML。

AJAX 是一种用于创建快速动态网页的技术。

通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

传统的网页(不使用 AJAX)如果需要更新内容,必需重载整个网页面。

有很多使用 AJAX 的应用程序案例:新浪微博、Google 地图等。

AJAX 的作用

当向后台发送少量的数据时,通过 AJAX 的技术可以实现界面局部刷新,提高程序的运行效率。

ajax 技术可以实现整个页面无刷新

同步和异步的区别

你应该知道,javascript 语言是一门“单线程”的语言,不像 java 语言,类继承 Thread 再来个 thread.start 就可以开辟一个线程,所以,javascript 就像一条流水线,仅仅是一条流水线而已,要么加工,要么包装,不能同时进行多个任务和流程。

我个人觉得 js 官方的文档在使用两个词的时候并不准确,包括很多其他词汇,都只是听起来高深,但实际应用好像跟这些词没半毛钱关系。例如“事件委托”这个词,不知道的人乍一看谁又能说出“事件委托”是什么意思?委托什么事件?怎么个委托,我看不如干脆就叫“事件在外层元素中的捕获”,虽然长一点,一下就能看懂。

其实同步和异步,无论如何,做事情的时候都是只有一条流水线(单线程),同步和异步的差别就在于这条流水线上各个流程的执行顺序不同。

最基础的异步是 setTimeout 和 setInterval 函数,很常见,但是很少人有人知道其实这就是异步,因为它们可以控制 js 的执行顺序。我们也可以简单地理解为:可以改变程序正常执行顺序的操作就可以看成是异步操作。如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<script type="text/javascript">
console.log( "1" );
setTimeout(function() {
console.log( "2" )
}, 0 );
setTimeout(function() {
console.log( "3" )
}, 0 );
setTimeout(function() {
console.log( "4" )
}, 0 );
console.log( "5" );
</script>
输出顺序是什么呢? 1 5 2 3 4;

可见,尽管我们设置了 setTimeout(function,time)中的等待时间为 0,结果其中的 function 还是后执行。

火狐浏览器的 api 文档有这样一句话:Because even though setTimeout was called with a delay of zero, it’s placed on a queue and scheduled to run at the next opportunity, not immediately. Currently executing code must complete before functions on the queue are executed, the resulting execution order may not be as expected.

意思就是:尽管 setTimeout 的 time 延迟时间为 0,其中的 function 也会被放入一个队列中,等待下一个机会执行,当前的代码(指不需要加入队列中的程序)必须在该队列的程序完成之前完成,因此结果可能不与预期结果相同。

这里说到了一个“队列”(即任务队列),该队列放的是什么呢,放的就是 setTimeout 中的 function,这些 function 依次加入该队列,即该队列中所有 function 中的程序将会在该队列以外的所有代码执行完毕之后再以此执行,这是为什么呢?因为在执行程序的时候,浏览器会默认 setTimeout 以及 ajax 请求这一类的方法都是耗时程序(尽管可能不耗时),将其加入一个队列中,该队列是一个存储耗时程序的队列,在所有不耗时程序执行过后,再来依次执行该队列中的程序。

又回到了最初的起点——javascript 是单线程。单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着。于是就有一个概念——任务队列。如果排队是因为计算量大,CPU 忙不过来,倒也算了,但是很多时候 CPU 是闲着的,因为 IO 设备(输入输出设备)很慢(比如 Ajax 操作从网络读取数据),不得不等着结果出来,再往下执行。于是 JavaScript 语言的设计者意识到,这时主线程完全可以不管 IO 设备,挂起处于等待中的任务,先运行排在后面的任务。等到 IO 设备返回了结果,再回过头,把挂起的任务继续执行下去。

于是,所有任务可以分成两种,一种是同步任务(synchronous),另一种是异步任务(asynchronous)。同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;异步任务指的是,不进入主线程、而进入”任务队列”(task queue)的任务,只有等主线程任务执行完毕,”任务队列”开始通知主线程,请求执行任务,该任务才会进入主线程执行。

具体来说,异步运行机制如下:

(1)所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。
(2)主线程之外,还存在一个”任务队列”(task queue)。只要异步任务有了运行结果,就在”任务队列”之中放置一个事件。
(3)一旦”执行栈”中的所有同步任务执行完毕,系统就会读取”任务队列”,看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
(4)主线程不断重复上面的第三步。

只要主线程空了,就会去读取”任务队列”,这就是 JavaScript 的运行机制。这个过程会不断重复。

“任务队列”是一个事件的队列(也可以理解成消息的队列),IO 设备完成一项任务,就在”任务队列”中添加一个事件,表示相关的异步任务可以进入”执行栈”了。主线程读取”任务队列”,就是读取里面有哪些事件。
“任务队列”中的事件,除了 IO 设备的事件以外,还包括一些用户产生的事件(比如鼠标点击、页面滚动等等),比如$(selectot).click(function),这些都是相对耗时的操作。只要指定过这些事件的回调函数,这些事件发生时就会进入”任务队列”,等待主线程读取。
所谓”回调函数”(callback),就是那些会被主线程挂起来的代码,前面说的点击事件$(selectot).click(function)中的 function 就是一个回调函数。异步任务必须指定回调函数,当主线程开始执行异步任务,就是执行对应的回调函数。例如 ajax 的 success,complete,error 也都指定了各自的回调函数,这些函数就会加入“任务队列”中,等待执行。

AJAX 请求数据过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
1、准备一个ajax独对象

ifwindow.XMLHttpRequest){

ajax = new XMLHttpRequest();

}else{

ajax = new ActiveXObject("Microsoft。XMLHTTP"

}

2、和服务器建立连接----通过open方法

ajax.open("get","url","true");

第一个参数 : 请求方向;

第二个参数 : 请求路径;

第三个参数 : 同步/异步 true 表示异步

3、发送数据

ajax。send();

4、服务器相应数据 并将处理结果返回给客户端

通过 onreadystatechange 事件相应服务器的数据

根据 readState 判断数据

//服务器相应数据核实,并将处理的结果返回客户端

ajax.onreadystatechange = function(){

if(ajax.readyState==4){

if(ajax.status == 200){

//交易成功返回数据

alert( ajax.responseText );

}

}

}

缓存

计算机中的缓存 : 是 CPU 和内存之前的一块存储区 容量小 交换数据速度快

浏览器中的缓存 : 记录浏览的历史记录的数据

IE 浏览器容易出现缓存问题

解决办法 : 更改 URL

ajax.open(”get”,(this.index+1)+”.txt?id=”+new Date().getTime(),true);

ajax.open (“get”,(this.index+1)+”.txt?id=”+Math.random(),true );

AJAX 的 post 提交和 get 提交的区别

post 方式需要设置请求头 请求头必须在 open 下面 注意顺序问题

ajax.setRequestHeader(“Content-Type”,”application/x-www-form-urlencoded”);

从服务器返回的数据永远都是字符串。

同源策略

所谓的同源 就是指 ajax 在请求数据时, 保证 协议、域名、端口号 完全一致,才能够通过请求

同源策略是浏览器的一个行业标准,有了同源策略保证用户数据的安全性。

所有的 javascript 都要遵循这个同源策略的

ajax 不能实现跨域请求数据(受同源策略的影响不能实现跨域)12-07

本文标题:Javascript AJAX

文章作者:Jonathon

发布时间:2019年03月01日 - 16:03

最后更新:2019年03月01日 - 17:03

原始链接:https://www.jonathon.cn/js7.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

苟富贵,勿相忘!