Javascript 是否可以将多个事件处理程序绑定到JqGrid事件,而不覆盖以前的事件?
例如,我在每次页面加载时调用默认设置,并将一个函数绑定到loadComplete,以对网格进行一些基本格式化 在某些页面上,我希望同时执行其他逻辑,但如果在网格定义中设置loadComplete,它将覆盖默认设置中的函数集Javascript 是否可以将多个事件处理程序绑定到JqGrid事件,而不覆盖以前的事件?,javascript,events,jqgrid,jquery,Javascript,Events,Jqgrid,Jquery,例如,我在每次页面加载时调用默认设置,并将一个函数绑定到loadComplete,以对网格进行一些基本格式化 在某些页面上,我希望同时执行其他逻辑,但如果在网格定义中设置loadComplete,它将覆盖默认设置中的函数集 有没有一种方法可以绑定多个处理程序,或者执行所有必要代码的其他方法?提前感谢。如果您想在请求之前做些什么,请使用beforeRequest功能 还可以将函数绑定到gridComplete选项。您能给出一个代码示例来说明您正在尝试做什么吗?我的黑客破解解决方案: // Glob
有没有一种方法可以绑定多个处理程序,或者执行所有必要代码的其他方法?提前感谢。如果您想在请求之前做些什么,请使用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
作为数组,您可以实现当前的解决方法,但您应该小心。在哪里分配阵列?它将与多个网格一起工作,以此类推。我发现“触发器”更灵活。