日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JS组件系列——封装自己的JS组件,你也可以

發(fā)布時間:2025/4/16 javascript 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JS组件系列——封装自己的JS组件,你也可以 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言:之前分享了那么多bootstrap組件的使用經(jīng)驗,這篇博主打算研究下JS組件的擴展和封裝,我們來感受下JQuery為我們提供$.Extend的神奇,看看我們怎么自定義自己的組件,比如我們想擴展一個$("#id").MyJsControl({})做我們自己的組件,我們該如何去做呢,別急,我們慢慢來看看過程。

一、擴展已經(jīng)存在的組件

1、需求背景

很多時候,我們使用jquery.ajax的方式向后臺發(fā)送請求,型如

      $.ajax({type: "post",url: "/User/Edit",data: { data: JSON.stringify(postdata) },success: function (data, status) {if (status == "success") {toastr.success('提交數(shù)據(jù)成功');$("#tb_aaa").bootstrapTable('refresh');}},error: function (e) {},complete: function () {}});

這種代碼太常見了,這個時候我們有這樣一個需求:在自己調(diào)用ajax請求的時候,我們不想每次都寫error:function(e){}這種代碼,但是我們又想讓它每次都將ajax的錯誤信息輸出到瀏覽器讓用戶能夠看到。怎么辦呢?

2、實現(xiàn)原理

要想實現(xiàn)以上效果其實并不難,我們可以將$.ajax({})封裝一層,在封裝的公共方法里面定義error對應的事件即可。確實,這樣能達到我們的要求,但是并不完美,原因很簡單:1)在jquery的基礎上面再封裝一層,效率不夠高;2)需要改變調(diào)用者的習慣,每次調(diào)用ajax的時候需要按照我們定義的方法的規(guī)則來寫,而不能直接用原生的$.ajax({})這種寫法,這是我們不太想看到。

既然如此,那我們?nèi)绾巫龅郊炔环庋b控件,又能達到以上要求呢?答案就是通過我們的$.extend去擴展原生的jquery.ajax

其實實現(xiàn)起來也并不難,通過以下一段代碼就能達到我們的要求。

(function ($) {//1.得到$.ajax的對象var _ajax = $.ajax;$.ajax = function (options) {//2.每次調(diào)用發(fā)送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.如果在調(diào)用的時候?qū)懥薳rror的處理方法,就不用默認的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方法,返回最新的參數(shù)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.將最新的參數(shù)傳回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);

結(jié)果:

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);

結(jié)果:

settings == { validate: true, limit: 5, name: "bar" } empty == { validate: true, limit: 5, name: "bar" }

以上的兩個簡單例子就說明extend()方法作用就是合并另個對象,有相同的則覆蓋,沒有相同的則添加。就是這么簡單。

了解了$.extend()的作用,我們就能大概看懂上面那個擴展jquery.ajax的實現(xiàn)了吧。主要的步驟分為:

1)定義默認的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) { }}

2)判斷用戶在調(diào)用$.ajax({})的時候是否自定了error:function(){},如果定義過,則使用用戶定義的,反之則用默認的error處理方法。

3)使用$.extend()將error默認處理方法傳入$.ajax()的參數(shù)中。我們看options參數(shù)時包含$.ajax()方法里面所有的參數(shù)的,然后用默認的fn去擴展它即可。

通過以上三步就能夠?qū)崿F(xiàn)對$.ajax()方法里面error默認處理方法。這樣擴展,對于我們使用者來說完全感覺不到變化,我們?nèi)匀豢梢?.ajax({});這樣去發(fā)送ajax請求,如果沒有特殊情況,不用寫error處理方法。

3、組件擴展的意義

使用組件擴展,能夠幫助我們在原有組件上面增加一些和我們系統(tǒng)業(yè)務相關的處理需求,而在使用時,還是和使用原生組件一樣去調(diào)用,免去了在組件上面再封裝一層的臃腫。

二、擴展自己組件

