擴充套件jQuery easyui tabs元件,實現根據id(或者自定義屬性)操作tab標籤
阿新 • • 發佈:2019-01-03
easyui是一個輕量級的後臺管理系統框架,各種元件均有,使用簡單方便,現在已經有免費版的License了。
但是它也有一些蛋疼的地方,比如tabs元件,該元件預設只能根據tab的title或者index進行相應的操作,有的時候這將令人非常的蛋疼,例如左側導航選單不同選單下面可能存在名稱相同的子選單。
那麼,我們能不能讓它根據id或者其他的自定義的屬性進行選擇呢?答案是肯定的!
雖說easyui的免費版的程式碼是混淆過的,但是隻要我們肯用心看,一切都是浮雲。
下面的程式碼給出了擴充套件或者重寫tabs元件方法示例(使用時將下面的程式碼放在進行easyui tabs操作之前即可,基於1.4版本):
(function(){//擴充套件easyui中tabs的部分方法,實現根據唯一標識id的進行相應操作;技巧:使用一個自執行的函式,激發作用域,避免這裡定義的變數與系統全域性變數衝突 var _methods = $.fn.tabs.methods; var _exists = _methods.exists;//儲存原方法 var _getTab = _methods.getTab;<span style="font-family: Arial, Helvetica, sans-serif;">//儲存原方法</span> $.extend($.fn.tabs.methods, { getTab : function(jq, which) {//重寫getTab方法,增加根據id獲取tab(注意:這裡我們可以定義任意的獲取方式,不必一定使用id) if(!which) return null; var tabs = jq.data('tabs').tabs; for (var i = 0; i < tabs.length; i++) { var tab = tabs[i]; if (tab.panel("options").id==which) { return tab; } } return _getTab(jq, which);//如果根據id無法獲取,則通過easyui預設的getTab進行獲取 }, exists : function(jq, which) {//重寫exists方法,增加id判斷 return this.getTab(jq,which)!=null;//呼叫重寫後的getTab方法 }, }); })()
重寫之後,我們就可以實現根據唯一id操作tab,而不必考慮為每個tab取一個不同的title
另外,easyui中tabs標籤的關閉程式碼,我個人認為邏輯不夠嚴謹(純粹是個人看法),原始碼以及改進如下:
function _334(_335,_336){ var opts=$.data(_335,"tabs").options; var tabs=$.data(_335,"tabs").tabs; var _337=$.data(_335,"tabs").selectHis; if(!_338(_335,_336)){ return; } var tab=_339(_335,_336); var _33a=tab.panel("options").title; var _33b=_333(_335,tab); if(opts.onBeforeClose.call(_335,_33a,_33b)==false){ return; } var tab=_339(_335,_336,true); tab.panel("options").tab.remove(); tab.panel("destroy"); opts.onClose.call(_335,_33a,_33b); _307(_335); _337.splice(_33b,1);//TODO 我新增的程式碼: 刪除被關閉的tab所對應的index處的title元素(陣列中元素位置是嚴格按照tab開啟的順序存放),效率高於迴圈遍歷。 /*for(var i=0;i<_337.length;i++){//此處是註釋掉的程式碼為原始碼:移除所有title==被關閉的tab的title if(_337[i]==_33a){ _337.splice(i,1); i--; } }*/ var _33c=_337.pop(); if(_33c){ _32a(_335,_33c); }else{ if(tabs.length){ _32a(_335,0); } } };