文档。关于XMLHttpRequest和js 的问题整理

2017/12/13


XMLHttpRequest 对象的 onload 回调函数是在异步请求加载完成后所执行的函数,当JavaScript 监测到请求的数据全部传输完成后就会触发该函数。而 open() 函数设置异步请求的 method、URL 和同步方式等参数,执行 open() 后再执行 send() 函数才开始向服务器发送请求。

另外,onload 回调函数实际上是 XHR2 中新加入的功能,部分浏览器可能不支持这个函数名。要避免不兼容的现象,可以使用传统  XMLHttpRequest,如:

//省略其他代码
request.onreadystatechange= function ()  // 状态改变回调函数
{
   // 判断 request.readyState==4 的效果等同于 onload 
   if (request.readyState==4 && request.status==200)
   {
     // 加载且响应正常完成后执行的代码.... 
   }
}
request.open( "GET" ,url, true );  // 打开对象,也可以说是设置参数
request.send();  // 发送请求

 

还有一些误解需要澄清一下,

  1. window.onload 回调函数其实是在页面加载完成后(包括图片内容的显示)才会执行,并不是页面加载的等待过程中就执行。

  2. request.open() 并没有发送请求,只是设置一些参数,在 send() 时才会发送(注意不要漏写这条语句),发送后就会进入 readyState 监听状态,当 readyState 的值有改变就会执行 onreadystatechange 回调函数,当异请求的步数据接收完成(即 readyState 变为 4)后就会执行 onload 回调函数(注意仅在 XHR2 中有效)。



$('#id)[0]

取原生态的DOM对象,因为jquery会把选择器匹配的dom对象存放在以$.fn.init为构造函数生成对象的泛型数组里。

①首先得明白jQuery对象只能使用jQuery对象的属性和方法,JavaScript对象只能使用JavaScript对象的属性和方法;
②files[0]是JavaScript的属性;
③$('xx')是jQuery对象,$('xx')[0]是将jQuery对象:$('xx')转换为JavaScript对象,这样才可以使用JavaScript对象的属性和方法;
④我们再看这行代码的背景,HTML5支持multiple属性,即<input type="file">可能会添加multiple属性并赋值:multiple="multiple",即<input type="file" multiple="multiple">,这样一次性可同时上传多张图片,所以获得一张图片的方法就是:$('xx')[0].files[0]
⑤扩展:
$('xx')[0].files[0].size可获得文件的大小,单位是字节(B),使用$('xx')[0].files[0].size可用于判断文件的大小。
最后:第②点可能描述不准,若发现错误欢迎指正,大家共同进步。


在刚接触 JQuery 中的 ajax 时,对其 contentType 并没有很在意,只是知晓它是代表发送信息至服务器时内容编码类型,通俗点说就是告诉服务器从浏览器提交过来的数据格式。

默认值为contentType = "application/x-www-form-urlencoded".在默认情况下,内容编码类型满足大多数情况。
在这里,我们主要谈谈contentType = false.
在使用ajax上传文件时:

    var formData = new FormData();
    formData.append('headPic', $("#upfile")[0].files[0]);
             $.ajax({
                    url: '/web/headPic',
                    type: 'post',
                    dataType: 'json',
                    cache: false,
                    data:formData,
                    processData: false,
                    contentType: false,
                })
                .done(function(data) {    //上传成功
                    if(data.status == true){
                        console.log("success"); 
                    }else{
                        console.log(data.errMsg);
                    }
                })
                .fail(function() {
                    console.log("GG,failed");
                })
                .always(function() {
                    console.log("complete");
                });
         

在其中先封装了一个 formData 对象,然后使用 post 方法将文件传给服务器。

这里我们就要先说说在 http 中传输文件的问题。起初,http 协议中没有上传文件方面的功能,直到 rfc1867 为 http 协议添加了这个功能。当然在 rfc1867 中限定 form 的 method 必须为 POST ,enctype = “multipart/form-data” 以及<input type = "file">.

当我们使用表单上传文件时,我们来查看他的Request headers:

发现在 multipart/form-data 后面有boundary以及一串字符,这是分界符,后面的一堆字符串是随机生成的,目的是防止上传文件中出现分界符导致服务器无法正确识别文件起始位置。说到这肯定就要说说这分界符有啥作用呢?

因为对于上传文件,我们没有在使用原有的 http 协议,所以 multipart/form-data 请求是基于 http 原有的请求方式 post 而来的.那么来说说这个全新的请求方式与 post 的区别

  1. 请求头的不同,对于上传文件的请求,contentType = multipart/form-data是必须的,而 post 则不是,毕竟 post 又不是只上传文件~。

  2. 请求体不同。这里的不同也就是指前者在发送的每个字段内容之间必须要使用分界符来隔开,比如文件的内容和文本的内容就需要分隔开,不然服务器就没有办法正常的解析文件,而后者 post 当然就没有分界符直接以 name = "value"的形似发送。

说到这,我们发现在 JQuery ajax() 方法中我们使contentType = false,这不是冲突了吗?这当然没有,因为当我们查看这时的 Request headers,会发现还是有分界符。这就是因为当我们在 form 标签中设置了enctype = “multipart/form-data”,这样请求中的 contentType 就会默认为 multipart/form-data 。而我们在 ajax 中 contentType 设置为 false 是为了避免 JQuery 对其操作,从而失去分界符,而使服务器不能正常解析文件。

说真的,起初我只是想查查为啥使用 ajax 上传文件时要将 contentType = false,结果莫名其妙了解到了 http 协议的一些知识~~有意思>_<


processData: false,  // 告诉jQuery不要去处理发送的数据
contentType: false,   // 告诉jQuery不要去设置Content-Type请求头





jQuery对象与dom对象的转换


$("#msg").html();
$("#msg")[0].innerHTML;
$("#msg").eq(0)[0].innerHTML;
$("#msg").get(0).innerHTML;
$("#msg")[0],$("div").eq(1)[0],$("div").get()[1],$("td")[5]
$(document.getElementById("msg"))


2018//












  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值