Jquery 实现原理之 Ajax

一:Jquery Ajax底层接口有$.ajaxPrefilters、$.ajaxTransport、$.ajaxSettings、$ajaxSetup、$ajaxSettings;

  其中$.ajaxPrefilters $.ajaxTransport是通过inspectPrefiltersOrTransports构造器来创建的;

$.ajaxPrefilters:是一个前置过滤器,在每个请求被$.ajaxTransport()和$.ajax()处理之前调用,设置自定义ajax选项或者修改现有的选项,简单说就是hack的  做法,但是比事件处理的hack的手法更加高明。可以用来处理参数,注册回调等。

例如:改变代理服务器的域请求

1 $.ajaxPrefilter("+*", function( options ) {
2   if ( options.crossDomain ) {
3     options.url = "http://mydomain.net/proxy/" + encodeURIComponent( options.url );
4     options.crossDomain = false;
5   }
6 });

 

$.ajaxTransport:是一个请求分发器,是发送请求的具体实现,比如xhr就用xmlhttprequest来实现,script就是通过head中插入script标签来实现.

例如:用来拦截发送的请求

 1 $.ajaxTransport("+*", function(options, originalOptions, jqXHR) {
 2         return {
 3             send: function(headers, completeCallback) {
 4                 var status = 404;
 5                 var statusText = "error";
 6                 var response = {
 7                     text: ""
 8                 };
 9                 var item = {            
10                     url: "/paapi/v1/datapoints/pa",
11                     data: data.groupsdatapoint
12                 };
13                 if (!item) {
14                     console.log("require mock data: \n" + originalOptions.url);
15                 } else {
16                     status = 200;
17                     statusText = "ok";
18                     var data = item.data;
19                     response.text = data;
20                 }
21                 setTimeout(function() {
22                     completeCallback(status, statusText, response);
23                 }, 0);
24             }
25         };
26     });

二: ajax的实现

  实现ajax的目的是什么?

实现ajax的目的主要是对不同的dataType的具体处理和实现,比如'jsonp'应该怎么处理,'script'怎么处理,'*'怎么处理;

对此ajax模块的做法是,提供一个基本的模块ajax,然后通过插件形式来实现对不同dataType的处理。

ajax暴露ajaxPrefilter: addToPrefiltersOrTransports( prefilters ) , ajaxTransport: addToPrefiltersOrTransports( transports )是给插件用的,可以注册自己的dataType处理函数。

其中prefilters={'jsonp': function() {}, '*': function(){}, 'script':function(){}}可能是这样的,ajax在每个请求发送之前,根据dataType调用prefilters中的函数进行预处理,然后调用transport中的对应函数来发送请求。

addToPrefiltersOrTransports()方法如下:

 1 function addToPrefiltersOrTransports(structure) {
 2 
 3      // dataTypeExpression is optional and defaults to "*"
 4      return function(dataTypeExpression, func) {
 5 
 6           if (typeof dataTypeExpression !== "string") {
 7                func = dataTypeExpression;
 8                dataTypeExpression = "*";
 9           }
10 
11           var dataType,
12                i = 0,
13                dataTypes = dataTypeExpression.toLowerCase().match(rnotwhite) || [];
14 
15           if (jQuery.isFunction(func)) {
16                // For each dataType in the dataTypeExpression
17                while ((dataType = dataTypes[i++])) {
18                     // Prepend if requested
19                     if (dataType[0] === "+") {
20                          dataType = dataType.slice(1) || "*";
21                          (structure[dataType] = structure[dataType] || []).unshift(func);
22 
23                          // Otherwise append
24                     } else {
25                          (structure[dataType] = structure[dataType] || []).push(func);
26                     }
27                }
28           }
29      };
30 }

该函数功能就是把某一个dataType对应的处理函数func存进structure中,实际就是一个简单的注册事件。

 1 // Base inspection function for prefilters and transports
 2 function inspectPrefiltersOrTransports(structure, options, originalOptions, jqXHR) {
 3 
 4      var inspected = {},
 5           seekingTransport = (structure === transports);
 6 
 7      function inspect(dataType) {
 8           var selected;
 9           inspected[dataType] = true;
10           jQuery.each(structure[dataType] || [], function(_, prefilterOrFactory) {
11                var dataTypeOrTransport = prefilterOrFactory(options, originalOptions, jqXHR);
12                if (typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[dataTypeOrTransport]) {
13                     options.dataTypes.unshift(dataTypeOrTransport);
14                     inspect(dataTypeOrTransport);
15                     return false;
16                } else if (seekingTransport) {
17                     return !(selected = dataTypeOrTransport);
18                }
19           });
20           return selected;
21      }
22 
23      return inspect(options.dataTypes[0]) || !inspected["*"] && inspect("*");
24 }
25 }

