Javascript 定义回调并立即启动它的最佳方法是什么?

Javascript 定义回调并立即启动它的最佳方法是什么?,javascript,javascript-events,Javascript,Javascript Events,在jQuery中,我经常做这样的事情: $('#myId').bind('myevent', function() { ... }).trigger('myevent'); 当选择器只找到一个元素时效果很好,但是如果有多个匹配项,我不希望它触发多次 是否有某种方法可以基本上声明一个匿名函数并一次性执行它 或者你必须让它非注释性(给它一个名字),传递它,并手动调用它一次吗 例如,我可以将.change事件绑定到一组单选按钮。在回调中,我检查实际设置了哪个,然后显示/隐藏一个div。当页面加载时

在jQuery中,我经常做这样的事情:

$('#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());