jquery.unobtrusive-ajax.js源码阅读
- /*!
- ** Unobtrusive Ajax support library for jQuery
- ** Copyright (C) Microsoft Corporation. All rights reserved.
- */
- /*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */
- /*global window: false, jQuery: false */
- /*
- data-ajax=true //开启绑定
- data-ajax-mode//更新的形式 BEFORE插入到对象之前 AFTER插入到对象之后 为空就是覆盖
- data-ajax-update//更新的对象
- data-ajax-confirm//设置一个确定取消弹出框的文字,没有则不设置
- data-ajax-loading//显示loading的对象
- data-ajax-loading-duration//持续时间 默认是0
- data-ajax-method//提交方式
- data-ajax-url//提交url
- data-ajax-begin//ajax前触发的函数或者一段程序
- data-ajax-complete//完成后,此时还没有加载返回的数据,请求成功或失败时均调用
- data-ajax-success//成功,加载完成的数据
- data-ajax-failure//失败
- */
- (function ($) {
- var data_click = "unobtrusiveAjaxClick",
- data_validation = "unobtrusiveValidation";
- //第二核心,判断是否函数,不是则构造一个匿名函数
- function getFunction(code, argNames) {
- var fn = window, parts = (code || "").split(".");
- while (fn && parts.length) {
- fn = fn[parts.shift()];
- }//查找函数名有时候是命名空间比如xxx.xxx
- if (typeof (fn) === "function") {
- return fn;
- }
- argNames.push(code);
- //如果不是函数对象则自己构造一个并返回,吊!
- return Function.constructor.apply(null, argNames);
- }
- function isMethodProxySafe(method) {
- return method === "GET" || method === "POST";
- }
- //可以添加各种提交方式,应该是为Web Api做的补充
- function asyncOnBeforeSend(xhr, method) {
- if (!isMethodProxySafe(method)) {
- xhr.setRequestHeader("X-HTTP-Method-Override", method);
- }
- //注:X-HTTP-Method-Override是一个非标准的HTTP报头。
- //这是为不能发送某些HTTP请求类型(如PUT或DELETE)的客户端而设计的
- }
- //完成后的
- function asyncOnSuccess(element, data, contentType) {
- var mode;
- if (contentType.indexOf("application/x-javascript") !== -1) { // jQuery already executes JavaScript for us
- return;
- }
- mode = (element.getAttribute("data-ajax-mode") || "").toUpperCase();
- $(element.getAttribute("data-ajax-update")).each(function (i, update) {
- var top;
- switch (mode) {
- case "BEFORE":
- top = update.firstChild;
- $("<div />").html(data).contents().each(function () {
- update.insertBefore(this, top);
- });
- break;
- case "AFTER":
- $("<div />").html(data).contents().each(function () {
- update.appendChild(this);
- });
- break;
- default:
- $(update).html(data);
- break;
- }
- });
- }
- //主要函数
- //绑定的对象和参数
- function asyncRequest(element, options) {
- var confirm, loading, method, duration;
- confirm = element.getAttribute("data-ajax-confirm");
- if (confirm && !window.confirm(confirm)) {
- return;
- }
- loading = $(element.getAttribute("data-ajax-loading"));//
- duration = element.getAttribute("data-ajax-loading-duration") || 0;//默认是0
- $.extend(options, {
- type: element.getAttribute("data-ajax-method") || undefined,
- url: element.getAttribute("data-ajax-url") || undefined,
- beforeSend: function (xhr) {//ajax前触发,此处的xhr将在下面用apply传递出去
- var result;
- asyncOnBeforeSend(xhr, method);//判断是否添加特种的提交方式
- result = getFunction(element.getAttribute("data-ajax-begin"), ["xhr"]).apply(this, arguments);//argument:替换函数对象的其中一个属性对象,存储参数。这里是将原先的参数传递出去,吊!
- if (result !== false) {
- loading.show(duration);
- }
- return result;
- },
- complete: function () {
- loading.hide(duration);
- getFunction(element.getAttribute("data-ajax-complete"), ["xhr", "status"]).apply(this, arguments);
- },
- success: function (data, status, xhr) {
- asyncOnSuccess(element, data, xhr.getResponseHeader("Content-Type") || "text/html");
- getFunction(element.getAttribute("data-ajax-success"), ["data", "status", "xhr"]).apply(this, arguments);
- },
- error: getFunction(element.getAttribute("data-ajax-failure"), ["xhr", "status", "error"])
- });
- options.data.push({ name: "X-Requested-With", value: "XMLHttpRequest" });
- method = options.type.toUpperCase();//大写
- if (!isMethodProxySafe(method)) {
- options.type = "POST";
- options.data.push({ name: "X-HTTP-Method-Override", value: method });
- }
- //最后都是调用jquery的ajax
- $.ajax(options);
- }
- function validate(form) {
- //可以取消验证
- var validationInfo = $(form).data(data_validation);
- return !validationInfo || !validationInfo.validate || validationInfo.validate();
- }
- $(document).on("click", "a[data-ajax=true]", function (evt) {
- evt.preventDefault();
- asyncRequest(this, {
- url: this.href,
- type: "GET",
- data: []
- });
- });
- $(document).on("click", "form[data-ajax=true] input[type=image]", function (evt) {//这个不常用
- var name = evt.target.name,
- $target = $(evt.target),
- form = $target.parents("form")[0],
- offset = $target.offset();
- $(form).data(data_click, [
- { name: name + ".x", value: Math.round(evt.pageX - offset.left) },
- { name: name + ".y", value: Math.round(evt.pageY - offset.top) }
- ]);
- setTimeout(function () {
- $(form).removeData(data_click);
- }, 0);
- });
- $(document).on("click", "form[data-ajax=true] :submit", function (evt) {
- var name = evt.target.name,
- form = $(evt.target).parents("form")[0];
- $(form).data(data_click, name ? [{ name: name, value: evt.target.value }] : []);
- setTimeout(function () {
- $(form).removeData(data_click);
- }, 0);
- });
- $(document).on("submit", "form[data-ajax=true]", function (evt) {
- var clickInfo = $(this).data(data_click) || [];
- evt.preventDefault();
- if (!validate(this)) {
- return;
- }
- asyncRequest(this, {
- url: this.action,
- type: this.method || "GET",
- data: clickInfo.concat($(this).serializeArray())//写得好,序列化表单并拼接,以后的ajax都可以这样,方便啊
- });
- });
- }(jQuery));
基本上想注释的都注释了一遍,我反正被这180行的代码折服了。很不错!
jquery.unobtrusive-ajax.js源码阅读的更多相关文章
- Three.js源码阅读笔记-5
Core::Ray 该类用来表示空间中的“射线”,主要用来进行碰撞检测. THREE.Ray = function ( origin, direction ) { this.origin = ( or ...
- Dom7.js 源码阅读备份
在Framework7,其特色的HTML框架,可以创建精美的iOS应用; 她有自己的 DOM7- 一个集成了大部分常用DOM操作的高性能库.你不需要学习任何新的东西,因为她的用法和大名鼎鼎的jQue ...
- underscore.js 源码阅读 准备
本次阅读是初次阅读源码,参考了以下几篇文章: https://github.com/hanzichi?language=javascript&page=5&tab=stars http ...
- underscore.js,jquery.js源码阅读
(function() { // Baseline setup // -------------- // Establish the root object, `window` in the brow ...
- 关于jQuery的ajax的源码的dataType解读
$.ajax其实底层还是用的XMLHttpRequest,对于加载数据的格式datatype有:xml.text.html.json.jsonp.script. 其中xml.text不需要处理,直接使 ...
- flipsnap.js 源码阅读备份
这是官网:http://hokaccha.github.io/js-flipsnap/ 1.引入全局命名空间 类似jQuery插件写法 传入window, document,提高内部访问速度: ; ...
- jQuery插件pagination.js源码解读
pagination的github地址:https://github.com/gbirke/jquery_pagination 公司用的是1.2的版本,所以我就读1.2的了. jQuery.fn.pa ...
- underscore.js 源码阅读 一 整体结构
// 整个underscore的实现包在一个立即执行函数中,避免污染全局对象 // 通过call(this)来入全局变量 (function() { // 缓存this var root = this ...
- 【 js 基础 】【 源码学习 】backbone 源码阅读(二)
最近看完了 backbone.js 的源码,这里对于源码的细节就不再赘述了,大家可以 star 我的源码阅读项目(source-code-study)进行参考交流,有详细的源码注释,以及知识总结,同时 ...
随机推荐
- 用C#编写游戏脚本
大学宿舍玩游戏的时候,为了简化重复的键鼠动作,有学习过按键精灵和TC脚本开发工具,并做了一些小脚本,基本达到了当时的需求.不知不觉,已经毕业了3年了,无聊之余又玩起了游戏,对于一些无趣的重复行为,于是 ...
- 关于AIR新浪登录测试
/** *由于在应用申请中,我设置的域名属于新浪云,因此在本地测试的话肯定不能成功的,有个办法就是直接在新浪云那边授权成功后,将token的值直接使用post或者get方法传递过来,直接在本地 *lo ...
- DB2命令大全
1.1查看表空间 db2 list tablespaces show detail 1.2查看数据库的表死锁 方法一: 打开监控 db2 update monitor switches using ...
- Python批量插入SQL Server数据库
因为要做性能测试,需要大量造数据到数据库中,于是用python写了点代码去实现,批量插入,一共四张表 简单粗暴地插入10万条数据 import pymssql import random __auth ...
- robotframework+ride+Selenium2Library+AutoItLibrary配置
最近要安装RFS,虽然网上很多安装说明,但是自己装的时候还是遇到了很多问题. 1. AutoLibrary导入失败:猜测原因是AutoLibrary需要先安装pywin32,而我一开始安装的是pyth ...
- 关于javax.servlet.jsp.JspTagException: Don't know how to iterate over supplied "items" in <forEach>
今天遇到这样一个异常: 严重: Servlet.service() for servlet jsp threw exceptionjavax.servlet.jsp.JspTagException: ...
- NOIP2004 虫食算
描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子:43#9865#045+ 8468#6633= 44445506678其中#号代表 ...
- Sublime Text 2 配置及其使用
如果说Notepad++是一款不错Code神器,那么Sublime Text应当称得上是神器滴哥. Sublime Text最大的优点就是跨平台,Mac和Windows均可完美使用:其次是强大的插件支 ...
- C# 操作XML 如果不存在创建 存在直接追加
#region 写操作日志----------------这种格式 //<Log 操作人="Admin" 操作结果="成功" 结果详情="数据导 ...
- mount挂载
与ln -s 功能类似 # mount --bind /data/public /home/user/public /etc/fstab # <file system> <mount ...