$.ajax({type: "post",url: "/User/Edit",data: { data: JSON.stringify(postdata) },success: function (data, status) {if (status == "success") {toastr.success("提交数据成功");$("#tb_aaa").bootstrapTable("refresh");}},error: function (e) {},complete: function () {}});这种代码太常见了,这个时候我们有这样一个需求:在自己调用ajax请求的时候,我们不想每次都写error:function(e){}这种代码,但是我们又想让它每次都将ajax的错误信息输出到浏览器让用户能够看到。怎么办呢?(function ($) {//1.得到$.ajax的对象var _ajax = $.ajax;$.ajax = function (options) {//2.每次调用发送ajax请求的时候定义默认的error处理方法var fn = {error: function (XMLHttpRequest, textStatus, errorThrown) {toastr.error(XMLHttpRequest.responseText, "错误消息", { closeButton: true, timeOut: 0, positionClass: "toast-top-full-width" });},success: function (data, textStatus) { },beforeSend: function (XHR) { },complete: function (XHR, TS) { }}//3.如果在调用的时候写了error的处理方法,就不用默认的if (options.error) {fn.error = options.error;}if (options.success) {fn.success = options.success;}if (options.beforeSend) {fn.beforeSend = options.beforeSend;}if (options.complete) {fn.complete = options.complete;}//4.扩展原生的$.ajax方法,返回最新的参数var _options = $.extend(options, {error: function (XMLHttpRequest, textStatus, errorThrown) {fn.error(XMLHttpRequest, textStatus, errorThrown);},success: function (data, textStatus) {fn.success(data, textStatus);},beforeSend: function (XHR) {fn.beforeSend(XHR);},complete: function (XHR, TS) {fn.complete(XHR, TS);}});//5.将最新的参数传回ajax对象_ajax(_options);};})(jQuery);如果没接触过jquery里面$.extend这个方法的童鞋可能看不懂以上是什么意思。好,我们首先来看看jquery API对$.extend()方法是作何解释的。
什么意思呢?我们来看官方的两个例子就知道了
栗子一:
var settings = { validate: false, limit: 5, name: "foo" };var options = { validate: true, name: "bar" };$.extend(settings, options);结果:settings == { validate: true, limit: 5, name: "bar" }栗子二:var empty = {};var defaults = { validate: false, limit: 5, name: "foo" };var options = { validate: true, name: "bar" };var settings = $.extend(empty, defaults, options);结果:settings == { validate: true, limit: 5, name: "bar" }empty == { validate: true, limit: 5, name: "bar" }以上的两个简单例子就说明extend()方法作用就是合并另个对象,有相同的则覆盖,没有相同的则添加。就是这么简单。var fn = {error: function (XMLHttpRequest, textStatus, errorThrown) {toastr.error(XMLHttpRequest.responseText, "错误消息", { closeButton: true, timeOut: 0, positionClass: "toast-top-full-width" });},success: function (data, textStatus) { },beforeSend: function (XHR) { },complete: function (XHR, TS) { }}2)判断用户在调用$.ajax({})的时候是否自定了error:function(){},如果定义过,则使用用户定义的,反之则用默认的error处理方法。(function ($) { //1.定义jquery的扩展方法combobox$.fn.combobox = function (options, param) {if (typeof options == "string") {return $.fn.combobox.methods[options](this, param);}//2.将调用时候传过来的参数和default参数合并options = $.extend({}, $.fn.combobox.defaults, options || {});//3.添加默认值var target = $(this);target.attr("valuefield", options.valueField);target.attr("textfield", options.textField);target.empty();var option = $("<option></option>");option.attr("value", "");option.text(options.placeholder);target.append(option);//4.判断用户传过来的参数列表里面是否包含数据data数据集,如果包含,不用发ajax从后台取,否则否送ajax从后台取数据if (options.data) {init(target, options.data);}else {//var param = {};options.onBeforeLoad.call(target, options.param);if (!options.url) return;$.getJSON(options.url, options.param, function (data) {init(target, data);});}function init(target, data) {$.each(data, function (i, item) {var option = $("<option></option>");option.attr("value", item[options.valueField]);option.text(item[options.textField]);target.append(option);});options.onLoadSuccess.call(target);}target.unbind("change");target.on("change", function (e) {if (options.onChange)return options.onChange(target.val());});}//5.如果传过来的是字符串,代表调用方法。$.fn.combobox.methods = {getValue: function (jq) {return jq.val();},setValue: function (jq, param) {jq.val(param);},load: function (jq, url) {$.getJSON(url, function (data) {jq.empty();var option = $("<option></option>");option.attr("value", "");option.text("请选择");jq.append(option);$.each(data, function (i, item) {var option = $("<option></option>");option.attr("value", item[jq.attr("valuefield")]);option.text(item[jq.attr("textfield")]);jq.append(option);});});}};//6.默认参数列表$.fn.combobox.defaults = {url: null,param: null,data: null,valueField: "value",textField: "text",placeholder: "请选择",onBeforeLoad: function (param) { },onLoadSuccess: function () { },onChange: function (value) { }};})(jQuery);先来看看我们自定义组件如何使用:<select id="sel_search_plant" class="form-control"></select>然后初始化它
$(function(){ $("#sel_search_plant").combobox({url: "/apiaction/Plant/Find",valueField: "TM_PLANT_ID",textField: "NAME_C" });})参数很简单,就不一一介绍了。很简单有木有~~var strSelectedValue = $("#sel_search_plant").combobox("getValue");$("#sel_search_plant").combobox("setValue", "aaa");其实对于简单的select标签,博主觉得这里的getValu和SetValue意义不大,因为直接通过$("#sel_search_plant").val()就能解决的事,何必要再封一层。这里仅仅是做演示,试想,如果是封装成类似select2或者multiselect这种组件,getValue和setValue的意义就有了,你觉得呢?
(function ($) { //....封装组件逻辑})(jQuery);初初看到这种用法,博主也是狂抓,这是什么鬼嘛,四不像啊。使用多了之后才知道原来这就是一个匿名函数的形式。将它拆开来看如下:var fn = function($){//.....组件封装逻辑};fn(jQuery);也就是说这种写法就表示先定义一个方法,然后立即调用这个方法,jQuery相当于实参。打开jquery.js的原文件可以看到,jQuery是这个文件里面的一个全局变量。$.fn.combobox = function (options, param) {};习惯这种写法的应该知道,这个就表示向jquery对象添加自定义方法,比如你想使用文章开始的 $("#id").MyJsControl({}) 这种用法,你就可以这样定义 $.fn.MyJsControl=function(options){} 。 $.fn.combobox.defaults = {url: null,param: null,data: null,valueField: "value",textField: "text",placeholder: "请选择",onBeforeLoad: function (param) { },onLoadSuccess: function () { },onChange: function (value) { }};如果用户没有传参,就用默认的参数列表。如果你够细心,你会发现博主之前分享的其他bootstrap组件的js文件里面都有这么一个default参数列表。我们随便找两个:
bootstrap table组件


基本都是这么些用法。这样来看,是否也可以自己封一个js组件~~
以上就是对js组件扩展以及封装用法的认识和总结,希望大家喜欢。