有没有办法使用jQuery的.bind()和.trigger()调用来执行用户定义的函数(例如:save())并根据方法的返回进行操作?例如:
$("#aForm").bind ('save', function () {
return true;
});
Run Code Online (Sandbox Code Playgroud)
然后:
if ($("#aForm").trigger ('save') == true) {
doSomething ();
}
Run Code Online (Sandbox Code Playgroud)
我知道这个问题很老,但也许这可以帮到某些人.
正如Paliath指出的那样,您无法返回值,因为触发器事件是异步的.你可以做的是将一个对象作为参数传递给事件.默认情况下,javascript对象始终是对原始对象的引用.
例如.:
绑定:
$(...).bind('example',function (evt,ret) {
ret.val = false;
});
Run Code Online (Sandbox Code Playgroud)
触发:
var ret = {ret:true};
$(...).trigger('example',[ret]);
if (!ret.ret)
//event return false
else
//event returned true
Run Code Online (Sandbox Code Playgroud)
检查triggerHandler(),它在许多其他方面起作用,trigger()但允许您返回一个值.
来自文档:
.triggerHandler()方法的行为与.trigger()类似,但有以下例外:
- .triggerHandler()方法不会导致事件的默认行为(例如表单提交).
- 虽然.trigger()将对jQuery对象匹配的所有元素进行操作,但.triggerHandler()仅影响第一个匹配的元素.
- 使用.triggerHandler()创建的事件不会冒泡DOM层次结构; 如果它们不是直接由目标元素处理的,它们什么都不做.
- .triggerHandler()不返回jQuery对象(允许链接),而是返回它导致执行的最后一个处理程序返回的任何值.如果没有触发处理程序,则返回undefined
为什么不在回调本身中对返回值进行操作?它取消了额外的检查(这不会像您期望的那样工作)。
$("#aForm").bind ('save', function () {
if(some stuff happens that is true) {
doSomething();
}
else {
doSomethingElse();
}
});
Run Code Online (Sandbox Code Playgroud)
回调不能同步工作。它们用于处理异步发生的事情(如事件)。在回调的上下文中,它们是发生事件时运行的代码片段。从它们返回值确实没有意义。在您的示例中,由于您想要检查回调的返回值,因此您可以确保仅在回调运行时获得返回值(因为您尝试像常规函数一样使用它们)。在这种情况下,将该逻辑放入回调本身中(就像我上面所示的那样)。
| 归档时间: |
|
| 查看次数: |
10825 次 |
| 最近记录: |