[英]Can I change the double click event handler (ondblClickRow) for a jQuery jqGrid plug-in after it has been rendered in ASP.NET MVC?
我一直在成功使用jqGrid; 但是,我遇到了我似乎無法工作的問題。 我通過AJAX將網格定義作為PartialViewResult
返回,並將結果附加到div。
然后,我想更改所述網格的雙擊事件。 我正在使用Firebug,似乎可以使用$('#my-grid')[0]
來訪問grid元素,但是當我嘗試像下面這樣調用方法時,它告訴我jqGrid是“未定義”。
我很確定我已經正確引用了jqGrid東西,否則我不會走得太遠(我已經在網格中顯示和編輯數據了)。 這是獲取並嘗試修改網格定義的代碼:
$(document).ready(function() {
//Add the grid by pulling it via AJAX
$.get('<%=Url.Action("Grid","Entity", new {id = "CustomerAccount"}) %>', function(htmlResult) {
//Append grid definition to div
$('#customer-list').append(htmlResult);
var myGrid = $($('#CustomerAccount-grid')[0]);
$(myGrid).jqGrid('setGridParam', { ondblClickRow: function(rowid, iRow, iCol, e) { console.log('dblclicked'); } })
.trigger('reloadGrid');
//NOTE: I've tried with and without the reloadGrid
}
更新:我想我現在已經得出結論,我確定我將元素引用為jQuery對象存在計時問題。 下面簡化的網格定義加載說明了此問題:
//Append grid definition to div
$('#customer-list').load('<%=Url.Action("Grid","Entity", new {id = "CustomerAccount"}) %>',function() {
console.log('sortname=' + $($('#CustomerAccount-grid:first')).jqGrid('getGridParam', 'sortname'));
});
這將記錄sortname = undefined; 但是,如果我將同一行復制並粘貼到Firebug中,則會顯示sortname = Name,這是正確的。
最終更新:我的問題很大一部分可能是因為我沒有將元素作為jQuery對象獲取,所以我將解決方案歸功於drachenstern(謝謝!),但是,一旦超過該原因,事件處理程序仍未連接出現問題的原因是因為網格定義是通過AJAX檢索的,當我嘗試綁定ondblclickrow時它不存在。 解決方案很簡單:我只在網格定義調用中添加了async:false,這樣我就知道在綁定事件處理程序等之前,定義將始終存在。 我正在通過AJAX檢索網格定義,因為我是在ASP.NET MVC應用程序的服務器端動態構建網格。 我仍在異步地獲取網格的數據。 現在效果很好。
嘗試以下代碼
$('#my-grid').jqGrid('setGridParam',
{ ondblClickRow: function(){console.log('Hello');} });
可能在很多情況下工作(見這個和這個回答關於同一主題的),但它是不工作。 問題在於,在初始化jqGrid期間將測試是否定義了ondblClickRow
的事件處理程序。 如果未定義(請參見源代碼 ),則不會綁定到雙擊,並且ondblClickRow
的設置以后將ondblClickRow
。
因此,為了能夠設置ondblClickRow
后的jqGrid初始化完成后,你必須綁定dblclick
自己。 您可以使用以下代碼執行此操作:
var grid = $('#customer-list');
grid.dblclick(function(e) {
var td = e.target;
var ptr = $(td,grid[0].rows).closest("tr.jqgrow");
if($(ptr).length === 0 ){return false;}
var ri = ptr[0].rowIndex;
var ci = $.jgrid.getCellIndex(td);
var rowId = $(ptr).attr("id");
alert("in ondblClickRow");
//ts.p.ondblClickRow.call(grid[0],rowId,ri,ci, e);
return false;
});
注釋行ts.p.ondblClickRow.call(grid[0],rowId,ri,ci, e)
顯示我們已經擁有的ondblClickRow
所有輸入參數。
var myGrid = $('#my-grid')[0];
此代碼將myGrid設置為DOM元素。 因此,其他一些DOM元素將是:
<a>, <div>, <input>, <body>, <table>, etc
沒有本機DOM屬性.jqGrid
。 也許您打算做的就是得到第一個孩子,但將其保留在jQuery包裝器中? 有多個選項,具體取決於所需的可讀性。 http://api.jquery.com/first/允許您使用鏈接並看起來更整潔,並且在給定的情況下可能更高效。 還有:
var myGrid = $( $('#my-grid')[0] );
或者:
$(myGrid).jqGrid('setGridParam',{ ondblClickRow: function(){console.log('Hello');}});
當然,您可以引入一個中間元素:
var myGridTemp = $('#my-grid')[0];
var myGrid = $( myGridTemp );
myGrid.jqGrid('setGridParam',{ ondblClickRow: function(){console.log('Hello');}});
但是主要的問題是,示例的第一行僅提供DOM元素,而不提供jQuery元素。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.