Easyui的Dialog的toolbar的自定義添加

chriszh123 8年前發布 | 28K 次閱讀 jeasyui jQuery Ajax框架

最近一直在寫快速定制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 = &lt;table cellspacing="0" cellpadding="0"&gt; &lt;tbody&gt; &lt;tr&gt; var table_footer = &lt;/tr&gt; &lt;/table&gt; var func_nameheader = &lt;td&gt; &lt;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 = &lt;table cellspacing="0" cellpadding="0"&gt; &lt;tbody&gt; &lt;tr&gt; var table_footer = &lt;/tr&gt; &lt;/table&gt; var func_nameheader = &lt;td&gt; &lt;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>

來自: http://www.cnblogs.com/leetao94/p/5149325.html

 本文由用戶 chriszh123 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!