jquery ajax 源码分析

  1. jQuery1.5开始,AJAX模块新增了三个方法。 jQuery. ajaxPrefilter, jQuery. ajaxTransport,ajaxConvert。

  2. ajax内部的处理可分为基于XMLHttpRequest的ajax请求和基于script的jsonp跨域请求。

AJAX模块的整体架构如下:

jQuery.extend({

    // Counter for holding the number of active queries
    active: 0,

    // Last-Modified header cache for next request
    lastModified: {},
    etag: {},

    ajaxSettings: {
        url: ajaxLocation,
        type: "GET",
            ...
    },

    ajaxSetup: function( target, settings ) { ...},

    ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
    ajaxTransport: addToPrefiltersOrTransports( transports ),

    // Main method
    ajax: function( url, options ) {
                ...
        return jqXHR;
    },

    getJSON: function( url, data, callback ) {
        return jQuery.get( url, data, callback, "json" );
    },

    getScript: function( url, callback ) {
        return jQuery.get( url, undefined, callback, "script" );
    }
});
jQuery.each( [ "get", "post" ], function( i, method ) {
    jQuery[ method ] = function( url, data, callback, type ) {
        return jQuery.ajax({
            ...
        });
    };
});

ajaxPrefilter:在每个请求被发送和$.ajax()处理前,设置自定义Ajax选项或修改现有选项。
ajaxTransport:创建一个对象,用于处理Ajax数据的实际传输。它提供了两种方法,send 和 abort。

  • dataType为"script"的ajaxPrefilter例子:
// Handle cache's special case and crossDomain
jQuery.ajaxPrefilter( "script", function( s ) {
    if ( s.cache === undefined ) {
        s.cache = false;
    }
    if ( s.crossDomain ) {
        s.type = "GET";
    }
});
  • dataType为"script"的ajaxTransport例子:
// Bind script tag hack transport
jQuery.ajaxTransport( "script", function( s ) {
    // This transport only deals with cross domain requests
    if ( s.crossDomain ) {
        var script, callback;
        return {
            send: function( _, complete ) {
                script = jQuery("
                    
                    

你可能感兴趣的:(jquery ajax 源码分析)