ajax常见面试题

304 阅读12分钟

非原创,多篇文章整理汇总

1:什么是ajax?ajax作用是什么?

它是一种异步通信的方法,通过直接由 js 脚本向服务器发起 http 通信,然后根据服务器返回的数据,更新网页的相应部分,而不用刷新整个页面的一种方法。

原理详述

Ajax的工作原理相当于在用户和服务器之间加了一个中间层(ajax引擎),让用户操作与服务器响应异步化。

并不是所有的用户请求都提交给服务器。

像—些数据验证(比如判断用户是否输入了数据)和数据处理(比如判断用户输入数据是否是数字)等都交给Ajax引擎自己来做。只有确定需要从服务器读取新数据时再由Ajax引擎代为向服务器提交请求。

把这些交给了Ajax引擎,用户操作起来也就感觉更加流畅了。

![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2019/12/10/16eeef016f3f767c~tplv-t2oaga2asx-image.image)

同步与异步

异步传输是面向字符的传输,它的单位是字符;

同步传输是面向比特的传输,它的单位是帧,它传输的时候要求接受方和发送方的时钟是保持一致的。

![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2019/12/10/16eeeee5a3e51861~tplv-t2oaga2asx-image.image)

同步,必须这个操作完了才会执行下一步,在等待期间浏览器会挂起不能执行任何接下来的js代码;

异步则是【告诉】浏览器去做,【告诉】是一瞬间的事情,然后就继续执行下一步了,等到结果返回来了,浏览器会通知js执行相应的回调。

2:原生js ajax请求有几个步骤?分别是什么

//创建 XMLHttpRequest 对象
var xhr = new XMLHttpRequest();
//规定请求的类型、URL 以及是否异步处理请求。
xhr.open('GET',url,true);
//发送信息至服务器时内容编码类型
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
//发送请求
xhr.send();  
//接受服务器响应数据
xhr.onreadystatechange = function () {
    if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 304)) { 
    }
};

3:XHR对象(XMLHttpRequest)

向服务器发送请求和解析服务器响应提供了流畅的接口

属性

1、onreadystatechange

一个JavaScript函数对象,当readyState属性改变时会调用它。回调函数会在user interface线程中调用。

2、readyState

表示请求/响应过程的当前活动阶段

  • 0:未初始化。尚未调用open()
  • 1:启动。已经调用open(),尚未调用send()
  • 2:发送。已经调用send(),尚未接收到响应
  • 3:接收。已经收到部分响应数据
  • 4:完成。已经收到全部响应数据

3、status

响应的HTTP 状态。

如 200 表示成功,而 404 表示 "Not Found" 错误。当 readyState 小于 3 的时候读取这一属性会导致一个异常。

4、statusText

HTTP 状态的说明。

当状态为 200 的时候它是 "OK",当状态为 404 的时候它是 "Not Found"。和 status 属性一样,当 readyState 小于 3 的时候读取这一属性会导致一个异常。

5、responseText

作为响应主体被返回的文本。

如果 readyState 小于 3,这个属性就是一个空字符串。当 readyState 为 3,这个属性返回目前已经接收的响应部分。如果 readyState 为 4,这个属性保存了完整的响应体。

6、responseXML

如果响应的内容类型是"text/xml"或"application/xml",这个属性将保存着响应数据的XML DOM文档。

方法

1、open()

作用:初始化请求

xhr.open(method,url,async,user,password)

method 请求方式,如get,post,put等等
url 请求路径,可以是相对路径也可以是绝对
async 是否异步请求 传布尔值,默认true
user 用户名,可选参数,为授权使用;默认参数为空string.
password 密码,可选参数,为授权使用;默认参数为空string.
复制代码

2、send()

作用:发送请求

参数为发送的请求体,不传请求体的话最好传个null

3、setRequestHeader()

作用:设置请求头

参数两个,第一个请求体名称header,第二个要赋的值value

4、abort()

作用:取消当前响应,关闭连接并且结束任何未决的网络活动。

这个方法把 XMLHttpRequest 对象重置为 readyState 为 0 的状态,并且取消所有未决的网络活动。例如,如果请求用了太长时间,而且响应不再必要的时候,可以调用这个方法。

5、getResponseHeader()

