Easyui的Dialog的toolbar的自定義添加
最近一直在寫快速定制Web表格,基于Easyui,整個過程使用了大量的Easyui的dialog,每個dialog的代碼大部分都雷同,感覺代碼出現了很大程度的重復,然后想寫一個通用的dialog設置函數,避免重復,很顯然在寫這個之前,我們應該明確兩點:
- 什么是Easyui
- 了解dialog的大致構造
什么是Easyui
- easyui 是一個基于 jQuery 的框架,集成了各種用戶界面插件。
- easyui 提供建立現代化的具有交互性的 javascript 應用的必要的功能。
- 使用 easyui,您不需要寫太多 javascript 代碼,一般情況下您只需要- 使用一些 html 標記來定義用戶界面。
- HTML 網頁的完整框架。
- easyui 節省了開發產品的時間和規模。
- easyui 非常簡單,但是功能非常強大。
了解dialog的大致構造
這里我們的dialog都是通過javascript創建的,結構大致如下
$('#dialogid').dialog({ title:'title', width:400, height:200, closable:false, toolbar:[{ text:'text', iconCls:'icon-xxx', handler:function(){ ... } },{ ... }], onOpen:function() { ... } });
其中dialog的title,width,height,closable設置都很簡單,難點在于如何動
態生成toolbar,然后我想能不能通過將text,iconCls,handler存入數組
中,生成[{text:'xx',iconCls:'yy',handler:'zz'}]格式。
問題來了,假設可以的話,似乎函數都變成字符串了,如果函數過長怎么辦?
1. 關于函數過長:后來我測試一下發現,handler:function ( ) { } 的 function(){} ,可以寫成自定義函數,也就是可以寫成 handler : xx ( ) ,這樣也是可以的,所以我們只要將相應函數寫好,完全不需要講整個函數放入數組中,所以函數過長這個問題迎刃而解。
2. 關于函數名變成字符串的問題,js存在一個 eval ( ) 函數,可以將計算某個字符串,并執行其中的JS代碼
似乎的兩個問題都解決了,然后我 開始編寫編碼第一次嘗試如下:
/ SetDialog(dialogid,title,width,height,closable,toolbarOrNot,toolbarnames,toolbaricons,toolbarfuncnames,onopen,onclose) 設置對話框,沒有傳值則使用默認值,動態生成toolbar @param: dialogid:對話框id title:標題 width:寬度 height:高度 closable:是否顯示關閉按鈕 toolbarOrNot:是否顯示工具欄 toolbarnames:工具欄函數名稱,預期為數組 toolbaricons:工具欄功能圖標,預期為數組,長度應當與toolbarnames長度一致 toolbarfuncnames:工具欄功能名稱,預期為數組,長度應當與toolbarnames長度一致 onopen:對話框打開的時候調用的函數名稱 onclose:對話框關閉的時候調用的函數名稱 @return: 設置成功返回true 否則返回false/ function SetDialog(dialogid,title,width,height,closable,toolbarOrNot,toolbarnames,toolbaricons,toolbarfuncnames,onopen,onclose) { var dialogele = '#'+dialogid; / toolbar格式:[{text:'text',iconCls:'iconCls',handler:func()},{...},...] / var toolbars_arr = new Array(); console.log("toolbarnames:"+toolbarnames); console.log("toolbaricons:"+toolbaricons); console.log("toolbarfuncnames:"+toolbarfuncnames); if(toolbarOrNot) { var arr_len = toolbarfuncnames.length; console.log('數組長度:'+arr_len); try{ for(var i = 0; i < arr_len; i++) { console.log('第'+i+'次:text:'+toolbarnames[i]+"iconCls:"+toolbaricons[i]+"handler:"+toolbarfuncnames[i]); toolbars_arr.push({text:toolbarnames[i],iconCls:toolbaricons[i],handler:eval(toolbarfuncnames[i])}); } }catch(err){ alert("設置對話框出錯") console.log("SetDialog出錯:"+err); / 這里后期可使用默認值 / return false; } console.log('toolbars_arr:'+toolbars_arr); toolbars_arr = eval(toolbars_arr) $(dialogele).dialog({ title:title, width:width, height:height, closable:closable, toolbar:toolbars_arr, onOpen:eval(onopen) }); testDialog(); return true;
}}</pre>
理想是豐滿的,現實是殘酷的,代碼報錯,錯誤的代碼行: toolbars_arr.push({text:toolbarnames[i],iconCls:toolbaricons[i],handler:eval(toolbarfuncnames[i])});
然后我把 eval ( ) 這個函數移去,代碼沒有報錯了,但是發現了一個奇怪的現象,瀏覽器將我toolbar的所有函數都執行了一遍,怎么修改都不行。用google搜索也沒有查到相關解決辦法。
后來我決定看下dialog的在瀏覽器的頁面結構,打開瀏覽器的調試模式,進行了下面簡單的測試:
其中settings是dialog的id,
</div>
頁面中dialog的位置是這樣的
![]()
似乎發現了什么,多了幾個元素,應該是Easyui渲染之后的結果,將原本的dialog變為三部分,panel-header,dialog-toolbar,以及panelbody
然后我接著嘗試,想看下dialog-toolbar的結構
![]()
![]()
其中最后一行innerHTML的具體代碼如下:
<table cellspacing="0" cellpadding="0"> <tbody> <tr> <td> <a href="javascript:void(0)" class="l-btn l-btn-small l-btn-plain" group="" id=""> <span class="l-btn-left l-btn-icon-left"> <span class="l-btn-text">保存</span> <span class="l-btn-icon icon-save"> </span> </span> </a> </td> <td> <a href="javascript:void(0)" class="l-btn l-btn-small l-btn-plain" group="" id=""> <span class="l-btn-left l-btn-icon-left"> <span class="l-btn-text">取消</span> <span class="l-btn-icon icon-cancel"> </span> </span> </a> </td> <td> <a href="javascript:void(0)" class="l-btn l-btn-small l-btn-plain" group="" id=""> <span class="l-btn-left l-btn-icon-left"> <span class="l-btn-text">表頭</span> <span class="l-btn-icon icon-edit"> </span> </span> </a> </td> </tr> </tbody> </table>有沒有覺得很熟悉,這里就是我們之前設置的toolbar那些按鈕,注意一下,它的 超鏈接中的href點擊事件為javascript:void(0) ,我們之前每個 function 都添加了具體內容,這里點擊事件為什么會為空?我猜想easyui可能對于這些超鏈接的點擊事件有其他的處理,我是無法獲知了,但是我能不能嘗試將它的innerHTML拼接成我們想要的結果呢,將 href="javascript:void(0)" 中的 javacript:void(0) 替換為 func()我們定義的函數 ,將
<span class="l-btn-text">表名</span><span class="l-btn-icon icon-edit"> </span>替換其中的“表名”,‘’ icon-edit “ 為我們需要的函數名和對應的圖標,然后我又重寫了一個函數
/ AddFuncToToolbar(dialogid,toolbarfuncnames) 向toolbar添加自定義函數 @param: dialogid:需要自定toolbar的dialog的id toolbaricons:按鈕圖標 toolbarnames:按鈕名稱 toolbarfuncnames:函數名稱,預期為數組 @return: 成功返回true 否則返回false/ function AddFuncToToolbar(dialogid,toolbaricons,toolbarnames,toolbarfuncnames) { dialogEle = document.getElementById(dialogid); var table_body = ""; var td_body = "";/*
下列拼接字符串的方式 是通過瀏覽器調試獲得的 dialog經過渲染之后,toolbar一欄變為table 整個樣式如下: <table cellspacing="0" cellpadding="0"> <tbody> <tr> <td> <a href="javascript:void(0)" class="l-btn l-btn-small l-btn-plain" group="" id=""> <span class="l-btn-left l-btn-icon-left"> <span class="l-btn-text">保存</span> <span class="l-btn-icon icon-save"> </span> </span> </a> </td> ... </tr> </tbody> </table> */ var table_header =
<table cellspacing="0" cellpadding="0"> <tbody> <tr>
var table_footer =</tr> </table>
var func_nameheader =<td> <a href="javascript:
var func_name;var func_namefooter_tagheader = `
" class="l-btn l-btn-small l-btn-plain" group="" id=""> <span class="l-btn-left l-btn-icon-left"> <span class="l-btn-text"> ` var func_tag;
var func_tagfooter_iconheader = `
</span> <span class="l-btn-icon ` var func_icon;
var func_iconfooter = `
"> </span> </span> </a> </td> ` //字符串拼接順序如下:func_nameheader+func_name + func_namefooter_tagheader + //func_tag + func_tagfooter_iconheader + func_icon +func_iconfooter if(isArray(toolbarfuncnames)) { var arr_len = toolbarfuncnames.length; for(var i = 0; i < arr_len; i++) { func_name = toolbarfuncnames[i]; func_tag = toolbarnames[i]; func_icon = toolbaricons[i]; td_body += func_nameheader+func_name + func_namefooter_tagheader + func_tag + func_tagfooter_iconheader + func_icon +func_iconfooter;
} table_body = table_header + td_body + table_footer; try{ dialogEle.parentNode.childNodes[1].innerHTML = table_body; }catch(err) { console.log("AddFuncToToolbar failed!"); return false; } }else{ console.log('toolbarfuncnames is not an array!'); return false; }
}</pre>
然后保存運行,沒有保存,測試成功了!完整代碼如下:
/ SetDialog(dialogid,title,width,height,closable,toolbarOrNot,toolbarnames,toolbaricons,toolbarfuncnames,onopen,onclose) 設置對話框,沒有傳值則使用默認值,動態生成toolbar @param: dialogid:對話框id title:標題 width:寬度 height:高度 closable:是否顯示關閉按鈕 toolbarOrNot:是否顯示工具欄 toolbarnames:工具欄函數名稱,預期為數組 toolbaricons:工具欄功能圖標,預期為數組,長度應當與toolbarnames長度一致 toolbarfuncnames:工具欄功能名稱,預期為數組,長度應當與toolbarnames長度一致 onopen:對話框打開的時候調用的函數名稱 onclose:對話框關閉的時候調用的函數名稱 @return: 設置成功返回true 否則返回false/ function SetDialog(dialogid,title,width,height,closable,toolbarOrNot,toolbarnames,toolbaricons,toolbarfuncnames,onopen,onclose) { var dialogele = '#'+dialogid; var toolbars_arr = new Array(); if(toolbarOrNot) { toolbars_arr = eval(toolbars_arr) $(dialogele).dialog({ title:title, width:width, height:height, closable:closable, toolbar:[], onOpen:eval(onopen) }); if(AddFuncToToolbar(dialogid,toolbaricons,toolbarnames,toolbarfuncnames)) { return true; }else{ return false; }
}}
/ AddFuncToToolbar(dialogid,toolbarfuncnames) 向toolbar添加自定義函數 @param: dialogid:需要自定toolbar的dialog的id toolbaricons:按鈕圖標 toolbarnames:按鈕名稱 toolbarfuncnames:函數名稱,預期為數組 @return: 成功返回true 否則返回false/ function AddFuncToToolbar(dialogid,toolbaricons,toolbarnames,toolbarfuncnames) { dialogEle = document.getElementById(dialogid); var table_body = ""; var td_body = "";
/*
下列拼接字符串的方式 是通過瀏覽器調試獲得的 dialog經過渲染之后,toolbar一欄變為table 整個樣式如下: <table cellspacing="0" cellpadding="0"> <tbody> <tr> <td> <a href="javascript:void(0)" class="l-btn l-btn-small l-btn-plain" group="" id=""> <span class="l-btn-left l-btn-icon-left"> <span class="l-btn-text">保存</span> <span class="l-btn-icon icon-save"> </span> </span> </a> </td> ... </tr> </tbody> </table> */ var table_header =
<table cellspacing="0" cellpadding="0"> <tbody> <tr>
var table_footer =</tr> </table>
var func_nameheader =<td> <a href="javascript:
var func_name;var func_namefooter_tagheader = `
" class="l-btn l-btn-small l-btn-plain" group="" id=""> <span class="l-btn-left l-btn-icon-left"> <span class="l-btn-text"> ` var func_tag;
var func_tagfooter_iconheader = `
</span> <span class="l-btn-icon ` var func_icon;
var func_iconfooter = `
"> </span> </span> </a> </td> ` //字符串拼接順序如下:func_nameheader+func_name + func_namefooter_tagheader + //func_tag + func_tagfooter_iconheader + func_icon +func_iconfooter if(isArray(toolbarfuncnames)) { var arr_len = toolbarfuncnames.length; for(var i = 0; i < arr_len; i++) { func_name = toolbarfuncnames[i]; func_tag = toolbarnames[i]; func_icon = toolbaricons[i];
td_body += func_nameheader+func_name + func_namefooter_tagheader + func_tag + func_tagfooter_iconheader + func_icon +func_iconfooter; } table_body = table_header + td_body + table_footer; try{ dialogEle.parentNode.childNodes[1].innerHTML = table_body; }catch(err) { console.log("AddFuncToToolbar failed!"); return false; } }else{ console.log('toolbarfuncnames is not an array!'); return false; }
}</pre>
我使用的Easyui版本為 jquery-easyui-1.4.2 ,如果你有更好的建議請告訴我,謝謝!
</div>本文由用戶 chriszh123 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!