使用jQuery .trigger调用返回值的自定义函数

时间:2010-06-29 16:32:06

标签: jquery

有没有办法使用jQuery的.bind()和.trigger()调用来执行用户定义的函数(例如:save())并对该方法的返回进行操作?例如:

$("#aForm").bind ('save', function () {
  return true;
});

然后:

if ($("#aForm").trigger ('save') == true) {
  doSomething ();
}

4 个答案:

答案 0 :(得分:8)

我知道这个问题很老,但也许这可以帮助别人。

正如Paliath指出的那样,您无法返回值,因为触发器事件是异步的。 你可以做的是将一个对象作为参数传递给事件。默认情况下,javascript对象始终是对原始对象的引用。

例如:

结合:

$(...).bind('example',function (evt,ret) { 
    ret.val = false;
});

触发:

var ret = {ret:true};
$(...).trigger('example',[ret]);
if (!ret.ret)
    //event return false
else
    //event returned true

答案 1 :(得分:5)

结帐triggerHandler(),其他许多方式与trigger()相同,但会允许您返回值。

来自文档:

  

.triggerHandler()方法与.trigger()的行为类似   以下例外:

     
      
  • .triggerHandler()方法不会导致事件的默认行为(例如表单提交)。
  •   
  • 虽然.trigger()将对jQuery对象匹配的所有元素进行操作,但.triggerHandler()只会影响第一个匹配的元素。
  •   
  • 使用.triggerHandler()创建的事件不会冒泡DOM层次结构;如果它们不是直接由目标元素处理的,   他们什么都不做。
  •   
  • .triggerHandler()不返回jQuery对象(允许链接),而是返回最后一个返回的值。   处理程序导致执行。如果没有触发处理程序,它   返回undefined
  •   

答案 2 :(得分:4)

您还可以使用jQuery builtin event.preventDefault()event.isDefaultPrevented()

$("#aForm").bind ('save', function (event) {
    return true;
    // "return false" or "event.preventDefault()" have the same effect
  }
});

然后:

var event = $.Event('save')
$("#aForm").trigger (event)
if (event.isDefaultPrevented() == false) {
  doSomething ();
}

答案 3 :(得分:3)

为什么不对回调本身的返回值进行操作?它会带走额外的支票(这不会像你期望的那样工作)。

$("#aForm").bind ('save', function () {
  if(some stuff happens that is true) {
      doSomething();
  }

  else {
      doSomethingElse();
  }
});

回调不能同步工作。它们用于处理异步发生的事情(如事件)。在回调的上下文中,它们是在发生某些事情时运行的代码片段。从它们返回值确实没有意义。在您的示例中,由于您要检查回调的返回值,因此您可以确保在回调运行时获取返回值(因为您尝试使用它们像常规功能)。在这种情况下,将该逻辑放在回调本身内(就像我上面所示)。