该代码时取调用dataType对应的prefilters和transports函数而已。

 

Ajax完成一部请求的全过程:

  • 创建了一个jqXHR对象,这个对象就是ajax的返回值
  • 用deferred对象封装jqXHR对象,因此可以实现链式的异步操作:xhr.complete(x).success(x).errorl(x),这里的complete,success和error就是promise对象的add, done和fail的别名而已。
  • 调用函数inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ),那些插件注册的prefilters函数就在这里被调用了。
  • 做了一大对后续的处理,比如设置header参数,设置缓存cache
  • 调用inspectPrefiltersOrTransports( transports, s, options, jqXHR )函数发送请求
  • 定义了done函数,当请求发送结束之后做后续处理,包括调用convert转换结果、设置statusText,调用deferred.resolveWith触发异步回调等
  • 最后返回了jqXHR对象

 

转载于:https://www.cnblogs.com/thonrt/p/5395718.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/470807.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一、AJAX学习笔记——原生AJAX (ajax简介、XML简介、ajax优缺点、ajax的使用)

第 1 章:原生 AJAX 1.1 AJAX 简介 AJAX 全称为 Asynchronous JavaScript And XML,就是异步的 JS 和 XML。 通过 AJAX 可以在浏览器中向服务器发送异步请求, 最大的优势:无刷新获取数据。 AJAX 不是新的编程语言,而是…

App安全之网络传输安全

移动端App安全如果按CS结构来划分的话,主要涉及客户端本身数据安全,Client到Server网络传输的安全,客户端本身安全又包括代码安全和数据存储安全。所以当我们谈论App安全问题的时候一般来说在以下三类范畴当中。 App代码安全,包括…

二、nodemon-Node.js 监控工具

nodemon-Node.js 监控工具 https://www.npmjs.com/package/nodemon 这个工具在我们改变了服务端代码时,会自动重启服务器,不需要我们再手动去重启服务器了,方面我们后面调试代码! 1. 安装 node :http://nodejs.cn/d…

利用动态规划(DP)解决 Coin Change 问题

问题来源 这是Hackerrank上的一个比较有意思的问题,详见下面的链接: https://www.hackerrank.com/challenges/ctci-coin-change 问题简述 给定m个不同面额的硬币,C{c0, c1, c2…cm-1},找到共有几种不同的组合可以使得数额为n的…

jquery datatable设置垂直滚动后,表头(th)错位问题

jquery datatable设置垂直滚动后&#xff0c;表头(th)错位问题 问题描述&#xff1a; 我在datatable里设置&#xff1a;”scrollY”: ‘300px’,垂直滚动属性后&#xff0c;表头的宽度就会错位&#xff0c;代码如下&#xff1a; <!-- HTML代码 --> <table id"dem…

三、解决ie缓存问题

解决 IE 缓存问题 问题&#xff1a;在一些浏览器中(IE),由于缓存机制的存在&#xff0c;ajax 只会发送的第一次请求&#xff0c;剩余多次请求不会在发送给浏览器而是直接加载缓存中的数据。 在谷歌浏览器中&#xff0c;修改了服务器代码&#xff0c;重新发送请求时&#xff0…

利用BFS和DFS解决 LeetCode 130: Surrounded Regions

问题来源 此题来源于LEETCODE&#xff0c;具体问题详见下面的链接 https://leetcode.com/problems/surrounded-regions/description/ 问题简述 给定一个包含字母 X 和 O 的二维矩阵&#xff0c;找到所有被 X 包围的 O 并将被包围的 O 变成 X。 比如给定如下矩阵&#xff1…

锁!代码锁

一&#xff0c;代码锁 异步 并发&#xff0c;各干各的 (比如&#xff1a;一群人同时上卡车) 同步 步调一致的处理 &#xff08;比如&#xff1a;一群人排队上公交车&#xff09; 多个线程并发读写同一个资源的时候会发生“线程并发安全问题”&#xff0c;如果保证…

