AJAX

作者: cooore | 来源:发表于2016-07-08 22:23 被阅读0次

    Asynchronous JavaScript and XML
    用js去异步的获取XML作为数据交换的格式

    Ajax通信流程

    • 首先创建一个ajax对象
      初始时:

    调用open()方法:开启一个请求但没有向服务端发起请求

    调用send()方法:正式的向服务器端发起请求

    当服务器端开始返回请求数据的时候,浏览器端接收到这个数据

    浏览器端结束请求的时候:

    Ajax调用示例

    //创建XHR对象
    var xhr = new XMLHttpRequest();
    //处理返回数据
    xhr.onreadystatechange = function (callback){
        if(xhr.readyState == 4){
            if((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){
                callback(xhr.responseText);
            }else{
               alert('Request was unsuccessful: ' + xhr.status);
            }
        }
    }
    //发送请求
    xhr.open('get','example.json',true);
    xhr.setRequestHeader('myHeader','myValue');
    xhr.send(null);
    

    open

    setRequestHeader

    send

    向服务器端发送一个带查询参数的请求,请求参数序列化

    function serialize(data){
        if(!data){return ''};
        var pairs = [];
        for(var name in data) {
            if(!data.hasOwnProperty(name)){continue;}
            if(typeof data[name] === 'function'){continue;}
            var value = data[name].toString();
            name = encodeURIComponent(name);
            value = encodeURIComponent(value);
            pairs.push(name + '=' + value);
        }
        return pairs.join('&');
    }
    

    GET请求

    var url = 'example.json?' + serialize(formdata);
    xhr.open('get',url,true);
    xhr.send(null);
    

    POST请求

    xhr.open('post','example.json',true);
    xhr.send(serialize(formdata));
    

    同源策略

    跨域资源访问

    • 不满足同源策略的资源访问,叫跨域资源访问
    • w3c定义了CORS
    • 现代浏览器已经实现对CORS的支持

    CORS

    Frame代理

    JSONP

    //url    {String}    请求资源的url
    //options    {Object}    请求的查询参数
    //callback    {Function}    请求的回调函数,接收XMLHttpRequest对象的responseText属性作为参数
    function get(url, options, callback){
        var xhr = new XMLHttpRequest();
        xhr.onreadystatechange = function(callback){
            if(xhr.readyState == 4){
                if((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){
                    callback(xhr.responseText);
                }else{
                    alert('Request was unsuccessful: ' + xhr.status);
                }
            }
        }  
        xhr.open('get', url+'?'+serialize(options), true);
        xhr.send(null);
    }
            
           
    function serialize(data){
        if(!data) return '';
        var pairs = [];
        for(var name in data){
            if(!data.hasOwnProperty(name)) continue;
            if(typeof data[name] === 'function') continue;
            var value = data[name].toString();
            name = encodeURIComponent(name);
            value = encodeURIComponent(value);
            pairs.push(name + '=' + value);
        }
        return pairs.join('&');
    }
    
    function post( url, options, callback ){
        var xhr = null;
        if( window.XMLHttpRequest ){
            xhr = new XMLHttpRequest();
        }else{
            //IE6以下
            xhr = new ActiveXObject( 'Microsoft.XMLHTTP' );
        }
        xhr.open( 'post', url, true );
        xhr.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' );
        xhr.send( serialize(options) );
        xhr.onreadystatechange = function () {
            if( xhr.readyState == 4 ){
                if( (xhr.status >= 200 && xhr.status < 300 ) || xhr.status == 304 ){
                    callback( xhr.responseText );
                }else{
                    alert( 'Request was unsuccessful' + xhr.status );
                }
            }
        };
    }
          
    function serialize( data ){
        if( !data ) return '';
        var pairs = [];
        for( var name in data ){
            if( !data.hasOwnProperty(name) ) continue;
            if( typeof data[name] === 'function' ) continue;
            var value = data[name];
            name = encodeURIComponent( name );
            value = encodeURIComponent( value );
            pairs.push( name + '=' + value );
        }
        return pairs.join( '&' );
    }
    

    相关文章

      网友评论

          本文标题:AJAX

          本文链接:https://www.haomeiwen.com/subject/szjrjttx.html