Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否可以将多个事件处理程序绑定到JqGrid事件,而不覆盖以前的事件?_Javascript_Events_Jqgrid_Jquery - Fatal编程技术网

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

Javascript 是否可以将多个事件处理程序绑定到JqGrid事件,而不覆盖以前的事件?,javascript,events,jqgrid,jquery,Javascript,Events,Jqgrid,Jquery,例如,我在每次页面加载时调用默认设置,并将一个函数绑定到loadComplete,以对网格进行一些基本格式化 在某些页面上,我希望同时执行其他逻辑,但如果在网格定义中设置loadComplete,它将覆盖默认设置中的函数集 有没有一种方法可以绑定多个处理程序,或者执行所有必要代码的其他方法?提前感谢。如果您想在请求之前做些什么,请使用beforeRequest功能 还可以将函数绑定到gridComplete选项。您能给出一个代码示例来说明您正在尝试做什么吗?我的黑客破解解决方案: // Glob

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

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


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

如果您想在请求之前做些什么,请使用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
};

工作起来很有魅力……这里有什么不好的做法吗?

我想你应该问一下当前版本的jqGrid中存在的一个重要问题。现在很难在jqGrid中实现更多的as-one。对于使用jqGrid的小项目来说,这个问题并不重要,但在需要构造一些解释jqGrid的类的情况下,这个问题可能很重要。您当前的解决方法是可以的,但有您自己理解的限制。主要问题是,在实现的方式中,只能实现一个更多附加的
loadCompleteEx
处理程序

我建议您使用或更好。您可以将它与和一起使用。通过这种方式,您可以定义任意数量的事件处理程序,它们的工作方式类似于标准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
。因为我的演示使用了
数据类型:'local'
loadComplete
的第一次调用将在绑定执行之前进行。因此,在第一次
loadComplete
执行时,第二次
jqGridLoadComplete
事件处理程序将不会被调用。因此,最好在jqGrid定义之前绑定事件处理程序。在这种情况下,您可以确保始终调用事件


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

有一个比我在其他任何地方看到的建议更简单的解决方案:

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

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

gridComplete只触发一次,如果我在每次加载时都要进行格式化,那就行不通了。例如,如果网格为空,我会显示一条自定义消息。我必须在每次装载时检查一下。现在,如果我想为一个空网格做额外的逻辑,我不能只添加到loadComplete,因为它会覆盖。一个可能更简单的解决方案是使用我的响应和一个函数数组,按顺序执行所有函数吗?我猜使用
bind
函数更为传统/更好。@IronicMuffin:可能有不同的小问题和不同的用法。
bind
方法使用
jQuery.data
events
作为键。该值具有
jqGridLoadComplete
数组形式(请参阅)。如果您自己使用
loadCompleteEx
作为数组,您可以实现当前的解决方法,但您应该小心。在哪里分配阵列?它将与多个网格一起工作,以此类推。我发现“触发器”更灵活。