上面通過$.extend()方法擴展了$.ajax()的error事件處理方法。下面我們來封裝一個自己的組件試試,功能很簡單,但比較有說明性。我們就以select這個組件為例,很多情況下,我們的select里面的option都是需要從數(shù)據(jù)庫里面取數(shù)據(jù)的,所以一般的做法就是發(fā)送一個ajax請求,然后在success方法里面拼html。現(xiàn)在我們就封裝一個select遠程取數(shù)據(jù)的方法。

1、代碼實現(xiàn)以及使用示例

先上干貨吧,將寫好的整出來:

(function ($) {//1.定義jquery的擴展方法combobox$.fn.combobox = function (options, param) {if (typeof options == 'string') {return $.fn.combobox.methods[options](this, param);}//2.將調(diào)用時候傳過來的參數(shù)和default參數(shù)合并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.判斷用戶傳過來的參數(shù)列表里面是否包含數(shù)據(jù)data數(shù)據(jù)集,如果包含,不用發(fā)ajax從后臺取,否則否送ajax從后臺取數(shù)據(jù)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.如果傳過來的是字符串,代表調(diào)用方法。$.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.默認參數(shù)列表$.fn.combobox.defaults = {url: null,param: null,data: null,valueField: 'value',textField: 'text',placeholder: '請選擇',onBeforeLoad: function (param) { },onLoadSuccess: function () { },onChange: function (value) { }}; })(jQuery);

先來看看我們自定義組件如何使用:

用法一:通過URL遠程取數(shù)據(jù)并初始化

首先定義一個空的select?

<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'}); })

參數(shù)很簡單,就不一一介紹了。很簡單有木有~~

用法二:取值和設置

var strSelectedValue = $('#sel_search_plant').combobox("getValue"); $('#sel_search_plant').combobox("setValue", "aaa");

其實對于簡單的select標簽,博主覺得這里的getValu和SetValue意義不大,因為直接通過$('#sel_search_plant').val()就能解決的事,何必要再封一層。這里僅僅是做演示,試想,如果是封裝成類似select2或者multiselect這種組件,getValue和setValue的意義就有了,你覺得呢?

2、代碼詳細講解

上面的實現(xiàn)代碼,如果您一眼就能看懂,證明您是經(jīng)常封組件的大蝦了,下面的就不用看了。如果看不懂,也沒關系,我們將代碼拆開詳細看看里面是什么鬼。

(1)首先看看我們最常看到的如下寫法:

(function ($) {//....封裝組件邏輯 })(jQuery);

初初看到這種用法,博主也是狂抓,這是什么鬼嘛,四不像啊。使用多了之后才知道原來這就是一個匿名函數(shù)的形式。將它拆開來看如下:

var fn = function($){//.....組件封裝邏輯 }; fn(jQuery);

也就是說這種寫法就表示先定義一個方法,然后立即調(diào)用這個方法,jQuery相當于實參。打開jquery.js的原文件可以看到,jQuery是這個文件里面的一個全局變量。

(2)定義自己的組件的代碼:

$.fn.combobox = function (options, param) {};

習慣這種寫法的應該知道,這個就表示向jquery對象添加自定義方法,比如你想使用文章開始的?$("#id").MyJsControl({})?這種用法,你就可以這樣定義?$.fn.MyJsControl=function(options){}?。

(3)?options = $.extend({}, $.fn.combobox.defaults, options || {});?這一句,看過上文的朋友應該還記得extend這么一個方法吧,怎么樣,又來了你。這句話其實就沒什么好說的了,合并默認參數(shù)和用戶傳進來的參數(shù)。

(4)默認參數(shù)列表

$.fn.combobox.defaults = {url: null,param: null,data: null,valueField: 'value',textField: 'text',placeholder: '請選擇',onBeforeLoad: function (param) { },onLoadSuccess: function () { },onChange: function (value) { }};

如果用戶沒有傳參,就用默認的參數(shù)列表。如果你夠細心,你會發(fā)現(xiàn)博主之前分享的其他bootstrap組件的js文件里面都有這么一個default參數(shù)列表。我們隨便找兩個:

bootstrap上傳組件

bootstrap table組件

基本都是這么些用法。這樣來看,是否也可以自己封一個js組件~~

三、總結(jié)

以上就是博主對js組件擴展以及封裝用法的認識和總結(jié)。當然,都是些比較簡單基礎的封裝,如果想要實現(xiàn)類似bootstrap table的組件,那還差得很遠。不過萬丈高樓平地起,只要打好基礎,封一個自己的table組件也不是什么大問題。文中如果有理解不對的地方,歡迎指出,博主將不勝感激。如果本文能夠?qū)δ阌薪z毫幫助,麻煩抬起你的小手點個推薦,博主一定繼續(xù)努力,將更好的文章分享給大家。

?







本文轉(zhuǎn)自懶得安分博客園博客,原文鏈接:http://www.cnblogs.com/landeanfen/p/5124542.html,如需轉(zhuǎn)載請自行聯(lián)系原作者

總結(jié)

以上是生活随笔為你收集整理的JS组件系列——封装自己的JS组件,你也可以的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 韩国一区二区三区四区 | 综合久久久久久久 | 少妇av一区二区三区无码 | 日韩精品视频一区二区在线观看 | 成人免费区一区二区三区 | 97干干干| 国产做爰xxxⅹ高潮视频12p | 欧美一级高潮片 | 奇米影视第四色888 免费观看a毛片 | 久久九九视频 | 美女张开双腿让男人捅 | 嫩草网站在线观看 | 男女做的视频 | 亚洲乱码一区二区 | 欧美久久久久久久久久 | 国产成人av一区二区三区不卡 | 日韩欧美成人网 | 久久99精品久久久水蜜桃 | 成人羞羞在线观看网站 | 人妻体内射精一区二区 | 亚洲综合丁香 | 国产淫 | 美女黄色在线观看 | 久久精品国产亚洲AV成人婷婷 | 国产精品视频一区二区在线观看 | 秋霞精品一区二区三区 | 日韩精品一区二区三区网站 | 国产女上位 | 久久不射电影网 | 伦一理一级一a一片 | www午夜| 狠狠操夜夜操 | 真人毛片97级无遮挡精品 | 欧美在线一区二区三区四区 | 女优视频在线观看 | 精品无码一区二区三区的天堂 | 国产精品视频在线观看免费 | 最近中文字幕在线mv视频在线 | 欧美日a | 九一福利视频 | 久久毛片网站 | 免费成人美女在线观看 | 国产91网址 | 精品色| 亚洲天堂视频在线观看 | 99久久亚洲精品日本无码 | 嫩草天堂 | 日本黄色性视频 | 丝袜ol美脚秘书在线播放 | 久久92| 亚洲小说专区 | 日韩成人av免费在线观看 | 无码人妻久久一区二区三区不卡 | 欧美性天天影院 | 麻豆成人久久精品一区二区三区 | 日韩三区在线观看 | 久久中文字幕在线观看 | 欧美精品一区二区三区久久久竹菊 | 国产无套丰满白嫩对白 | 波多野一区二区 | 操极品少妇 | 精国产品一区二区三区a片 国产精品第一 | 免费看黄色片视频 | 国产精品99久久久久久人 | 中文字幕第 | 韩国一区二区三区视频 | 国色天香一区二区 | 免费黄色小说视频 | 91精品国产乱码在线观看 | 欧美三级免费看 | 国产男女猛烈无遮挡免费观看网站 | 亚洲福利专区 | 日韩九九九 | 免费av日韩 | av在线手机观看 | 91在线观看视频网站 | 中文字幕高清在线免费播放 | 国产露脸国语对白在线 | 潘金莲三级野外 | 永久免费观看av | 杨贵妃颤抖双乳呻吟求欢小说 | 超碰97在线资源 | 能看的黄色网址 | 麻豆精品在线观看 | 日韩一区二区三区不卡 | a网址 | 怡红院成永久免费人全部视频 | 久草久热| 亚洲精品小说 | 蜜臀免费av | 少妇aaaaa| 2019天天操 | 黑人操日本女人 | 黄色一级影片 | 亚洲最大av | 男人插女人网站 | 成人在线一区二区 | av电影一区二区 | 人妻精品久久久久中文字幕69 |