imageNamed和imageWithContentsOfFile-无法加载图片的问题

问题描述 图片资源放在Assets.xcassets中&#xff0c;分别用UIImage的类方法imageNamed和imageWithContentsOfFile获取图片对象&#xff0c;但发生奇怪的情况&#xff0c;前者获取到图片对象&#xff0c;后者结果为nil。代码如下&#xff1a; 1.通过UIImage的类方法imageNamed:…

LeetCode 309: 一个很清晰的DP解题思路

问题来源 题目来源链接见下方&#xff1a; https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/description/ 问题简述&#xff1a; 假如有一个 i 个元素的数组&#xff0c;数组的每个元素表示了第 i 天某只股票的价格&#xff0c;设计一种算法来…

五、手动取消ajax请求 解决重复发送请求问题

server.js: // 1. 引入express const express require(express)// 2. 创建应用对象 const app express()// 3. 创建路由规则 app.get(/server, (request, response) > {// 设置响应头 设置允许跨域response.setHeader(Access-Control-Allow-Origin, *)// 设置响应体respo…

linux ps命令详解

ps命令用于监测进程的工作情况。进程是正在运行的程序&#xff0c;一直处于动态变化中&#xff0c;而ps命令所显示的进程工作状态时瞬间的。 使用方式&#xff1a;ps[options][-help] 常用参数&#xff1a; -A &#xff1a;显示所有进程 -a&#xff1a;显示一个终端的所有进程。…

用多元线性回归预测网页访问量(R语言)

前言 该问题来源于《机器学习:实用案例解析》中的第5章。在书中&#xff0c;已经对该问题给出了一种解决方案&#xff0c;但是我觉得写的还是太简略了一些&#xff0c;没有把考虑问题的整个思路给写出来&#xff0c;所以&#xff0c;在这里给出我的一些想法。 问题简述 我们…

六、jQuery 中的 AJAX 跨域问题

第 2 章&#xff1a;jQuery 中的 AJAX 官方中文文档&#xff1a;https://jquery.cuishifeng.cn/jQuery.Ajax.html 2.1 get 请求 $.get(url, [data], [callback], [type]) url:请求的 URL 地址。data:请求携带的参数。callback:载入成功时回调函数。type:设置返回内容格式&a…

LeetCode 474. Ones and Zeroes 动态规划解法+拓展

问题来源 此题来源于LeetCode 474. Ones and Zeroes 在写这篇之前&#xff0c;我百度了一下这道题&#xff0c;发现已经有很多人写过这个问题了&#xff0c;然而大多数只是为了答题而答题&#xff0c;给出了代码&#xff0c;很少有文字解释的&#xff0c;也很少有深入拓展的。…

常用的几种编程语言的介绍

编程语言&#xff08;programming language&#xff09;&#xff0c;来自百度百科的解释为&#xff1a;编程语言是用来定义计算机程序的形式语言。它是一种被标准化的交流技巧&#xff0c;用来向计算机发出指令。一种计算机语言让程序员能够准确地定义计算机所需要使用的数据&a…

三门问题(Monty Hall problem)背后的贝叶斯理论

文章目录1 前言2 问题简介3 直观的解释4 贝叶斯理论的解释1 前言 三门问题可以说有着各种版本的解释&#xff0c;但我看了几个版本&#xff0c;觉得没有把其中的条件说清楚&#xff0c;所以还是决定按照自己的理解记录一下这个特别有意思的问题。 2 问题简介 三门问题&#…

一、在vue项目中使用mock.js(详解)

步骤1.搭建测试项目 步骤1.1创建项目 命令&#xff1a; vue create mock-demo 步骤1.2安装依赖 命令&#xff1a; #使用axios发送ajax cnpm install axios--save #使用mockjs产生随机数据 cnpm install mockjs--save-dev #使用json5解决ison文件&#xff0c;无法添加注释…

matlab如何建立一个空矩阵,然后往里面赋值

1 x1:0.1:10; 2 y[]; 3 for i1:length(x) 4 % y[y;x(i)];%把每一个x都放到Y里&#xff0c;成为一列 5 y[y,x(i)];%把每一个x都放到Y里&#xff0c;成为一行 6 end 转载于:https://www.cnblogs.com/sddai/p/5410821.html