浏览器前端相关—Ajax

js原生写法:javascript

function success(text) {
    var textarea = document.getElementById('test-response-text');
    textarea.value = text;
}

function fail(code) {
    var textarea = document.getElementById('test-response-text');
    textarea.value = 'Error code: ' + code;
}

var request = new XMLHttpRequest(); // 新建XMLHttpRequest对象

request.onreadystatechange = function () { // 状态发生变化时,函数被回调
    if (request.readyState === 4) { // 成功完成
        // 判断响应结果:
        if (request.status === 200) {
            // 成功,经过responseText拿到响应的文本:
            return success(request.responseText);
        } else {
            // 失败,根据响应码判断失败缘由:
            return fail(request.status);
        }
    } else {
        // HTTP请求还在继续...
    }
}

// 发送请求:
request.open('GET', '/api/categories');
request.send();

alert('请求已发送,请等待响应...');

 jquery写法css

  $.ajax({
            type: get/post,
            url: url,
            timeout: 30000,
            data:{ "userID": UserID, "token": Token },
            dataType: "json",
            cache:true,//(当dataType为script时,默认为false),设置为false将不会从浏览器缓存中加载请求信息。
            beforeSend: function (XMLHttpRequest) {
                XMLHttpRequest.setRequestHeader("secret", Secret);
            },
            success: function (dataResult) {
                  successFunc(dataResult.Data);
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                errorFunc();
            }
        });        

  

jquery中的ajax方法参数老是记不住,这里记录一下。html

 

1.url
要求为String类型的参数,(默认为当前页地址)发送请求的地址。html5

2.type
要求为String类型的参数,请求方式(post或get)默认为get。注意其余http请求方法,例如put和delete也可使用,但仅部分浏览器支持。java

3.timeout
要求为Number类型的参数,设置请求超时时间(毫秒)。此设置将覆盖$.ajaxSetup()方法的全局设置。jquery

4.async
要求为Boolean类型的参数,默认设置为true,全部请求均为异步请求。若是须要发送同步请求,请将此选项设置为false。注意,同步请求将锁住浏览器,用户其余操做必须等待请求完成才能够执行。ajax

5.cache
要求为Boolean类型的参数,默认为true(当dataType为script时,默认为false),设置为false将不会从浏览器缓存中加载请求信息。json

6.data
要求为Object或String类型的参数,发送到服务器的数据。若是已经不是字符串,将自动转换为字符串格式。get请求中将附加在url后。防止这种自动转换,能够查看  processData选项。对象必须为key/value格式,例如{foo1:"bar1",foo2:"bar2"}转换为&foo1=bar1&foo2=bar2。若是是数组,JQuery将自动为不一样值对应同一个名称。例如{foo:["bar1","bar2"]}转换为&foo=bar1&foo=bar2。api

7.dataType
要求为String类型的参数,预期服务器返回的数据类型。若是不指定,JQuery将自动根据http包mime信息返回responseXML或responseText,并做为回调函数参数传递。可用的类型以下:
xml:返回XML文档,可用JQuery处理。
html:返回纯文本HTML信息;包含的script标签会在插入DOM时执行。
script:返回纯文本JavaScript代码。不会自动缓存结果。除非设置了cache参数。注意在远程请求时(不在同一个域下),全部post请求都将转为get请求。
json:返回JSON数据。
jsonp:JSONP格式。使用SONP形式调用函数时,例如myurl?callback=?,JQuery将自动替换后一个“?”为正确的函数名,以执行回调函数。
text:返回纯文本字符串。跨域

8.beforeSend
要求为Function类型的参数,发送请求前能够修改XMLHttpRequest对象的函数,例如添加自定义HTTP头。在beforeSend中若是返回false能够取消本次ajax请求。XMLHttpRequest对象是唯一的参数。
            function(XMLHttpRequest){
               this;   //调用本次ajax请求时传递的options参数
            }
9.complete
要求为Function类型的参数,请求完成后调用的回调函数(请求成功或失败时均调用)。参数:XMLHttpRequest对象和一个描述成功请求类型的字符串。
          function(XMLHttpRequest, textStatus){
             this;    //调用本次ajax请求时传递的options参数
          }

10.success:要求为Function类型的参数,请求成功后调用的回调函数,有两个参数。
         (1)由服务器返回,并根据dataType参数进行处理后的数据。
         (2)描述状态的字符串。
         function(data, textStatus){
            //data多是xmlDoc、jsonObj、html、text等等
            this;  //调用本次ajax请求时传递的options参数
         }

11.error:
要求为Function类型的参数,请求失败时被调用的函数。该函数有3个参数,即XMLHttpRequest对象、错误信息、捕获的错误对象(可选)。ajax事件函数以下:
       function(XMLHttpRequest, textStatus, errorThrown){
          //一般状况下textStatus和errorThrown只有其中一个包含信息
          this;   //调用本次ajax请求时传递的options参数
       }

12.contentType
要求为String类型的参数,当发送信息至服务器时,内容编码类型默认为"application/x-www-form-urlencoded"。该默认值适合大多数应用场合。