作用:返回指定响应头的值

参数:响应头的名称

6、getAllResponseHeaders()

作用:返回所有头部信息的字符串

4:json字符串转换集json对象、json对象转换json字符串

//字符串转对象
JSON.parse(json)
eval('(' + jsonstr + ')')   
// 对象转字符串
JSON.stringify(json)
复制代码

5:ajax几种请求方式?他们的优缺点?

常用的post,get,delete。不常用copy、head、link等等。

###代码上的区别
 1:get通过url传递参数
 2:post设置请求头  规定请求数据类型
###使用上的区别
 1:post比get安全
 (因为post参数在请求体中。get参数在url上面)
 2:get传输速度比post快 根据传参决定的。
 (post通过请求体传参,后台通过数据流接收。速度稍微慢一些。而get通过url传参可以直接获取)
 3:post传输文件大理论没有限制  get传输文件小大概7-8k ie4k左右
 4:get获取数据	post上传数据
 (上传的数据比较多  而且上传数据都是重要数据。所以不论在安全性还是数据量级 post是最好的选择)
复制代码

6:什么情况造成跨域?

同源策略限制 不同源会造成跨域。以下任意一种情况不同,都是不同源。

www.baidu.com/8080/index.…

http://协议不同
www子域名不同
baidu.com主域名不同
8080端口号不同
www.baidu.comip地址和网址不同

7:跨域解决方案有哪些?

1:jsonp 只能解决get跨域(问的最多)

  • 原理:动态创建一个script标签。利用script标签的src属性不受同源策略限制。因为所有的src属性和href属性都不受同源策略限制。可以请求第三方服务器数据内容。
  • 步骤:
  1. 去创建一个script标签

  2. script的src属性设置接口地址

  3. 接口参数,必须要带一个自定义函数名 要不然后台无法返回数据。

  4. 通过定义函数名去接收后台返回数据

    //去创建一个script标签 var script = document.createElement("script"); //script的src属性设置接口地址 并带一个callback回调函数名称 script.src = "http://127.0.0.1:8888/index.php?callback=jsonpCallback"; //插入到页面 document.head.appendChild(script); //通过定义函数名去接收后台返回数据 function jsonpCallback(data){ //注意 jsonp返回的数据是json对象可以直接使用 //ajax 取得数据是json字符串需要转换成json对象才可以使用。 }

Jsonp并不是一种数据格式,而json是一种数据格式,jsonp是用来解决跨域获取数据的一种解决方案,具体是通过动态创建script标签,然后通过标签的src属性获取js文件中的js脚本,该脚本的内容是一个函数调用,参数就是服务器返回的数据,为了处理这些返回的数据,需要事先在页面定义好回调函数,本质上用的并不是ajax技术

2:CORS:跨域资源共享

  • 原理:服务器设置Access-Control-Allow-OriginHTTP响应头之后,浏览器将会允许跨域请求
  • 限制:浏览器需要支持HTML5,可以支持POST,PUT等方法兼容ie9以上

    需要后台设置 Access-Control-Allow-Origin: * //允许所有域名访问,或者 Access-Control-Allow-Origin: a.com //只允许所有域名访问 复制代码

3:设置 document.domain

  • 原理:相同主域名不同子域名下的页面,可以设置document.domain让它们同域
  • 限制:同域document提供的是页面间的互操作,需要载入iframe页面

    // URL a.com/foo var ifr = document.createElement('iframe'); ifr.src = 'b.a.com/bar'; ifr.onload = function(){ var ifrdoc = ifr.contentDocument || ifr.contentWindow.document; ifrdoc.getElementsById("foo").innerHTML); };

    ifr.style.display = 'none'; document.body.appendChild(ifr); 复制代码

4:用Apache做转发(逆向代理),让跨域变成同域

8:http常见状态码有哪些?

一: 2开头状态码

2xx (成功)表示成功处理了请求的状态代码
200 (成功) 服务器已成功处理了请求。 通常。
复制代码

二: 3开头状态码

