• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >jquery > jquery插件unobtrusive实现片段式加载

jquery插件unobtrusive实现片段式加载

作者: 字体:[增加 减小] 来源:互联网

通过本文主要向大家介绍了jquery,unobtrusive,片段式加载等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

废话不多说,首先把源码分享给大家。

//ajax支持库
/*!
** 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//失败,error

*/

(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都可以这样,方便啊
    });
  });
  //扩展
  function bindDataAjax(obj) {
    $(obj).on("click", "a[data-ajax=true]", function (evt) {
      evt.preventDefault();
      asyncRequest(this, {
        url: this.href,
        type: "GET",
        data: []
      });
    });

    $(obj).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);
    });

    $(obj).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);
    });

    $(obj).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都可以



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 基于jQuery对象和DOM对象和字符串之间的转化实例
  • jquery+css实现简单的图片轮播效果
  • 使用jQuery实现鼠标点击左右按钮滑动切换
  • jQuery实现上传图片前预览效果功能
  • jQuery初级教程之网站品牌列表效果
  • 基于jquery实现多选下拉列表
  • jQuery接受后台传递的List的实例详解
  • 详解jquery选择器的原理
  • jQuery上传插件webupload使用方法
  • 关于jquery form表单序列化的注意事项详解

相关文章

  • jQuery中:first选择器用法实例
  • jQuery模仿单选按钮选中效果
  • jquery 追加元素append、prepend、before、after用法与区别分析
  • Tab页界面 用jQuery及Ajax技术实现(php后台)
  • jQuery中outerWidth()方法用法实例
  • jQuery中$this和$(this)的区别介绍(一看就懂)
  • 浅谈 jQuery 事件源码定位问题
  • jQuery 翻页组件yunm.pager.js实现div局部刷新的思路
  • JQuery中Ajax()的data参数类型实例分析
  • jquery实现页面常用的返回顶部效果

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • jQuery .tmpl(), .template()学习资料小结
    • jquery克隆对象
    • JQuery1.6 使用方法三
    • 基于jquery的合并table相同单元格的插件(精简版)
    • jQuery实现行文字链接提示效果的方法
    • jQuery取得设置清空select选择的文本与值
    • jquery实现tr元素的上下移动示例代码
    • jquery.zclip轻量级复制失效问题
    • showModelDialog弹出文件下载窗口的使用示例
    • jQuery实现列表自动滚动循环滚动展示新闻

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有