13.dataFilter
要求为Function类型的参数,给Ajax返回的原始数据进行预处理的函数。提供data和type两个参数。data是Ajax返回的原始数据,type是调用jQuery.ajax时提供的dataType参数。函数返回的值将由jQuery进一步处理。
            function(data, type){
                //返回处理后的数据
                return data;
            }

14.dataFilter
要求为Function类型的参数,给Ajax返回的原始数据进行预处理的函数。提供data和type两个参数。data是Ajax返回的原始数据,type是调用jQuery.ajax时提供的dataType参数。函数返回的值将由jQuery进一步处理。
            function(data, type){
                //返回处理后的数据
                return data;
            }

15.global
要求为Boolean类型的参数,默认为true。表示是否触发全局ajax事件。设置为false将不会触发全局ajax事件,ajaxStart或ajaxStop可用于控制各类ajax事件。

16.ifModified
要求为Boolean类型的参数,默认为false。仅在服务器数据改变时获取新数据。服务器数据改变判断的依据是Last-Modified头信息。默认值是false,即忽略头信息。

17.jsonp
要求为String类型的参数,在一个jsonp请求中重写回调函数的名字。该值用来替代在"callback=?"这种GET或POST请求中URL参数里的"callback"部分,例如{jsonp:'onJsonPLoad'}会致使将"onJsonPLoad=?"传给服务器。

18.username
要求为String类型的参数,用于响应HTTP访问认证请求的用户名。

19.password
要求为String类型的参数,用于响应HTTP访问认证请求的密码。

20.processData
要求为Boolean类型的参数,默认为true。默认状况下,发送的数据将被转换为对象(从技术角度来说并不是字符串)以配合默认内容类型"application/x-www-form-urlencoded"。若是要发送DOM树信息或者其余不但愿转换的信息,请设置为false。

21.scriptCharset
要求为String类型的参数,只有当请求时dataType为"jsonp"或者"script",而且type是GET时才会用于强制修改字符集(charset)。一般在本地和远程的内容编码不一样时使用。

案例代码:

  

跨域安全:

ajax的url都是引用的相对路径;用绝对路径会报错,JavaScript在发送AJAX请求时,URL的域名必须和当前页面彻底一致。

彻底一致的意思是,域名要相同(www.example.comexample.com不一样),协议要相同(httphttps不一样),端口号要相同(默认是:80端口,它和:8080就不一样)。有的浏览器口子松一点,容许端口不一样,大多数浏览器都会严格遵照这个限制。

解决方法:

1经过Flash插件发送HTTP请求,这种方式能够绕过浏览器的安全限制,但必须安装Flash,而且跟Flash交互。不过Flash用起来麻烦,并且如今用得也愈来愈少了

2经过在同源域名下架设一个代理服务器来转发,JavaScript负责把请求发送到代理服务器

3JSONP,它有个限制,只能用GET请求,而且要求返回JavaScript。这种方式跨域其实是利用了浏览器容许跨域引用JavaScript资源;

4须要浏览器支持html5:CORS;

CORS全称Cross-Origin Resource Sharing,是HTML5规范定义的如何跨域访问资源。

假设本域是my.com,外域是sina.com,只要响应头Access-Control-Allow-Originhttp://my.com,或者是*,本次请求就能够成功。

跨域可否成功,取决于对方服务器是否愿意给你设置一个正确的Access-Control-Allow-Origin,决定权始终在对方手中。

上面这种跨域请求,称之为“简单请求”。简单请求包括GET、HEAD和POST(POST的Content-Type类型 仅限application/x-www-form-urlencodedmultipart/form-datatext/plain),而且不能出现任何自定义头(例如,X-Custom: 12345),一般能知足90%的需求。

不管你是否须要用JavaScript经过CORS跨域请求资源,你都要了解CORS的原理。最新的浏览器全面支持HTML5。在引用外域资源时,除了JavaScript和CSS外,都要验证CORS。例如,当你引用了某个第三方CDN上的字体文件时:

/* CSS */ @font-face { font-family: 'FontAwesome'; src: url('http://cdn.com/fonts/fontawesome.ttf') format('truetype'); } 

若是该CDN服务商未正确设置Access-Control-Allow-Origin,那么浏览器没法加载字体资源。

对于PUT、DELETE以及其余类型如application/json的POST请求,在发送AJAX请求以前,浏览器会先发送一个OPTIONS请求(称为preflighted请求)到这个URL上,询问目标服务器是否接受:

OPTIONS /path/to/resource HTTP/1.1 Host: bar.com Origin: http://my.com Access-Control-Request-Method: POST 

服务器必须响应并明确指出容许的Method:

HTTP/1.1 200 OK Access-Control-Allow-Origin: http://my.com Access-Control-Allow-Methods: POST, GET, PUT, OPTIONS Access-Control-Max-Age: 86400 

浏览器确认服务器响应的Access-Control-Allow-Methods头确实包含将要发送的AJAX请求的Method,才会继续发送AJAX,不然,抛出一个错误。

因为以POSTPUT方式传送JSON格式的数据在REST中很常见,因此要跨域正确处理POSTPUT请求,服务器端必须正确响应OPTIONS请求。

相关文章
相关标签/搜索