Javascript 定义回调并立即启动它的最佳方法是什么?
在jQuery中,我经常做这样的事情:Javascript 定义回调并立即启动它的最佳方法是什么?,javascript,javascript-events,Javascript,Javascript Events,在jQuery中,我经常做这样的事情: $('#myId').bind('myevent', function() { ... }).trigger('myevent'); 当选择器只找到一个元素时效果很好,但是如果有多个匹配项,我不希望它触发多次 是否有某种方法可以基本上声明一个匿名函数并一次性执行它 或者你必须让它非注释性(给它一个名字),传递它,并手动调用它一次吗 例如,我可以将.change事件绑定到一组单选按钮。在回调中,我检查实际设置了哪个,然后显示/隐藏一个div。当页面加载时
$('#myId').bind('myevent', function() { ... }).trigger('myevent');
当选择器只找到一个元素时效果很好,但是如果有多个匹配项,我不希望它触发多次
是否有某种方法可以基本上声明一个匿名函数并一次性执行它
或者你必须让它非注释性(给它一个名字),传递它,并手动调用它一次吗
例如,我可以将
.change
事件绑定到一组单选按钮。在回调中,我检查实际设置了哪个,然后显示/隐藏一个div。当页面加载时,div需要处于正确的状态,因此我触发一次事件,让JS判断是否应该显示它。但是我真的不希望它触发3次,因为我有3个单选按钮。如果唯一的问题是选择器匹配多个元素,只需使用.first()
:
将其转换为jQuery插件非常简单,您可以像.bind()
一样使用它:
插件代码(未测试)
使用方法而不是方法
这将只调用处理程序一次,并且不允许事件冒泡或触发默认行为
来自文档:
.triggerHandler()方法的行为
类似于.trigger(),具有
下列例外情况:
- .triggerHandler()方法不会导致 要发生的事件(如窗体) 提交)
- While.trigger()将对jQuery匹配的所有元素进行操作 对象,.triggerHandler()仅影响 第一个匹配的元素
- 使用.triggerHandler()创建的事件不会在 DOM层次结构;如果他们不被处理 由目标元素直接执行,它们 什么也不做
- 而不是返回jQuery对象(以允许链接), .triggerHandler()返回 值由最后一个处理程序返回 它导致被处决。如果没有 处理程序被触发时,它返回 未定义
我可以想出两种方法来定义匿名函数并同时调用它 第一种方法是使用
参数.callee
值使函数返回自身,并在该位置调用函数。举个例子可能会更清楚:
el.bind('myevent', (function() {
...;
return arguments.callee; // return the function
})());
第一种方法的问题是,函数总是返回自身。另一种方法是扩展函数。prototype
使用助手方法,如下例所示:
// extend the prototype once somewhere
Function.prototype.invoke = function(){
this(); // invoke...
return this; // and return the function
};
// invoke() on an anonymous function now calls the function
// and returns the function instead of the result.
el.bind('myevent', (function(){
...
}).invoke());
好东西,这是我在
中看到的第一个真正的用例。triggerHandler()
。在我理解它之前,我已经读了好几遍了..哈哈。是的,这听起来像是我想要的。Awesome:)应该提到参数。被调用方
已被弃用,目前无法在的“严格模式”下工作
@patrick dw:Function.arguments.callee
已弃用,而不是arguments.callee
。看,这是个好主意。我可能会用这个。谢谢:)
;(function ($)
{
$.fn.bindTrigger = function ()
{
this.bind.apply(this, arguments).first().trigger(arguments[0]);
};
})(jQuery);
el.bind('myevent', (function() {
...;
return arguments.callee; // return the function
})());
// extend the prototype once somewhere
Function.prototype.invoke = function(){
this(); // invoke...
return this; // and return the function
};
// invoke() on an anonymous function now calls the function
// and returns the function instead of the result.
el.bind('myevent', (function(){
...
}).invoke());