jqGrid是一款處理表格展示的jQuery插件,支持分頁、滾動加載、搜索、鎖定、拖動等一系列對錶格的常規操做。如下是最近項目中實踐jqGrid的整理javascript
一、引入到項目中來php
jqGrid的主頁在http://www.trirand.com/blog/ ,上面提供了下載、demo、wiki等文檔,都比較詳盡。特別是http://www.trirand.com/jqgridwiki/doku.php 中值得開發中多多關注。好了,下載後須要在項目的頭文件中引入:css
- <link rel="stylesheet" type="text/css" href="$request.contextPath/script/jqGrid/css/ui.jqgrid.css" />
- <script type="text/javascript" src="$request.contextPath/script/jqGrid/js/jquery.jqGrid.min.js"></script>
- <script type="text/javascript" src="$request.contextPath/script/jqGrid/js/i18n/grid.locale-cn.js"></script>
jqGrid採用了jQueryUI的CSS主題,須要下載相應的主題http://jqueryui.com/themeroller/ 找到相應的主題下載,若是使用了datepicker控件,還須要ui。以下:html
- <link rel="stylesheet" type="text/css" href="$request.contextPath/script/jqGrid/css/jquery-ui-1.8.22.custom.css" media="all"/>
- <script type="text/javascript" src="$request.contextPath/script/ui/jquery-ui-1.8.22.custom.min.js"></script>
- <script type="text/javascript" src="$request.contextPath/script/ui/jquery.ui.datepicker-zh-CN.js"></script>
二、在頁面中使用前端
在頁面中如vm、jsp中使用,須要兩個基本的元素java
- <table id="jqGridId"></table>
- <div id="pager"></div>
而後在js中jquery
- $("#jqGridId").jqGrid({options})
這樣就是一個最基本的設置,重點是在這裏的options上,包括基本參數設定和函數。具體可見官網的文檔:web
寫道
http://www.trirand.com/jqgridwiki/doku.php?id=wiki:options
http://www.trirand.com/jqgridwiki/doku.php?id=wiki:methods
三、參數(options)ajax
參數是指jqGrid對象中設置各類特性的屬性,具體的設置在http://www.trirand.com/jqgridwiki/doku.php?id=wiki:optionsjson
下面一個例子,羅列了經常使用的參數,並對參數進行了說明:
- $("#jqGridId").jqGrid({
- url: s2web.appURL + "jq/queryWare.action",
- datatype:"local",
- mtype: "POST",
- colNames:['編號', '做者', 'ISBN','重量','描述'],
- colModel:[
- {name:'id', index:'id', width:55, align:"center",sortable:false},
- {name:'author', index:'author', width:100, sortable:false},
- {name:'isbn', index:'isbn', width:120,align:"right", sortable:false},
- {name:'weight', index:'weight', width:80,align:"center", sortable:false},
- {name:'wareDesc', index:'wareDesc', width:400, sortable:false}
- ],
- width: 'auto',
- height: 200,
- rowNum: 5,
- rowList:[5, 10,20,30],
- pager: '#pager2',
- viewrecords: true,
-
- sortname: "warename",
- sortorder: "desc",
-
- caption:"商品列表",
- rownumbers: true,
- rownumWidth: 20,
- multiselect: true,
- multiboxonly: true,
- prmNames : {
- page: "wareDetail.page",
- rows: "wareDetail.rows",
- sort: "wareDetail.sidx",
- order: "wareDetail.sord",
- search: "wareDetail.search"
- },
- jsonReader:{
- root: "list",
- page: "page",
- total: "totalPage",
- records: "totalCount",
- repeatitems: false,
- }
- });
-
- $("#jqGridId").jqGrid('navGrid','#pager2'{edit:false,add:false,del:false,search:false});
以上各個參數的含義已經作了說明,具體可見上面文檔的詳細介紹。
prmNames: 這些參數每次會做爲請求參數傳遞給server端,通常維持分頁、排序等信息。可在查詢對象中統一聲明這些屬性,與這裏設置保持一致。如:
- public class JqGridQueryBase implements Serializable {
-
- private static final long serialVersionUID = -2849625318773684220L;
-
-
- private int page;
-
- private int rows;
-
- private String search;
-
- private String sidx;
- private String sord;
-
-
- private int totalCount;
jsonReader: 與prmNames同樣,是與server端Json格式交互的解析方式,root元素是一個json數組,解析colModel中的元素,而其餘則涉及分頁等信息。好比咱們在Action中每次返回的對象爲PageModule,可定義爲:
- public class PageModule<T> extends JqGridQueryBase {
-
- private static final long serialVersionUID = -663611670315885315L;
-
- private List<T> list = new ArrayList<T>();
colModel: colModel對json數組中對象如何解析填充到表格的cell的設定,包括基本的name、index、width、formater等,具體見http://www.trirand.com/jqgridwiki/doku.php?id=wiki:colmodel_options
好比下設置:
- name :爲Grid中的每一個列設置惟一的名稱,這是一個必需選項,其中保留字包括subgrid、cb、rn。
- index :設置排序時所使用的索引名稱,這個index名稱會做爲sidx參數(prmNames中設置的)傳遞到Server。
- label :當jqGrid的colNames選項數組爲空時,爲各列指定題頭。若是colNames和此項都爲空時,則name選項值會成爲題頭。
- width :設置列的寬度,目前只能接受以px爲單位的數值,默認爲150。
- sortable :設置該列是否能夠排序,默認爲true。
- search :設置該列是否能夠被列爲搜索條件,默認爲true。
- resizable :設置列是否能夠變動尺寸,默認爲true。
- hidden :設置此列初始化時是否爲隱藏狀態,默認爲false。
- formatter :預設類型或用來格式化該列的自定義函數名。經常使用預設格式有:integer、date、currency、還支持custom的方式
以上個參數含義來自http://blog.csdn.net/jpr1990/article/details/6891115
好比對價格須要加前綴和分割能夠以下設定:
- {name:'price',index:'price', width:80,align:"right", formatter:'currency', formatoptions:{decimalSeparator:".", thousandsSeparator: ",", decimalPlaces: 2, prefix: "$"}},
支持下拉select的設定:
- {name:'valid',index:'valid', width:100,align:"center", formatter:'select',edittype:'select', editoptions:{value:"0:現貨;1:可配貨;2:無貨"}}
顯示連接:
- {name:'warename', index:'warename', width:300,sortable:false, formatter:'showlink', formatoptions:{baseLinkUrl:'query.action', addParam: '&action=edit'}},
四、經常使用方法(methods)
http://www.trirand.com/jqgridwiki/doku.php?id=wiki:methods
jqGrid支持兩種方式調用函數方法:
- jQuery("#grid_id").jqGridMethod( parameter1,...parameterN );
- jQuery("#grid_id").jqGrid('method', parameter1,...parameterN );
下面是新的API,推薦使用新的調用方法,也支持鏈式調用,如:
- jQuery("#grid_id").jqGrid('setGridParam',{...}).jqGrid('hideCol',"somecol").trigger("reloadGrid");
一、新增{rowid, data, position(first、before、last、after)}
- $("#jqGrid_id").jqGrid("addRowData", "1" ,{'name':'zhangsan', 'age': 20}, "first" );
二、清空grid
- $("#jqGrid_id").jqGrid("clearGridData");
三、返回當前grid序號
- $("#jqGrid_id").jqGrid('getDataIDs');
四、根據rowID獲取當前row的值
- $("#jqGrid_id").jqGrid('getRowData', rowIds[i]);
五、設置某row值
- $("#jqGrid_id").jqGrid('setRowData', rowIds[i], {});
一個例子:須要對grid中的數據進行循環遍歷獲取、設置、更改
- var rowIds = $("#jqGrid_id").jqGrid('getDataIDs');
- if(rowIds){
- for(var i = 0, j = rowIds.length; i < j; i++) {
- var curRowData = $("#jqGrid_id").jqGrid('getRowData', rowIds[i]);
-
- if(curRowData['name1'] == ""){
-
- }
-
- $.extend(curRowData, {"name1":"newValue1"})
- $("#jqGrid_id").jqGrid('setRowData', rowIds[i], curRowData);
- }
- }
六、獲取grid參數.
name表示grid的options:http://www.trirand.com/jqgridwiki/doku.php?id=wiki:options
- $("#jqGrid_id").jqGrid('getGridParam','name');
七、設置grid參數,與上面的方法對應
- $("#jqGrid_id").jqGrid('setGridParam', 'name');
以下常見須要獲取的參數:
- #獲取總記錄數
- $("#jqGrid_id").jqGrid('getGridParam','records');
- #獲取請求參數
- $("#jqGrid_id").jqGrid('getGridParam','postData');
- #獲取選中的row,返回string
- $("#jqGrid_id").jqGrid("getGridParam","selrow");
- #獲取選中的多個row,返回Array
- $("#jqGrid_id").jqGrid("getGridParam","selarrrow");
例子:對當前默認請求添加新的請求參數
- var postData = $("#jqGrid_id").jqGrid('getGridParam','postData'); $.extend(postData , {"name1":"newValue1"}) $("#jqGrid_id").jqGrid("setGridParam", {datatype: "json" }).trigger("reloadGrid", [{page:1}]);
同時,在實際的使用場景中,咱們多是須要選擇經過選擇表單的值再進行查詢:
- $("#queryBtn").bind("click", function() {
- var sdata = {
- "ware.warename" : $("#warenameId").val(),
- "ware.number" : $("#numberId").val(),
- "ware.valid" : $("#validId").val()
- };
- var postData = $("#jqGridId").jqGrid("getGridParam", "postData");
- $.extend(postData, sdata);
- $("#jqGridId").jqGrid("setGridParam", {search: true}).trigger("reloadGrid", [{page:1}]);
- });
八、刪除
- $("#jqGrid_id").jqGrid("delRowData", rowid);
在使用上述API進行批量刪除時,是根據rowid去刪除指定的行,可是在刪除過程當中rowid會致使變化,若是採用下面的方式刪除會致使某些行不能被刪除:
- var gr = $("#jqGrid_id").jqGrid("getGridParam","selarrrow");
- for ( var i = 0, j = gr.length; i < j; i++) {
- $("#jwGrid_id").jqGrid('delRowData', gr[i]);
- }
在網上找到一個解決方案是:
- var gr = $("#jqGrid_id").jqGrid("getGridParam","selarrrow");
- for ( var i = 0, j = gr.length; i < j; i++) {
- $("#jwGrid_id").jqGrid('delRowData', gr[0]);
- }
上述API是前端刪除,對於先後臺交互的刪除的API:
- $("#jqGrid_id").jqGrid("delGridRow", rowid);
下面是一個刪除的例子:
- $("#removeBtn").bind("click", function(){
- var gr = $("#jqGridId").jqGrid('getGridParam','selrow');
- if(gr){
- var rowData = $("#jqGridId").jqGrid("getRowData", gr);
- $("#jqGridId").jqGrid('delGridRow', gr ,{
- top: 100,
- left: 400,
- reloadAfterSubmit:false,
- modal: true,
- url: s2web.appURL + "jq/del.action",
- jqModal: true,
- beforeSubmit: function(postData, formid){
- var editData = {
- "ware.id": rowData.id
- };
- postData = $.extend(postData, editData);
- console.log(postData);
- return[true,"success"];
- },
- afterSubmit: function(xhr, postData){
- console.log(postData);
- if(xhr.responseText == "\"1\""){
-
- return [true,"保存成功",postData.id];
- }
- return [false,"保存失敗",postData.id];
- }
- });
- }else{
- alert("請選擇要刪除的數據");
- }
- });
五、事件(Event)
做爲jqGrid的各類事件屬性,用來監聽相應的事件,如選擇行、完成加載、多選等時候觸發。API參見http://www.trirand.com/jqgridwiki/doku.php?id=wiki:events,這裏還介紹了關聯事件的執行順序:
寫道
Below is the execution order of the events when a ajax request is made
一、beforeRequest
二、loadBeforeSend
三、serializeGridData
四、loadError (if a error from the request occur - the event from steps 5 till 7 do not execute. If there is no error the event 4. does not execute and we continue to with the step 5.)
五、beforeProcessing
六、gridComplete
七、loadComplete
下面的例子是在開發中比較關注的onSelectRow和gridComplete事件,完成以下功能:在選中行時獲取當前行的數據並以某種方式查看數據,在列表加載完時計算列表中各個行的某列的合計值等:
-
- gridComplete: function(){
- var rowIds = $("#wmsjQContentTableId").jqGrid('getDataIDs');
- var totalWeight = 0,totalNumber = 0;
- for(var i = 0, j = rowIds.length; i < j; i++) {
- var curRowData = $("#wmsjQContentTableId").jqGrid('getRowData', rowIds[i]);
- var curChk = $("#"+rowIds[i]+"").find(":checkbox");
- curChk.attr('name', 'wmsCheckboxname');
- curChk.attr('value', curRowData['outStockCode']);
- if(curRowData['weight'] != ""){
- totalWeight += parseFloat(curRowData['weight']);
- }
- if(curRowData['number'] != ""){
- totalNumber += parseFloat(curRowData['number']);
- }
- }
- $("#totalWeighId").val(totalWeight);
- $("#totalPackNumId").val(totalNumber);
- },
-
- onSelectRow: function(ids){
- var rowData = $("#wmsjQContentTableId").jqGrid("getRowData", ids);
- $("#curWeighId").val(rowData['weight']);
- $("#packNumId").val(rowData['number']);
- $("#curWmsOutStockCodeId").val(rowData['outStockCode']);
- }
考慮以下一種場景,在列表的最後一列通常會有要求操做欄,提供刪除、修改等操做,那麼一樣也能夠經過gridComplete事件來實現:
- colNames:['商品編號', '商品名稱', '單價','採購日期','庫存','狀態','操做'],
- 在colModel中有一列空值佔位,注意index不要和json中重複
- {name:'act', index:'act', width:150}
在gridComplete事件中:
- gridComplete: function(){
- var ids = $("#jqGridId").jqGrid('getDataIDs');
- for(var i=0, j=ids.length; i < j; i++){
- var cl = ids[i];
- be = "<input style='height:22px;width:40px;' type='button' value='編輯' onclick=\"$('#jqGridId').editRow('"+cl+"');\" /> ";
-
- se = "<input style='height:22px;width:40px;' type='button' value='保存' onclick=\"customSaveRow('"+cl+"');\" /> ";
- ce = "<input style='height:22px;width:40px;' type='button' value='取消' onclick=\"$('#jqGridId').restoreRow('"+cl+"');\" />";
- $("#jqGridId").jqGrid('setRowData',ids[i], {act: be + se + ce});
- }
- },
六、其餘
凍結行、列
jqGrid有提供對column、header、column with group header的凍結,
須要設置兩處:
- colModel中的frozen:true
- $("#grid").jqGrid('setFrozenColumns');
可是jqGrid對凍結的支持並非那麼強大,只能支持依次從左到右凍結,若是中間設置有一個cell沒有設置,那麼該row之後的cell即便設置了也不起做用
在官方的DOC中列出了使用限制:
寫道
The following limitations tell you when frozen columns can not be set-up
When TreeGrid is enabled
When SubGrid is enabled
When cellEdit is enabled
When inline edit is used - the frozen columns can not be edit.
When sortable columns are enabled - grid parameter sortable is set to true or is function
When scroll is set to true or 1
When Data grouping is enabled
動態改變設置:固然這裏id、name都是依次從左到右的元素
$("#changeBtn").bind("click", function() {
- $("#jqGridId").jqGrid('destroyFrozenColumns')
- .jqGrid('setColProp','id', {frozen:true})
- .jqGrid('setColProp','name', {frozen:true})
- .jqGrid('setFrozenColumns')
- .trigger('reloadGrid', [{current:true}]);
- );
七、參考如下文章
doc:
http://www.trirand.com/jqgridwiki/doku.php?id=wiki:jqgriddocs
options:
http://www.trirand.com/jqgridwiki/doku.php?id=wiki:options
colmodel_options:
http://www.trirand.com/jqgridwiki/doku.php?id=wiki:colmodel_options
方法
http://www.trirand.com/jqgridwiki/doku.php?id=wiki:methods
事件
http://www.trirand.com/jqgridwiki/doku.php?id=wiki:events
其餘
http://blog.csdn.net/gengv/article/category/648499
http://www.trirand.com/jqgridwiki/doku.php
http://trirand.com/blog/jqgrid/jqgrid.html
原文連接:http://mj4d.iteye.com/blog/1628851