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.