是否可以将多个事件处理程序绑定到JqGrid事件而不覆盖以前的事件?

例如,我在每个页面加载时调用我的默认设置,并将一个函数绑定到loadComplete,以便为我的网格执行一些基本格式化。

在某些页面上,我有其他想要同时执行的逻辑,但是如果我在网格定义中设置了loadComplete,它将覆盖我默认设置中的函数。

有没有办法绑定多个处理程序,或其他一些执行所有必要代码的方法? 提前致谢。

我想你问一下当前版本的jqGrid中存在的一个重要问题。 现在很难在jqGrid中实现更多的事件处理程序 。 对于使用jqGrid的小项目,这个问题并不重要,但是如果你想构造一些解释jqGrid的类,这个问题很重要。 您当前的解决方法是可以的,但有您自己理解的限制。 主要问题是,您只能再实现一个额外的loadCompleteEx处理程序。

我建议你使用jQuery.trigger或更好的jQuery.triggerHandler 。 您可以将它与jQuery.bind和jQuery.unbind一起使用。 在这种方式中,您可以定义任意数量的事件处理程序,其工作方式与标准jQuery事件类似。

例如,

 var grid = $("#list"); grid.bind('jqGridLoadComplete',function(e,data) { alert ("in first jqGridLoadComplete event handler. Called for the page " + data.page); }); grid.jqGrid({ // jqGrid parameters // ... loadComplete: function(data) { alert("main load complete"); $(this).triggerHandler("jqGridLoadComplete", data); } }); grid.bind('jqGridLoadComplete.jqGrid',function(e,data) { alert ("in second jqGridLoadComplete event handler. Called for the page " + data.page); }); 

在第二个jQuery.bind我使用命名空间’jqGrid’中的命名空间事件’jqGridLoadComplete.jqGrid’。 因此,您可以使用您知道的(以及您需要的)关于jQuery中标准事件的所有内容。

请在此处查看相应的演示。 尝试切换网格中的页面或更改排序以调用loadComplete

我在jqGrid定义之后绑定第二个jqGridLoadComplete 。 因为我的演示使用datatype:'local'所以loadComplete的第一次调用将绑定执行之前 。 所以在第一次loadComplete执行时将是第二个未调用的jqGridLoadComplete事件处理程序。 所以你最好在jqGrid定义之前绑定你的事件处理程序。 在这种情况下,您可以确保始终调用该事件。

更新: 重要!!! 。 如果使用当前版本的jqGrid,则不需要loadComplete 显式触发jqGridLoadComplete事件 。 jqGrid 已经为你做了这个 。 上面的代码是相应的function包含在jqGrid的主代码之前编写的。 答案刚刚描述了如何在jqGrid中实现多个事件处理程序的主要思想。 在写完答案后,我发布了一些拉取请求到trirand,我的建议是在jqGrid中实现jQuery事件。 从版本4.3.2开始(参见此处 )jqGrid支持事件。

如果你想在请求之前做一些事情,请使用beforeRequest函数。

您还可以将函数绑定到gridComplete选项。 你能给出一个代码示例来展示你想要做什么吗?

我的解决方案:

 // Global Variable in my common.js var loadCompleteEx; // set defaults $.extend($.jgrid.defaults, { datatype: 'json', height: "100%", ... loadComplete: function () { if ($("#grid").getGridParam("reccount") === 0) $("#empty-grid-message").show(); else $("#empty-grid-message").hide(); // if loadCompleteEx is defined, call it at the end of loadComplete if (loadCompleteEx) loadCompleteEx(); } } // In my specific page js loadCompleteEx = function () { // Do more stuff after load completes }; 

像魅力一样……这里有什么不好的做法吗?

有一个比我在其他地方推荐的更容易的解决方案:

 // Set defaults jQuery.extend(jQuery.jgrid.defaults, { loadComplete: function () { myCustomFunction(); } }); loadComplete: function() { // someOtherFunction(); $.jgrid.defaults.loadComplete(); // Runs myCustomFunction() },