从jQuery Event访问函数中的参数*和*事件

Meg*_*att 3 javascript jquery function callback

这是我不久前问过的另一个问题的后续问题.通常,您可以从jQuery事件访问函数调用中的事件,如下所示:

$item.live("click", functionToCall);
Run Code Online (Sandbox Code Playgroud)

并在功能:

function functionToCall(ev) {
  // do something with ev here, like check 'ev.target'
}
Run Code Online (Sandbox Code Playgroud)

但是如果我想将一个参数发送到functionToCall()访问该事件呢?也许这样的事情呢?:

$item.live("click", functionToCall($(this));  // send over parameter this time
Run Code Online (Sandbox Code Playgroud)

function functionToCall(ev, $clickedItem) {
  // both accessible here?
  alert(ev.type);
  alert($clickedItem.attr('id'));
}
Run Code Online (Sandbox Code Playgroud)

这是可以接受的,还是有不同的方式发送参数?因为这种方式对我来说似乎不对.任何帮助,将不胜感激.谢谢.

澄清:我意识到一个匿名的回调函数可以让我访问这两个,但由于各种原因太长而无法进入这篇文章,我需要使用函数调用而不是匿名函数.所以我的问题严格处理需要调用外部函数的场景.谢谢.

更新:我的原始问题提出了需要将$(this)作为参数传递给外部函数的场景.事实证明,$(this)将在函数中可访问,甚至不需要传递它,因为jQuery基于事件将值重新分配给"this".所以执行此代码应该适用于我原来的问题:

$item.live("click", functionToCall);
Run Code Online (Sandbox Code Playgroud)

function functionToCall(ev) {
  alert(ev.type);
  alert($(this).attr('id'));  // display id of item that was clicked
}
Run Code Online (Sandbox Code Playgroud)

但是,正如其他人已经回答的那样,有一种不同的场景需要将不同类型的变量作为参数传递,例如简单的字符串或int.在这种情况下,正如其他人所说,它变得更加复杂.但这里似乎有足够的答案来满足第二种情况(即"currying").谢谢.

CMS*_*CMS 5

您可以咖喱或部分应用您的功能:

像这样的东西:

function functionToCall($clickedItem) {
  return function (ev) {
    // both accessible here
    alert(ev.type);
    alert($clickedItem.attr('id'));
  }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像你想要的那样使用它:

$item.live("click", functionToCall($(this)); 
Run Code Online (Sandbox Code Playgroud)

注意:如果您无法修改原件,functionToCall因为它是"外部",您可以将其包装:

function wrapFunctionToCall($clickedItem) {
  return function (ev) {
    // call original function:
    functionToCall(ev, $clickedItem);
  }
}
// ...
$item.live("click", wrapFunctionToCall($(this));
Run Code Online (Sandbox Code Playgroud)