博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于jQuery的ajax的源码的dataType解读
阅读量:5142 次
发布时间:2019-06-13

本文共 2791 字,大约阅读时间需要 9 分钟。

  $.ajax其实底层还是用的XMLHttpRequest,对于加载数据的格式datatype有:xml、text、html、json、jsonp、script。

其中xml、text不需要处理,直接使用原生的responseXML、responseText。对于html、json其实也是用responseText接收的,对于json格式,jquery拿到responseText后会预先用JSON.parse()去格式化一下json数据再传给回调函数。

对于jsonp和script的,其实不走xhr对象,直接使用script标签。但是在使用datatype=script之前,jquery还是做了判断,只有跨域请求才会走<script>标签。

具体判断如下:

s.crossDomain = !!( parts &&                ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||                    ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !==                        ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) )            );

此处代码会判断(请求的url===location.href)。如果不等于,相当于跨域,jquery会主动判断为跨域请求,使用script标签进行处理。如下代码:

jQuery.ajaxTransport( "script", function( s ) {    // This transport only deals with cross domain requests    if ( s.crossDomain ) {//jquery判断是否跨域,跨域才会添加script标签        var script,            head = document.head || jQuery( "head" )[ 0 ] || document.documentElement;        return {            send: function( _, callback ) {                script = document.createElement( "script" );                script.async = true;                if ( s.scriptCharset ) {                    script.charset = s.scriptCharset;                }                script.src = s.url;                // Attach handlers for all browsers                script.onload = script.onreadystatechange = function( _, isAbort ) {                    if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {                        // Handle memory leak in IE                        script.onload = script.onreadystatechange = null;                        // Remove the script                        if ( script.parentNode ) {                            script.parentNode.removeChild( script );                        }                        // Dereference the script                        script = null;                        // Callback if not abort                        if ( !isAbort ) {                            callback( 200, "success" );                        }                    }                };                // Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending                // Use native DOM manipulation to avoid our domManip AJAX trickery                head.insertBefore( script, head.firstChild );            },            abort: function() {                if ( script ) {                    script.onload( undefined, true );                }            }        };    }} );

  同时在请求之前,jquery还做了一些事情。

header里写了:

X-Requested-With = "XMLHttpRequest";

If-Modified-Since = url;

Content-Type = application/x-www-form-urlencoded; 这个是让ajax提交模拟form表单提交的数据,从浏览器端看到的是如下:

 

转载于:https://www.cnblogs.com/freefish12/p/5564630.html

你可能感兴趣的文章
字符串和字符数组的输入输出种类对比
查看>>
Python爬虫:抓取手机APP的数据
查看>>
手指滑动屏幕原理
查看>>
对于javascript里面闭包的理解
查看>>
LANMP安装总结
查看>>
因为没有打开的文档,所以这一命令无效==操作word问题
查看>>
C++获取Windows7 32位系统中所有进程名(类似于任务管理器中的进程)
查看>>
团队作业8----第二次项目冲刺(Beta阶段) 第三天
查看>>
用mrpt库时遇到的一个坑
查看>>
【19】235. Lowest Common Ancestor of a Binary Search Tree
查看>>
关闭vs的编译警告
查看>>
opencv载入,显示及保存图像
查看>>
C++回调机制实现(转)
查看>>
iOS基础篇 - UIWindow的简单介绍
查看>>
处理重复导入的方法之一
查看>>
五十六. playbook基础 、 playbook进阶
查看>>
PICT测试工具的安装及使用
查看>>
ORA-28000: the account is locked-的解决办法
查看>>
只有ReflectionOnlyLoadFrom才可以拯救与GAC冲突的强命名程序集
查看>>
Day44:MySQL(单表的表记录的操作)
查看>>