bootstrap選項卡擴展,增加關閉,超出一行顯示下拉

来源:http://www.cnblogs.com/luhuimingblogs/archive/2017/06/14/7009497.html
-Advertisement-
Play Games

最近用了下bootstrap,雖然好看,但是控制項跟之前用的easyui相差很大,功能太少,不得不自己寫。 花了幾個小時把tabs控制項擴展了下。下麵是代碼 頁面代碼: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta http-equiv="Content-Typ ...


最近用了下bootstrap,雖然好看,但是控制項跟之前用的easyui相差很大,功能太少,不得不自己寫。

花了幾個小時把tabs控制項擴展了下。下麵是代碼

頁面代碼:

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 5     <title></title>
 6     <link href="Content/bootstrap.css" rel="stylesheet" />
 7     <script src="Scripts/jquery-1.10.2.js"></script>
 8     <script src="Scripts/bootstrap.js"></script>
 9     <script src="Scripts/lwFW.js"></script>
10     <style type="text/css">
11         .pagetabs{height:41px;}
12         .nav-tabs > li{padding: 0 1px;}
13         .nav-tabs > li > a{color: #555;padding:8px 25px 8px 15px;border-top:4px solid transparent;background-color:#eee;border:1px solid #ddd;border-bottom-color:transparent;}
14         .nav-tabs > li > a > .close{display:inline-block;float:inherit;position: absolute;top: 1px;font-size: 18px;font-weight: inherit;right: 5px;}
15         .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus{border-top: 4px solid #ffa405;}
16         .nav-tabs > li > a:hover{background-color:#e3e3e3;border:1px solid #ddd;border-bottom-color:transparent;}
17         .pagetabs .dropdown-toggle,.pagetabs .dropdown-toggle:hover{border:none;background-color:transparent;padding:8px;}
18         .pagetabs .open > .dropdown-toggle, .pagetabs .open > .dropdown-toggle:hover, .pagetabs .open > .dropdown-toggle:focus{background-color:transparent;}
19     </style>
20 </head>
21 <body>
22     <div id="tabtest" style="width:600px;"></div>
23 
24 </body>
25 </html>
26 <script>
27     $(function () {
28         var toolbar = $('<div class="btn-group"></div>');
29         $("#tabtest").before(toolbar);
30         Tabs.init({ selector: $("#tabtest"), close: true });
31         for (var i = 1; i <= 40; i++) {
32             (function (i) {
33                 toolbar.append($('<button type="button" class="btn btn-default">' + i + '</button>').click(function () {
34                     Tabs.addtab({ title: "測試" + i, bindcode: i, content: i + " " + lwFW.dateHelper.toString(new Date(), "yyyy-MM-dd HH:mm:ss") });
35                     //Tabs.addtab({ title: "測試" + i, bindcode: i, url: "http://www.baidu.com" });
36                 }));
37             })(i);
38         };
39     });
40 </script>
View Code

控制項代碼:

  1 //選項卡
  2 var Tabs = (function ($) {
  3     var options = {
  4         selector: undefined,//
  5         close: false,//是否可以關閉標簽
  6         //contextmenu: false,//右鍵菜單
  7         closeCallback: function () { }
  8     };
  9     var _newtab;
 10     var _tabcontent;
 11     var _drop;
 12 
 13     var tab = function () {
 14         this.options = {
 15             title: "",
 16             bindcode: undefined,
 17             url: undefined,
 18             close: false
 19         };
 20         var isfull = false;
 21         this.init = function (setting) {
 22             $.extend(this.options, setting);
 23         };
 24         this.addtab = function (setting) {
 25             $.extend(this.options, setting);
 26             var li, litop, hasdata;
 27             if (!_drop) {
 28                 _drop = new droplist();
 29             };
 30             hasdata = ishas(this.options);
 31             if (!hasdata.has) {
 32                 li = $('<li><a href="#page' + this.options.bindcode + '" data-toggle="tab">' + this.options.title + '<span class="close">×</span></a></li>');
 33                 li.data("data", $.extend(true, {}, this.options));
 34             } else {
 35                 li = hasdata.selector.off("click");
 36             };
 37             li.prependTo(options.selector);
 38             li.find("span.close").show().on("click", function () {
 39                 closetab(this);
 40             });
 41             options.selector.children("li").not(li).removeClass("active");
 42             li.addClass("active");
 43             litop = _drop.options.selector.position().top, paneltop = options.selector.position().top;
 44             if (litop > paneltop) { //超出檢測
 45                 _drop.addDropItem();
 46             };
 47         };
 48 
 49         function closetab(target) {
 50             var pager = $(target).parent().attr("href");
 51             $(target).closest("li").remove();
 52             options.selector.next().find(pager).remove();
 53             if (options.selector.find("li.active").length <= 0) {
 54                 options.selector.find("li>a:first").tab("show");
 55             };
 56 
 57             var li = _drop.options.ulpanel.children("li:first");
 58             if (li.length <= 0) return;
 59             li.find("span.close").show();
 60             _drop.options.selector.before(li);
 61             if (_drop.options.selector.position().top > options.selector.position().top) {
 62                 li.find("span.close").hide();
 63                 _drop.options.ulpanel.append(li);
 64                 return;
 65             };
 66             li.off("click");
 67             if (_drop.options.ulpanel.children("li").length <= 0) {
 68                 _drop.options.selector.css({ "visibility": "hidden" });
 69             };
 70         };
 71 
 72         function ishas(setting) {//檢測選項卡是否存在
 73             var lis = options.selector.find("li"), lidata, hasdata;
 74             hasdata = { selector: undefined, has: false };
 75             $.each(lis, function () {
 76                 lidata = $(this).data("data");
 77                 if (!lidata) return true;
 78                 if (lidata.title === setting.title && lidata.bindcode === setting.bindcode && lidata.url === setting.url) {
 79                     hasdata = { selector: $(this), has: true };
 80                     return false;
 81                 };
 82             });
 83             return hasdata;
 84         };
 85     };
 86 
 87     var tabcontent = function () {
 88         this.options = {
 89             selector:undefined
 90         };
 91         var option = {
 92             bindcode: undefined,
 93             url: undefined,
 94             content:undefined
 95         };
 96 
 97         this.init = function () {
 98             var content = $('<div class="tab-content"></div>');
 99             this.options.selector = content;
100             options.selector.after(this.options.selector);
101         };
102         this.addContent = function (setting) {
103             var page,iframe;
104             $.extend(option, setting);
105             hasdata = ishas(option);
106             if (!hasdata.has) {
107                 page = $('<div id="page' + option.bindcode + '" class="tab-pane"></div>').data("data", $.extend(true, {}, option));
108                 if (!option.url) {
109                     page.html(option.content);
110                 } else {
111                     iframe = $('<iframe src="' + option.url + '" onload="lwFW.windowHelper.autoiframe(this)" scrolling="no"></iframe>');
112                     page.append(iframe);
113                 };
114                 page.appendTo(this.options.selector);
115             } else {
116                 page = hasdata.selector;
117             };
118             this.options.selector.children("div").not(page).removeClass("active");
119             page.addClass("active");
120         };
121 
122         function ishas(setting) {//檢測選項卡是否存在
123             var divs = _tabcontent.options.selector.children("div"), divdata, hasdata;
124             hasdata = { selector: undefined, has: false };
125             $.each(divs, function () {
126                 divdata = $(this).data("data");
127                 if (!divdata) return true;
128                 if (divdata.bindcode === setting.bindcode) {
129                     hasdata = { selector: $(this), has: true };
130                     return false;
131                 };
132             });
133             return hasdata;
134         };
135     };
136 
137     var droplist = function () {
138         this.options = {
139             selector: undefined,
140             ulpanel: undefined
141         };
142 
143         this.init = function (panel) {
144             var li = $('<li class="dropdown pull-right"><a class="dropdown-toggle" data-toggle="dropdown" href="#"><b class="caret"></b></a><ul class="dropdown-menu"></ul></li>');
145             this.options.selector = li.css({ "visibility": "hidden" });
146             this.options.ulpanel = li.children("ul");
147             this.options.selector.appendTo(panel);
148         };
149 
150         this.addDropItem = function () {
151             additem(this.options.selector, this.options.ulpanel);
152         };
153 
154         function additem(li, ul) {
155             var item = options.selector.children("li").not(li).last();
156             li.css({ "visibility": "visible" });
157             if (item.length <= 0) return;
158             item.find("span.close").hide();
159             ul.append(item);
160             item.one("click", function () {
161                 itemtarget(this, li, ul);
162             });
163         };
164 
165         function itemtarget(target, selector, ulpanel) {
166             var item = options.selector.children("li").not(selector).last();
167             $(target).find("span.close").show();
168             $(target).prependTo(options.selector);
169             if (item.length <= 0) return;
170             if (selector.position().top > options.selector.position().top) {
171                 item.find("span.close").hide();
172                 ulpanel.append(item);
173             };
174             item.one("click", function () {
175                 itemtarget(this, selector, ulpanel);
176             });
177         };
178     };
179 
180     function init(setting) {
181         $.extend(options, setting);
182         if (!options.selector) {
183             return;
184         };
185         if (options.selector[0].tagName.toLowerCase() != "ul") {
186             var selector = $('<ul class="nav nav-tabs pagetabs"></ul>').appendTo(options.selector);
187             options.selector = selector;
188         };
189         if (!_drop) {
190             _drop = new droplist();
191         };
192         _drop.init(options.selector);
193 
194         if (!_tabcontent) {
195             _tabcontent = new tabcontent();
196         };
197         _tabcontent.init();
198         if (!_newtab) {
199             _newtab = new tab();
200         };
201     };
202 
203     function addtab(setting) {
204         if (!_newtab) {
205             _newtab = new tab();
206         };
207         _newtab.addtab(setting);
208         if (!_tabcontent) {
209             _tabcontent = new tabcontent();
210         };
211         _tabcontent.addContent(setting);
212         options.selector.find('li>a').filter('[href=#page' + setting.bindcode + ']').tab("show");
213     };
214 
215     return {
216         init: function (setting) {
217             init(setting);
218         }, addtab: function (setting) {
219             addtab(setting);
220         }
221     };
222 })(jQuery);
View Code 效果如下:  
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • [1]crypto [2]MD5 [3]Hmac [4]AES [5]Diffie-Hellman ...
  • 轉自:http://www.cnblogs.com/guohu/archive/2013/05/22/3092383.html /* * 預設轉換實現函數,如果需要其他功能,需自行擴展* 參數:* tableID : HTML中Table對象id屬性值* 詳細用法參見以下 TableToExcel ...
  • function getUrlParameter(strParame){ var args = new Object( ); var query = location.search.substring(1); var pairs = query.split("&"); for(var i = 0; ... ...
  • 什麼是 WebView 是手機中內置了一款高性能 內核瀏覽器,在 中封裝的一個組件。沒有提供地址欄和導航欄, 只是單純的展示一個網頁界面。在開發中經常都會用到。 ps: 關於 WebView 的介紹,可以看這裡 "《談談 WebView 的使用》" 雖說 WebView 是安卓開發中設計的東西,但是 ...
  • 官網:http://select2.github.io/examples.html 相容性: 引入文件 html js 附: select2 單選取值賦值 html: js: select2 多選取值賦值 html: js: ...
  • //如果不加border:0;的話,雖然顏色改變了,但是會顯示一條黑色的邊框。 //如果不加height:1px;的話,在firefox下會不顯示。 ...
  • SignalR 是微軟支持的一個運行在 Dot NET 平臺上的 html websocket 框架。(自動判別通訊機制) ...
  • 項目背景是外包類建站公司里,設計環節沉澱了大量可復用組件,設計師往往只需要微調組件就拼湊出頁面,交付給前端,理論上這些組件在前端也可以復用,但實際上前端每次都要重新實現整個頁面,浪費很多人力。 這個項目的思路是,將所有組件開發出來,統一錄入到一個平臺上管理,設計師可以到平臺上挑選組件,並實時預覽和調... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...