jQuery的.click-将参数传递给用户函数


283

我正在尝试使用jQuery的.click调用带有参数的函数,但无法正常工作。

这就是我想要的工作方式:

$('.leadtoscore').click(add_event('shot'));

哪个电话

function add_event(event) {
    blah blah blah }

如果我不使用参数,它会起作用,例如:

$('.leadtoscore').click(add_event);
function add_event() {
    blah blah blah }

但是我需要能够将参数传递给我的add_event函数。

我该怎么做?

我知道我可以使用.click(function() { blah },但是我add_event从多个地方调用该函数,并希望以此方式进行操作。


这是从patricks答案中采纳的,我认为这是一个很好的解决方案:jsfiddle.net/naRRk/1
— jAndy 2010年

Answers:


514

为了更全面,我遇到了另一个解决方案,该解决方案是jQuery click事件处理程序 1.4.3版中引入的功能的一部分。

它允许您将数据映射传递给事件对象,该事件对象由jQuery作为第一个参数自动反馈给事件处理函数。数据映射将.click()作为第一个参数传递给函数,随后是事件处理函数。

这是一些代码来说明我的意思:

// say your selector and click handler looks something like this...
$("some selector").click({param1: "Hello", param2: "World"}, cool_function);

// in your function, just grab the event object and go crazy...
function cool_function(event){
    alert(event.data.param1);
    alert(event.data.param2);
}

我知道这个问题来得太晚了,但是以前的答案使我找到了这个解决方案,所以我希望它能在某个时候对某人有所帮助!


11
这正是我想要的(当时)。从那时起我一直没有从事这个项目,但是我想我使用的是1.4.0。这绝对是可用的最佳方法。
— 保罗·霍弗

1
我在服务器端动态创建对象,并用以下方法绑定click事件:r.OnClientClick =“ imageClicked({param1:'” + obj.Command +“'}); return false”; 然后在客户端上,我有:function imageClicked(event){if(event.param1 ==“ GOTO PREVIOUS”){...如果我使用event.data.param1,它表示未定义。现在我已经在这里输入了,我可以看到区别,哦!
— 家庭

1
@Family-哈哈,没问题,即使通过评论也很乐意提供帮助;)
— 克里斯·肯本

5
@totymedli -我想你可以随时拨打别的地方,通过结构相同的对象:var param_obj = {data : {param1: "Hello", param2: "World"}}; cool_function(param_obj);?
— 克里斯·肯本

1
这比使用HTML5数据属性好得多,谢谢!(并且解决了JSHint也抱怨在回调中使用'this'的问题!)
— Matthew Herbst 2014年

77

您需要使用如下匿名函数:

$('.leadtoscore').click(function() {
  add_event('shot')
});

您可以像示例中那样调用它,只是一个没有参数的函数名,如下所示:

$('.leadtoscore').click(add_event);

但是该add_event方法无法获得'shot'其参数,而是click传递给回调的任何东西,这是event对象本身……因此,它不适用于这种情况,但可以用于其他许多情况。如果需要传递参数,请使用匿名函数...或者,还有另一个选择,使用.bind()并传递数据,如下所示:

$('.leadtoscore').bind('click', { param: 'shot' }, add_event);

并在中访问它add_event,如下所示:

function add_event(event) {
  //event.data.param == "shot", use as needed
}

当您说刚好时,那仅意味着?其次,这是否意味着我将能够像通常在匿名函数中那样在add_event函数中使用$(this)?
— Paul Hoffer

2
@phoffer-是的,“ just”表示没有参数,仅表示函数名称,它是对函数的引用,而不是运行要分配给click处理程序的函数的结果。在上面的匿名方法和.bind()示例中,您可以使用this,它表示.loadtoscore您单击的对象(与您期望的一样)。在最后一个示例中,add_event(event)使用true this或true $(this)都是您想要的。
— 尼克·

1
@phoffer:您必须显式地传递元素才能使用它,例如:function(){ add_event('shot', $(this));}和function add_event(event, element){...}。element在这里将是一个jQuery元素(bind()尽管与Nick提到的一样,它也可以使用)。
— 菲利克斯·克林

@Felix-他还可以$(this)在函数内部使用,例如:jsfiddle.net/tSu5t
— Nick Craver

35

如果用它的方式来称呼它...

$('.leadtoscore').click(add_event('shot'));

...您将需要add_event()返回一个函数,例如...

function add_event(param) {
    return function() {
                // your code that does something with param
                alert( param );
           };
}

该函数将返回并用作的参数.click()。


@jAndy-感谢您发布包含event参数的示例。我应该把它包括在内。:o)
— user113716 2010年

27

我成功使用.on()像这样:

$('.leadtoscore').on('click', {event_type: 'shot'}, add_event);

然后在add_event函数内部,您可以像这样访问“ shot”:

event.data.event_type

有关更多信息,请参见.on()文档,其中提供了以下示例:

function myHandler( event ) {
  alert( event.data.foo );
}
$( "p" ).on( "click", { foo: "bar" }, myHandler );

11

是的,这是旧帖子。无论如何,有人可能会发现它有用。这是将参数发送到事件处理程序的另一种方法。

//click handler
function add_event(event, paramA, paramB)
{
    //do something with your parameters
    alert(paramA ? 'paramA:' + paramA : '' + paramB ? '  paramB:' + paramB : '');
}

//bind handler to click event
$('.leadtoscore').click(add_event);
...
//once you've processed some data and know your parameters, trigger a click event.
//In this case, we will send 'myfirst' and 'mysecond' as parameters
$('.leadtoscore').trigger('click', {'myfirst', 'mysecond'});

//or use variables
var a = 'first',
    b = 'second';

$('.leadtoscore').trigger('click', {a, b});
$('.leadtoscore').trigger('click', {a});

6
      $imgReload.data('self', $self);
            $imgReload.click(function (e) {
                var $p = $(this).data('self');
                $p._reloadTable();
            });

将javaScript对象设置为onclick元素:

 $imgReload.data('self', $self);

从“此”元素获取对象:

 var $p = $(this).data('self');

太棒了!可悲的是,这是我尝试使用jquery变量时唯一有效的方法!不知道为什么。:|
— cregox

3

我得到了简单的解决方案:

 <button id="btn1" onclick="sendData(20)">ClickMe</button>

<script>
   var id; // global variable
   function sendData(valueId){
     id = valueId;
   }
   $("#btn1").click(function(){
        alert(id);
     });
</script>

我的意思是将value onclick事件传递给javascript function sendData(),将其初始化为变量,然后通过jquery事件处理程序方法将其接收。

因为一开始这是可能的 sendData(valueid)会调用并初始化该值。然后在执行jquery事件后执行并使用该值。

这是简单的解决方案,有关详细信息的解决方案,请转到此处。


我没有在这里传递动态参数的方法,只有硬编码的值。
— user1451111 '19

这样,您仅传递valueId并丢失元素和事件对象。
— 佐尔坦SULE
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.