3xx (重定向) 表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向。
304 (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。
复制代码

三: 4开头状态码

4xx(请求错误) 这些状态代码表示请求可能出错,妨碍了服务器的处理
1:400 (错误请求) 服务器不理解请求的语法。

2:403 (禁止) 服务器拒绝请求。

3:404 (未找到) 服务器找不到请求的网页。
复制代码

四: 5开头状态码

5xx(服务器错误)这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错
500 (服务器内部错误) 服务器遇到错误,无法完成请求。

501 (尚未实施) 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。

502 (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。

503 (服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。

504 (网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。

505 (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。

9:优点和缺点

优点

1.无刷新更新数据。

AJAX最大优点就是能在不刷新整个页面的前提下与服务器通信维护数据。这使得Web应用程序更为迅捷地响应用户交互,并避免了在网络上发送那些没有改变的信息,减少用户等待时间,带来非常好的用户体验。

2.异步与服务器通信。

AJAX使用异步方式与服务器通信,不需要打断用户的操作,具有更加迅速的响应能力。优化了Browser和Server之间的沟通,减少不必要的数据传输、时间及降低网络上数据流量。

3.前端和后端负载平衡。

AJAX可以把以前一些服务器负担的工作转嫁到客户端,利用客户端闲置的能力来处理,减轻服务器和带宽的负担,节约空间和宽带租用成本。并且减轻服务器的负担,AJAX的原则是“按需取数据”,可以最大程度的减少冗余请求和响应对服务器造成的负担,提升站点性能。

4.基于标准被广泛支持。

AJAX基于标准化的并被广泛支持的技术,不需要下载浏览器插件或者小程序,但需要客户允许JavaScript在浏览器上执行。随着Ajax的成熟,一些简化Ajax使用方法的程序库也相继问世。同样,也出现了另一种辅助程序设计的技术,为那些不支持JavaScript的用户提供替代功能。

5.界面与应用分离。

Ajax使WEB中的界面与应用分离(也可以说是数据与呈现分离),有利于分工合作、减少非技术人员对页面的修改造成的WEB应用程序错误、提高效率、也更加适用于现在的发布系统。

缺点

1.AJAX干掉了Back和History功能,即对浏览器机制的破坏。

在动态更新页面的情况下,用户无法回到前一个页面状态,因为浏览器仅能记忆历史记录中的静态页面。一个被完整读入的页面与一个已经被动态修改过的页面之间的差别非常微妙;用户通常会希望单击后退按钮能够取消他们的前一次操作,但是在Ajax应用程序中,这将无法实现。

2.AJAX的安全问题。

简单版:ajax暴露了浏览器与服务器交互的细节。

AJAX技术给用户带来很好的用户体验的同时也对IT企业带来了新的安全威胁,Ajax技术就如同对企业数据建立了一个直接通道。这使得开发者在不经意间会暴露比以前更多的数据和服务器逻辑。Ajax的逻辑可以对客户端的安全扫描技术隐藏起来,允许黑客从远端服务器上建立新的攻击。还有Ajax也难以避免一些已知的安全弱点,诸如跨站点脚步攻击、SQL注入攻击和基于Credentials的安全漏洞等等。

3.对搜索引擎支持较弱。

对搜索引擎的支持比较弱。如果使用不当,AJAX会增大网络数据的流量,从而降低整个系统的性能。

4.破坏程序的异常处理机制。

至少从目前看来,像Ajax.dll,Ajaxpro.dll这些Ajax框架是会破坏程序的异常机制的。关于这个问题,曾在开发过程中遇到过,但是查了一下网上几乎没有相关的介绍。后来做了一次试验,分别采用Ajax和传统的form提交的模式来删除一条数据……给我们的调试带来了很大的困难。

5.违背URL和资源定位的初衷。

例如,我给你一个URL地址,如果采用了Ajax技术,也许你在该URL地址下面看到的和我在这个URL地址下看到的内容是不同的。这个和资源定位的初衷是相背离的。

6.AJAX不能很好支持移动设备。

一些手持设备(如手机、PDA等)现在还不能很好的支持Ajax,比如说我们在手机的浏览器上打开采用Ajax技术的网站时,它目前是不支持的。

7.客户端过肥,太多客户端代码造成开发上的成本。

编写复杂、容易出错 ;冗余代码比较多(层层包含js文件是AJAX的通病,再加上以往的很多服务端代码现在放到了客户端);破坏了Web的原有标准。