亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

以BootStrap Tab為例寫一個前端組件

2019-11-19 15:59:47
字體:
來源:轉載
供稿:網友

介紹

本文以Bootstrap標簽頁組件為例,介紹如何編寫或者封裝一個前端組件,以下是實現效果:

原生的Bootstrap-tab組件主要有html,css組成,開發者使用時,需要寫很多代碼,不易于使用,對bootstrap-tab封裝后,可以更方便地使用,同時提供關閉、增加tab頁、指定當前選中頁、即使加載等功能,這樣組件可以適配更多的場景。

原生bootstrap-tab組件使用可參考https://www.runoob.com/bootstrap/bootstrap-tab-plugin.html

其中官網一段實例代碼是:

<ul id="myTab" class="nav nav-tabs">  <li class="active"><a href="#home" rel="external nofollow" data-toggle="tab">      菜鳥教程</a>  </li>  <li><a href="#ios" rel="external nofollow" data-toggle="tab">iOS</a></li>  <li class="dropdown">    <a href="#" rel="external nofollow" id="myTabDrop1" class="dropdown-toggle"      data-toggle="dropdown">Java <b class="caret"></b>    </a>    <ul class="dropdown-menu" role="menu" aria-labelledby="myTabDrop1">      <li><a href="#jmeter" rel="external nofollow" tabindex="-1" data-toggle="tab">          jmeter</a>      </li>      <li><a href="#ejb" rel="external nofollow" tabindex="-1" data-toggle="tab">          ejb</a>      </li>    </ul>  </li></ul><div id="myTabContent" class="tab-content">  <div class="tab-pane fade in active" id="home">    <p>菜鳥教程是一個提供最新的web技術站點,本站免費提供了建站相關的技術文檔,幫助廣大web技術愛好者快速入門并建立自己的網站。菜鳥先飛早入行――學的不僅是技術,更是夢想。</p>  </div>  <div class="tab-pane fade" id="ios">    <p>iOS 是一個由蘋果公司開發和發布的手機操作系統。最初是于 2007 年首次發布 iPhone、iPod Touch 和 Apple      TV。iOS 派生自 OS X,它們共享 Darwin 基礎。OS X 操作系統是用在蘋果電腦上,iOS 是蘋果的移動版本。</p>  </div>  <div class="tab-pane fade" id="jmeter">    <p>jMeter 是一款開源的測試軟件。它是 100% 純 Java 應用程序,用于負載和性能測試。</p>  </div>  <div class="tab-pane fade" id="ejb">    <p>Enterprise Java Beans(EJB)是一個創建高度可擴展性和強大企業級應用程序的開發架構,部署在兼容應用程序服務器(比如 JBOSS、Web Logic 等)的 J2EE 上。    </p>  </div></div><script>  $(function () {    $('#myTab li:eq(1) a').tab('show');  });</script>

那么如何封裝或者開發一個組件呢?

組件開發步驟

Step1:結構化靜態代碼,梳理核心的問題

在組件開發流程中,可能拿到前端設計的靜態代碼(html+css的組合),這時候要拆解代碼結構,使得結構能夠模板化。其次梳理核心問題,bootstrap-tab組件化之后,應該能夠動態加載tab內容,這個可以通過jquery.load方法解決,這樣可以做到主頁面和子頁面解耦。

讀懂了靜態代碼,理解了結構和核心問題就可以寫代碼了,首先搭建組件的架子。

Step2:組件骨架

