Jquery 如何将事件和参数传递给javascript函数?

Jquery 如何将事件和参数传递给javascript函数?,jquery,Jquery,我有以下资料: var oTable = $('#dataTable').dataTable({ iDisplayLength: -1, ... ... $("#dataTable tbody").on("click", "tr", gridClickHandler); function gridClickHandler(oTable) { $(oTable.fnSettings().aoData).each(function () { $(t

我有以下资料:

var oTable = $('#dataTable').dataTable({
    iDisplayLength: -1,
    ...
    ...

$("#dataTable tbody").on("click", "tr", gridClickHandler);

function gridClickHandler(oTable) {
    $(oTable.fnSettings().aoData).each(function () {
        $(this.nTr).removeClass('row_selected');
    });
    $(this).addClass('row_selected');
我被告知$(this)事件将被传递给函数,但我还需要传递其他内容,因为我发现它给出了一个与oTable相关的错误


如何修改对gridClickHandler和gridClickHandler函数的调用,使其传递对oTable的引用,并使$(this)工作。

您可以使用匿名函数:

$("#dataTable tbody").on("click", "tr", function(event) { gridClickHandler(oTable); } );

如果变量
oTable
在外部范围内声明,则
gridClickHandler
函数将有权访问它,因此您不需要手动传递它。事实上,事件处理程序接收事件对象作为第一个参数,因此实际上是在隐藏表引用

例如:

var foo = 123;

var clickHandler = function ( foo ) {    
    // here, foo is not 123, but the event object  
    // the outer variable foo is shadowed by the local variable foo  
};
只需删除第一个参数:

var gridClickHandler = function () {
现在,将从外部范围中检索到可旋转的
oTable

(还要注意,我如何将匿名函数表达式指定给变量,而不是使用函数声明。)

顺便说一句,在函数中,
这个
指的是TR元素。

试试这个:

$("#dataTable tbody").on("click", "tr", gridClickHandler);
gridClickHandler.oTable = oTable;

function gridClickHandler(event) {
    $(oTable.fnSettings().aoData).each(function () {
        $(this.nTr).removeClass('row_selected');
    });
    $(event.target).addClass('row_selected');
}

对不起,我不知道你说的oTable在外部范围内声明是什么意思。oTable在一个.js文件中声明,gridClickHandler在另一个文件中使用函数gridClickHandler(oTable){您能解释一下为什么不使用函数声明吗。谢谢。@Gemma是
oTable
全局变量吗?如果不是,第二个.js文件如何访问它?(一个.js文件的非全局变量不能被其他.js文件访问,除非你显式地将值附加到某些类型的共享对象上。)我不认为它是全局变量,这可能是我的问题。我如何将它变成一个全局变量?oTable是作为函数refreshDone(responseText,entity){}内的一个变量创建的@Gemma您需要使它对另一个.js文件可用。有不同的方法可以做到这一点。一种方法是定义一个全局变量作为您的名称空间(例如
var MYAPP={};
在任何函数之外),然后为其分配属性(例如
MYAPP.oTable=…;
).现在,第二个.js文件可以创建一个局部变量来存储来自您的命名空间的引用(例如,
var-oTable=MYAPP.oTable
)。我推荐一个关于JavaScript命名空间的教程。我尝试了这个方法,但代码内部的gridClickHandler似乎不知道$(这个)您希望$(这个)是什么是吗?我需要它是我单击的行。我以前尝试过它。在gridClickHandler中似乎没有oTable。我在第一个字符串之后添加了一个字符串。试试这个。它会给我SCRIPT5009:“oTable”在gridClickHandler中未定义。