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

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

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

然后:

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

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

正如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 

检查triggerHandler() ,它在许多其他方面像trigger()但允许您返回一个值。

来自文档:

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

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

您还可以使用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 (); } 

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

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

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