/** * Bootstrap tab組件封裝 * @author billjiang qq:475572229 * @created 2017/7/24 * */(function ($, window, document, undefined) {  'use strict';  var pluginName = 'tabs';  //入口方法  $.fn[pluginName] = function (options) {    var self = $(this);    if (this == null)      return null;    var data = this.data(pluginName);    if (!data) {      data = new BaseTab(this, options);      self.data(pluginName, data);    }    return data;  };  var BaseTab = function (element, options) {    this.$element = $(element);    this.options = $.extend(true, {}, this.default, options);    this.init();  }  //默認配置  BaseTab.prototype.default = {  }  //結構模板  BaseTab.prototype.template = {  }  //初始化  BaseTab.prototype.init = function () {  } })(jQuery, window, document)

搭建了以上組件的骨架,并對組件命名為tabs,這樣就可以通過$("#tab-container").data("tabs")獲取組價的方法和屬性。在入口方法中,會將初始化后的對象緩存到頁面html中,這樣可以避免重復創建對象。一些經典的開源前端組件都是這樣寫法,比如Bootstrap-treeview,大家有時間可以看看它的源碼。

以上的寫法使用原型鏈的寫法。定義了默認配置,結構模板,初始化入口。

編寫代碼

在組件的代碼骨架里,填充模板代碼,這里使用占位符{0},{1}等表示外部傳入的變量,然后在init方法中校驗外部傳入數據的合法性,然后構建組件,并且綁定關閉事件、點擊事件。

在開發前端組件的時候,往往不知道默認參數應該有什么,可以在開發的時候,用到就加上去,這里加了兩個默認參數,一個showIndex是默認顯示的tab頁索引,一個loadAlltab是否一次性把所有的頁面數據加載完。

具體的邏輯請看下面的代碼: 

//默認配置  BaseTab.prototype.default = {    showIndex: 0, //默認顯示頁索引    loadAll: true,//true=一次全部加在頁面,false=只加在showIndex指定的頁面,其他點擊時加載,提高響應速度  }  //結構模板  BaseTab.prototype.template = {    ul_nav: '<ul class="nav nav-tabs"></ul>',    ul_li: '<li><a href="#{0}" rel="external nofollow" data-toggle="tab"><span>{1}</span></a></li>',    ul_li_close: '<i class="fa fa-remove closeable" title="關閉"></i>',    div_content: '<div class="tab-content"></div>',    div_content_panel: '<div class="tab-pane fade" id="{0}"></div>'  }  //初始化  BaseTab.prototype.init = function () {    if (!this.options.data || this.options.data.length == 0) {      console.error("請指定tab頁數據");      return;    }    //當前顯示的顯示的頁面是否超出索引    if (this.options.showIndex < 0 || this.options.showIndex > this.options.data.length - 1) {      console.error("showIndex超出了范圍");      //指定為默認值      this.options.showIndex = this.default.showIndex;    }    //清除原來的tab頁    this.$element.html("");    this.builder(this.options.data);  }  //使用模板搭建頁面結構  BaseTab.prototype.builder = function (data) {    var ul_nav = $(this.template.ul_nav);    var div_content = $(this.template.div_content);    for (var i = 0; i < data.length; i++) {      //nav-tab      var ul_li = $(this.template.ul_li.format(data[i].id, data[i].text));      //如果可關閉,插入關閉圖標,并綁定關閉事件      if (data[i].closeable) {        var ul_li_close = $(this.template.ul_li_close);        ul_li.find("a").append(ul_li_close);        ul_li.find("a").append(" ");      }      ul_nav.append(ul_li);      //div-content      var div_content_panel = $(this.template.div_content_panel.format(data[i].id));      div_content.append(div_content_panel);    }    this.$element.append(ul_nav);    this.$element.append(div_content);    this.loadData();    this.$element.find(".nav-tabs li:eq(" + this.options.showIndex + ") a").tab("show");  }  BaseTab.prototype.loadData = function () {    var self = this;    //tab點擊即加載事件    //設置一個值,記錄每個tab頁是否加載過    this.stateObj = {};    var data = this.options.data;    //如果是當前頁或者配置了一次性全部加載,否則點擊tab頁時加載    for (var i = 0; i < data.length; i++) {      if (this.options.loadAll || this.options.showIndex == i) {        if (data[i].url) {          $("#" + data[i].id).load(data[i].url);          this.stateObj[data[i].id] = true;        } else {          console.error("id=" + data[i].id + "的tab頁未指定url");          this.stateObj[data[i].id] = false;        }      } else {        this.stateObj[data[i].id] = false;        (function (id, url) {          self.$element.find(".nav-tabs a[href='#" + id + "']").on('show.bs.tab', function () {            if (!self.stateObj[id]) {              $("#" + id).load(url);              self.stateObj[id] = true;            }          });        }(data[i].id, data[i].url))      }    }    //關閉tab事件    this.$element.find(".nav-tabs li a i.closeable").each(function (index, item) {      $(item).click(function () {        var href = $(this).parents("a").attr("href").substr(1);        $(this).parents("li").remove();        $("#" + href).parent().remove();      })    });  }

測試

編寫一個前端界面,測試組件

<!DOCTYPE html><html lang="en"><head>  <meta charset="UTF-8">  <title>Tab組件</title></head><link rel="stylesheet" href="bootstrap/css/bootstrap.min.css" rel="external nofollow" ><link rel="stylesheet" href="font-awesome/css/font-awesome.min.css" rel="external nofollow" ><link rel="stylesheet" href="../css/bootstrap-tab.css" rel="external nofollow" ><body><div id="tabContainer"></div></body><script src="jquery/jquery-1.8.3.min.js"></script><script src="bootstrap/js/bootstrap.min.js"></script><script src="../js/bootstrap-tab.js"></script><script>  $("#tabContainer").tabs({    data: [{      id: 'home',      text: '百度一下',      url: "tab_first.html",      closeable:true    }, {      id: 'admineap',      text: 'AdminEAP',      url: "tab_second.html"    }, {      id: 'edit',      text: '編輯人員',      url: "tab_content.html",      closeable:true    }],    showIndex:1,    loadAll:false  })</script></html>

通過配置各種參數,看看組件是否滿足了預期的要求。

擴展

組件在使用的過程中還會遇到各種問題,或者各種需求,比如新增一個tab頁面,比如獲取當前tab的ID或index,這是可以在代碼中按需擴展。

//新增一個tab頁  BaseTab.prototype.addTab=function (obj) {    //nav-tab    var ul_li = $(this.template.ul_li.format(obj.id, obj.text));    //如果可關閉,插入關閉圖標,并綁定關閉事件    if (obj.closeable) {      var ul_li_close = $(this.template.ul_li_close);      ul_li.find("a").append(ul_li_close);      ul_li.find("a").append(" ");    }    this.$element.find(".nav-tabs").append(ul_li);    //div-content    var div_content_panel = $(this.template.div_content_panel.format(obj.id));    this.$element.find(".tab-content").append(div_content_panel);    $("#" + obj.id).load(obj.url);    this.stateObj[obj.id] = true;    if(obj.closeable){      this.$element.find(".nav-tabs li a[href='#" + obj.id + "'] i.closeable").click(function () {        var href = $(this).parents("a").attr("href").substr(1);        $(this).parents("li").remove();        $("#" + href).parent().remove();      })    }    this.$element.find(".nav-tabs a[href='#" + obj.id + "']").tab("show");  }  //根據id設置活動tab頁  BaseTab.prototype.showTab=function (tabId) {    this.$element.find(".nav-tabs li a[href='#" + tabId + "']").tab("show");  }  //獲取當前活動tab頁的ID  BaseTab.prototype.getCurrentTabId=function () {    var href=this.$element.find(".nav-tabs li.active a").attr("href");    href=href.substring(1);    return href;  }

更完善的bootrap-tab版本已經開源,詳見我的Github地址:

bootstrap-tab:https://github.com/bill1012/bootstrap-tab

總結

以上所述是小編給大家介紹的以BootStrap Tab為例寫一個前端組件,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91久久久久久久久久久| 国产ts人妖一区二区三区| 欧洲精品毛片网站| 欧美视频不卡中文| 中文字幕日韩视频| 久久久久久国产精品三级玉女聊斋| 欧美日韩亚洲视频一区| 日韩国产欧美精品一区二区三区| 国产精品久久久久7777婷婷| 亚洲xxxx18| 精品国产网站地址| 国产美女精品视频免费观看| 69av在线播放| 欧美大肥婆大肥bbbbb| 黄色一区二区在线| 欧美黄色小视频| 日韩精品在线电影| 亚洲小视频在线| 日韩风俗一区 二区| 欧美老女人bb| 欧美日韩成人精品| 伊人久久大香线蕉av一区二区| 精品爽片免费看久久| 欧美成人国产va精品日本一级| 日韩中文字幕欧美| 91免费版网站入口| 日本久久久久久久久| 91美女高潮出水| 日本一区二区在线免费播放| 欧美孕妇毛茸茸xxxx| 最近2019免费中文字幕视频三| 午夜精品一区二区三区在线视频| 精品国产乱码久久久久久天美| 亚洲精品日韩在线| 久热精品视频在线免费观看| 川上优av一区二区线观看| 国内精品久久久久久| 欧美在线视频一二三| 亚洲自拍偷拍色片视频| 伊人久久久久久久久久久| 国产极品精品在线观看| 26uuu国产精品视频| 欧美激情国产精品| 亚洲第一中文字幕在线观看| 亚洲网站在线观看| 91精品免费久久久久久久久| 久久伊人免费视频| 一区二区三区视频免费| 久久久噜噜噜久噜久久| 日韩电影免费在线观看中文字幕| 欧美一区二区三区四区在线| 美女黄色丝袜一区| 操日韩av在线电影| 疯狂欧美牲乱大交777| 欧美视频中文在线看| 国产精品日本精品| 欧美黑人性视频| 欧美影院在线播放| 成人444kkkk在线观看| 欧美老少配视频| 狠狠躁夜夜躁人人爽天天天天97| 亚洲国产精彩中文乱码av在线播放| 久久亚洲国产成人| 久久艳片www.17c.com| 欧美日韩xxx| 久久人91精品久久久久久不卡| 日韩中文字幕不卡视频| 久久精品2019中文字幕| 国产欧美精品日韩| 国产精品久久久久久久天堂| 色综合久久久久久中文网| 国产亚洲精品一区二区| 亚洲欧洲激情在线| 色综合导航网站| 中文字幕在线看视频国产欧美| 国产欧美精品一区二区三区介绍| 亚洲午夜精品久久久久久久久久久久| 日本欧美精品在线| 日韩av在线直播| 精品久久久久久久久久久久| 欧美精品手机在线| 视频在线观看一区二区| 久久精品国产亚洲一区二区| 国产精品av在线播放| 欧美视频免费在线| 亚洲欧美日韩中文视频| 日韩经典第一页| 日韩亚洲精品视频| 欧美与黑人午夜性猛交久久久| 亚洲精品丝袜日韩| 国产在线日韩在线| 久久国产精品久久久久久久久久| 伊是香蕉大人久久| 国产午夜精品免费一区二区三区| 97成人在线视频| 亚洲一区二区三区久久| 欧美激情xxxx| 欧美在线视频一区| 精品福利免费观看| 久久久久久亚洲精品中文字幕| x99av成人免费| 亚洲国产精品电影在线观看| 国产剧情日韩欧美| 一区二区三区久久精品| 成人在线视频网站| 亚洲伊人一本大道中文字幕| 国产精品一二三在线| 555www成人网| 久久免费国产视频| 日韩国产精品一区| 国产欧美日韩精品丝袜高跟鞋| 欧美成人午夜激情视频| 欧美丰满少妇xxxxx| 午夜精品在线视频| 亚洲福利在线播放| 91日韩在线视频| 亚洲激情视频网| 成人激情免费在线| 日韩一二三在线视频播| 国产一区私人高清影院| 久久久伊人日本| 一区二区欧美亚洲| 国产精品久久久久一区二区| 成人a在线观看| 欧美日韩性视频在线| 91av视频在线播放| 国产精品久久久久久久美男| 中文字幕日韩av综合精品| 亚洲欧美日韩爽爽影院| 欧美黑人一区二区三区| 大胆欧美人体视频| 茄子视频成人在线| 国产精品 欧美在线| 秋霞成人午夜鲁丝一区二区三区| 亚洲欧美国产日韩中文字幕| 亚洲第一福利在线观看| 亚洲欧美日韩精品久久亚洲区| 久久中文字幕视频| 久久这里有精品视频| 国产99久久精品一区二区 夜夜躁日日躁| 日韩经典一区二区三区| 欧美亚洲在线观看| 国产精品黄页免费高清在线观看| 亚洲黄色片网站| 亚洲丝袜一区在线| 日韩禁在线播放| 亚洲人成欧美中文字幕| 久久99久国产精品黄毛片入口| 欧美午夜片欧美片在线观看| 欧美电影免费在线观看| 国产精品自拍小视频| 欧美黄色www| 亚洲精品久久久久国产| 97在线精品国自产拍中文| 欧美性xxxx极品高清hd直播| 欧美性极品少妇精品网站| 国产精品免费一区| 亚洲精品电影网在线观看| 亚洲色图欧美制服丝袜另类第一页| 欧美在线一级va免费观看| 在线成人中文字幕| 91色视频在线导航| 韩国美女主播一区| 国产香蕉97碰碰久久人人|