47

我有以下脚本不起作用

<script type="text/javascript" >

   function ADS(e){ alert(e); }

   $(document).ready(function(){
          $(document).on("dblclick","#an_tnam tr", ADS('hello'));
          $(document).on("dblclick","#kv_tnam tr", ADS('world'));
          // ....  
 });

</script>

如何将参数传递给事件处理函数 ADS ?

4

6 回答 6

122

您可以将额外数据传递给事件处理函数,并且可以event.data在处理程序中使用。

$(document).on('dblclick', '#an_tnam tr', { extra : 'random string' }, function(event)
{
    var data = event.data;

    // Prints 'random string' to the console
    console.log(data.extra);
}

.trigger()当使用该方法从外部源触发事件时,您还可以向任何您喜欢的事件发送额外数据

$('#an_tnam tr').trigger('click', [{ extra : 'random string' }]);

将数据传递给.trigger()方法的不同之处在于,它.on()期望处理程序接受传入数组长度的额外参数。上面期望处理程序(仅)有一个额外的参数来包含传入的对象。

$('#an_tnam tr').on('click', function(event, obj)
{
   // Prints 'random string' to the console
   console.log(obj.extra);
}
于 2013-04-09T14:17:07.073 回答
54

.on()函数期望传递一个函数引用;你正在做的是调用函数并传递它的返回值。如果需要传递参数,则需要将调用包装在匿名函数中。

$(document).on('dblclick', '#an_tnam tr', function(event) {
    ADS('hello');
});

jQuery 总是将其规范化的事件对象作为第一个参数传递给要执行的函数。

于 2013-04-09T14:12:19.377 回答
6

正如Anthony Grist所指出的,该.on()方法在该部分需要一个函数引用;您正在评估一个不返回任何内容的函数 ( null)。

然而,JavaScript 的一个有趣特性是一切都是对象,包括函数。稍作修改,您就可以ADS()改为返回一个匿名函数对象:

function ADS(e){ 
    return function(){ alert(e); };
}

http://jsfiddle.net/cSbWb/

于 2013-04-09T14:15:01.187 回答
6

实际上,有一个非常简洁的方法可以实现这一点,没有额外的混乱和匿名函数,使用 JS bind():

$(document).on('dblclick', ADS.bind(null, 'hello'));

第一个参数是您希望“ this ”在回调函数中具有的值。

Mozilla 开发者网络中的更多信息:https ://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind

于 2016-02-19T16:30:02.277 回答
4
function ADS(e){ alert(e); }

$(document).ready(function(){
          $(document).on("dblclick","#an_tnam tr", function (e) { ADS('hello') });

 });

会成功的。

于 2013-04-09T14:11:51.343 回答
3
function ADS(e) {
    return function() {
        alert(e);
    };
}

就像你做的时候那样

$(document).on("dblclick","#an_tnam tr", ADS('hello'));

,它是作为事件处理程序分配的返回函数(并且您的字符串参数在分配处理程序时传递,而不是在调用时传递)。

于 2013-04-09T14:14:55.810 回答