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

时间:2011-07-21 13:19:11

标签: javascript events jqgrid jquery

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

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

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

4 个答案:

答案 0 :(得分:8)

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

我建议您使用jQuery.trigger或更好jQuery.triggerHandler。您可以将其与jQuery.bindjQuery.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中标准事件的所有内容。

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

我在 jqGrid定义之后绑定了第二个jqGridLoadComplete 。由于我的演示使用datatype:'local',因此{/ 1}}的第一次调用将在执行绑定之前 。因此,在第一个loadComplete执行时,将会调用第二个loadComplete事件处理程序。因此,您最好在jqGrid定义之前绑定事件处理程序。如果您确定将始终调用该事件。

更新: 重要!!! 。如果您使用当前版本的jqGrid,则一个不需要在jqGridLoadComplete内明确触发jqGridLoadComplete事件。 jqGrid 已为您执行此操作。上面的代码是之前编写的相应的功能包含在jqGrid的主代码中。答案刚刚描述了主要的想法如何多个事件处理程序可以在jqGrid中实现。在写完答案之后,我发布了一些拉取请求到trirand,我建议在jqGrid中实现jQuery事件。从版本4.3.2开始(参见here)jqGrid支持事件。

答案 1 :(得分:0)

如果你想在请求之前使用beforeRequest函数做某事。

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

答案 2 :(得分:0)

我的解决方案:

// 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
};

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

答案 3 :(得分:0)

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

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

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