`
snake_hand
  • 浏览: 625032 次
社区版块
存档分类
最新评论

jQuery ajax —— 一些细节以及主函数扩展出来的方法

 
阅读更多

上一篇文章,讲解了jQuery.ajax函数。这篇文章将其他一些细节补充完。下一篇文章则开始讲解,jQuery是如何将script动态载入、XMLHttpRequest、JSONP一起包装进jQuery.ajax里的。

 

jQuery.ajaxSetup

我们可以从主函数看出,参数是通过jQuery.ajaxSetup产生的:

// 通过jQuery.ajaxSetup改造参数对象
s = jQuery.ajaxSetup( {}, options ),

那么jQuery.ajaxSetup在干些什么呢?

jQuery.ajaxSetup = function( target, settings ) {
    // 如果有参数
    return settings ?

        // 创建一个设置对象,先将jQuery.ajaxSettings的属性放进去,
        // 然后将参数也放进去
        ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :

        // 并将设置对象的属性放进jQuery.ajaxSettings对象里
        ajaxExtend( jQuery.ajaxSettings, target );
};

 

ajaxExtend

ajaxExtend和jQuery.extend有一些不同,避免有些不需要深复制的属性进行深复制。

function ajaxExtend( target, src ) {
    var key, deep,
        flatOptions = jQuery.ajaxSettings.flatOptions || {};
    
    // 遍历src对象中的所有key
    for ( key in src ) {
        // 如果值不是undefined
        if ( src[ key ] !== undefined ) {
            // 判断是不是不需要深复制的,如果不需要深复制,将属性直接写进target,
            // 否则写进deep里存起来
            // 我们可以从jQuery.ajaxSettings.flatOptions看到,
            // 实际上不需要深复制的是url和context
            ( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
        }
    }
    
    // 如果deep不是undefined,证明需要深复制
    if ( deep ) {
        // 开始深复制
        jQuery.extend( true, target, deep );
    }

    // 返回target
    return target;
}

 

ajaxHandleResponses

主体函数中response是通过ajaxHandleResponses来处理的:

// 得到响应数据
if ( responses ) {
    // 通过ajaxHandleResponses处理数据
    response = ajaxHandleResponses( s, jqXHR, responses );
}

我们来看看该函数干了些什么。

function ajaxHandleResponses( s, jqXHR, responses ) {

    var ct, type, finalDataType, firstDataType,
        contents = s.contents,
        dataTypes = s.dataTypes,
        responseFields = s.responseFields;

    // 将responseXXX填入jqXHR指定位置,也就是responseXML或者responseText
    // 其中jqXHR.xml对应responseXML,jqXHR.text对应responseText
    for ( type in responseFields ) {
        if ( type in responses ) {
            jqXHR[ responseFields[type] ] = responses[ type ];
        }
    }

    // 删除掉通配dataType,得到返回的Content-Type
    while( dataTypes[ 0 ] === "*" ) {
        dataTypes.shift();
        if ( ct === undefined ) {
            ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
        }
    }

    // 看看是不是我们能处理的Content-Type,比如图片这类二进制类型就不好处理了
    if ( ct ) {
        // 实际上能处理的就是text、xml和json
        for ( type in contents ) {
            if ( contents[ type ] && contents[ type ].test( ct ) ) {
                // 如果是这三种类型,则推入dataTypes里
                dataTypes.unshift( type );
                break;
            }
        }
    }

    // 如果dataTypes是我们想要的,也就是text、xml、json
    if ( dataTypes[ 0 ] in responses ) {
        // 则最终dataType就是这个了
        finalDataType = dataTypes[ 0 ];
    // 否则
    } else {
        // 尝试转换成我们要的dataType
        for ( type in responses ) {
            // 如果dataTypes[ 0 ]不存在,则直接用type作为最终dataType
            // 否则,看看能不能转换,能的话就用type作为最终dataType
            if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
                finalDataType = type;
                break;
            }
            // 保存第一个type
            if ( !firstDataType ) {
                firstDataType = type;
            }
        }
        // 用最终dataType或者用第一个type
        finalDataType = finalDataType || firstDataType;
    }

    // 如果有最终dataType
    if ( finalDataType ) {
        // 如果最终dataType不是dataTypes[ 0 ]
        if ( finalDataType !== dataTypes[ 0 ] ) {
            // 将finalDataType推入dataTypes队列里
            dataTypes.unshift( finalDataType );
        }
        // 返回responses对应的finalDataType数据
        return responses[ finalDataType ];
    }
}

 

jQuery.fn.load

实际上有两个jQuery.fn.load,一个是类似于onload的方法,另一个则是载入指定html页面。

前一个是jQuery.fn.on的简单扩展,而后面一个则是使用jQuery.ajax方法的扩展。

jQuery.fn.load = function( url, params, callback ) {
    // 如果url不是string,且_load存在
    // 证明这是onload方法,则调用保存的_load方法
    if ( typeof url !== "string" && _load ) {
        return _load.apply( this, arguments );
    }

    var selector, type, response,
        self = this,
        off = url.indexOf(" ");

    // 看看是不是载入指定元素,比如参数是'ajax/test.html #container'
    if ( off >= 0 ) {
        // 分隔出需要载入的元素
        selector = url.slice( off, url.length );
        // 分隔出真正的url
        url = url.slice( 0, off );
    }

    // 模拟重载
    if ( jQuery.isFunction( params ) ) {

        // 如果是函数那么就当这个是回调函数
        callback = params;
        params = undefined;

    // 如果参数是objects,那么定义type是POST
    } else if ( params && typeof params === "object" ) {
        type = "POST";
    }

    // 如果有需要修改的元素,开始请求
    if ( self.length > 0 ) {
        jQuery.ajax({
            url: url,

            // 如果type为undefined,那么就会缺省为GET方法
            type: type,
            dataType: "html",
            data: params
            // 完成后回调
        }).done(function( responseText ) {

            // 保存reponse
            response = arguments;

            // 对元素写入html
            // 如果selector存在
            self.html( selector ?

                // 先用一个div来存储整个html页面的DOM,在找到selector的相关html
                jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :

                // 否则直接用responseText
                responseText );

            // 如果回调函数存在,则回调
        }).complete( callback && function( jqXHR, status ) {
            self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
        });
    }

    return this;
};

 

jQuery.get & jQuery.post

这两个方法实际上就是通过jQuery.ajax扩展而来的。

// 加上get和post方法
jQuery.each( [ "get", "post" ], function( i, method ) {
    // jQuery.get或jQuery.post为
    jQuery[ method ] = function( url, data, callback, type ) {
        // 模拟重载
        if ( jQuery.isFunction( data ) ) {
            type = type || callback;
            callback = data;
            data = undefined;
        }

        // 利用jQuery.ajax完成任务
        return jQuery.ajax({
            url: url,
            type: method,
            dataType: type,
            data: data,
            success: callback
        });
    };
});

 

jQuery.getScript & jQuery.getJSON

jQuery.getScript和jQuery.getJSON则是由jQuery.get扩展而来的。

jQuery.getScript = function( url, callback ) {
    return jQuery.get( url, undefined, callback, "script" );
};
jQuery.getJSON = function( url, data, callback ) {
    return jQuery.get( url, data, callback, "json" );
}

 

 

2
3
分享到:
评论

相关推荐

    学习jQuery中的Ajax——$.get()方法

    本篇文章将深入探讨jQuery中的Ajax方法之一——`$.get()`,以及如何通过它来实现异步数据交互。`$.get()`是jQuery提供的一个便捷的Ajax函数,用于发起GET类型的HTTP请求。 ### 一、$.get()的基本用法 `$.get()`...

    扩展jquery的ajax方法

    扩展jquery的ajax方法,可以处理一些ajax请求的共通问题,比如ajax请求出错之后跳转的问题。

    jquery插件——多级菜单

    首先,jQuery是一个轻量级的JavaScript库,它简化了DOM操作、事件处理、动画制作以及Ajax交互。jQuery的易用性和丰富的API使其成为许多开发者首选的工具,特别是在构建动态用户界面时。 创建多级菜单的核心在于理解...

    图片文件上传回显jQuery插件——插件四

    总的来说,"图片文件上传回显jQuery插件——插件四"是前端开发中提高用户体验的一个实用工具,它利用jQuery、JavaScript和Ajax技术实现了图片的预览和上传功能。通过研究和使用这个插件,开发者不仅可以快速实现所需...

    jQuery游戏——小鸟飞行

    《jQuery游戏——小鸟飞行》是一款基于JavaScript库jQuery开发的简单互动游戏,旨在通过模拟小鸟飞行的场景,让玩家体验到游戏的乐趣,同时也提供了一个学习jQuery交互效果和动画制作的实践平台。这款游戏通常由HTML...

    asp+jquery ajax实例源码,添加,删除,修改,分页

    jQuery 是一个流行的JavaScript库,它简化了DOM操作、事件处理、动画以及AJAX交互。AJAX(Asynchronous JavaScript and XML)是一种在不重新加载整个网页的情况下,能够更新部分网页的技术。在这个实例源码中,我们...

    Jquery ajax方式读取txt文件、Jquery分页.

    在给定的标题和描述中,主要涉及两个关键知识点:使用jQuery的AJAX方法读取TXT文件和实现jQuery分页功能。接下来,我们将深入探讨这两个主题。 首先,我们来讨论如何使用jQuery的AJAX方法读取TXT文件。AJAX(异步...

    传智播客 jQuery ajax 课件

    《jQuery AJAX 技术详解——基于传智播客课件》 在当今的Web开发中,jQuery AJAX(异步JavaScript和XML)技术扮演着至关重要的角色。它允许开发者在不刷新整个页面的情况下与服务器进行数据交换,提高了用户体验,...

    html静态页JQuery ajax示例demo 源码

    `$.ajax()`是jQuery提供的核心AJAX函数,它允许我们配置各种选项来定制请求,如URL、请求类型(GET或POST)、数据类型(JSON、XML、HTML等)以及请求成功或失败的回调函数。 在C# ASP.NET环境下,我们可以创建一个...

    jQuery Ajax前后端使用JSON进行交互示例

    本篇文章主要介绍了jQuery Ajax前后端使用JSON进行交互示例,实现前端通过jQuery Ajax传输json到后端,后端接收json,对json进行处理,后端返回一个json给前端,有兴趣的可以了解一下。

    jquery——ajax__json,的一些文档,

    以下是一些关于jQuery Ajax和JSON的知识点: 1. **$.ajax()方法**:这个方法接受一个配置对象,其中可以设置请求的类型(GET或POST)、URL、数据、成功和错误回调等参数。例如: ```javascript $.ajax({ type: '...

    jquery 分页——jqueryPage.js

    在 JavaScript 部分,我们通过 `$("#pagination").jqueryPage()` 初始化分页组件,并传递一些关键参数,如总页数、当前页数、每页显示的条数以及点击页码后的回调函数。`clickCallback` 函数会在用户点击分页链接时...

    jquery ajax Datatable与json之间数据转换

    jquery ajax Datatable与json之间数据转换jquery ajax Datatable与json之间数据转换jquery ajax Datatable与json之间数据转换jquery ajax Datatable与json之间数据转换jquery ajax Datatable与json之间数据转换...

    jquery ajax 与后台验证

    下面我们将详细探讨jQuery AJAX以及如何实现无刷验证。 1. **jQuery AJAX 基础**: jQuery 的 AJAX 方法提供了一种简单的方式来创建异步HTTP请求。主要的方法有 `$.ajax()`、`$.get()`、`$.post()` 和 `$.getJSON...

    jQuery插件——imgbox(点击图片查看大图)

    以下将详细介绍 Imgbox 插件的核心功能、使用方法以及相关的 jQuery 知识点。 1. **jQuery 基础** jQuery 是一个快速、简洁的 JavaScript 库,它简化了 HTML 文档遍历、事件处理、动画和Ajax交互。jQuery 的目标是...

    使用jQuery ajax提交表单代码

    本文将深入探讨如何使用jQuery的ajax方法来提交表单,从而实现异步数据交换,提高用户体验。 首先,jQuery的$.ajax()函数是进行Ajax请求的核心,它允许我们与服务器进行异步数据通信。在“使用jQuery ajax提交表单...

    AJAX——新手快车道

    **AJAX——新手快车道** AJAX(Asynchronous JavaScript and XML)是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。它通过在后台与服务器进行少量数据交换,使网页实现异步更新,大大提升了用户...

    jquery ajax 三级联动

    首先,我们需要理解jQuery的核心——它是一个轻量级的JavaScript库,简化了DOM操作、事件处理、动画以及Ajax交互。在三级联动中,jQuery主要负责监听用户的选择事件,并触发Ajax请求。 接下来是AJAX(异步...

    jQuery插件——评分_ui_cookie_放大图

    在IT行业中,jQuery是一个广泛使用的JavaScript库,它极大地简化了DOM操作、事件处理、动画制作以及Ajax交互。这里我们关注的“jQuery插件——评分_ui_cookie_放大图”主题,涵盖了几个关键的知识点,包括jQuery插件...

Global site tag (gtag.js) - Google Analytics