簡體   English   中英

在ASP.NET MVC中呈現后,是否可以更改jQuery jqGrid插件的雙擊事件處理程序(ondblClickRow)?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM