1. 程式人生 > >擴充套件jQuery easyui tabs元件,實現根據id(或者自定義屬性)操作tab標籤

擴充套件jQuery easyui tabs元件,實現根據id(或者自定義屬性)操作tab標籤

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