在JavaScript中,是否可以添加回调函数而不是覆盖它?

在JavaScript中,是否可以添加回调函数而不是覆盖它?,javascript,jquery,Javascript,Jquery,我不知道我说的是否正确,所以我会用一个例子来解释 假设我编写了一个jQuery插件,其中包含一个onShowEdit回调 我后来使用我的插件并向事件添加了一系列其他默认函数/方法: $('.editable_module:not(.custom)').editable({ onShowEdit: function(el){ initRequired(); $(':radio, :checkbox', el).prettyCheckboxes(); ini

我不知道我说的是否正确,所以我会用一个例子来解释

假设我编写了一个jQuery插件,其中包含一个
onShowEdit
回调

我后来使用我的插件并向事件添加了一系列其他默认函数/方法:

$('.editable_module:not(.custom)').editable({
   onShowEdit: function(el){
      initRequired();
      $(':radio, :checkbox', el).prettyCheckboxes();
      initDatePickers();
      initChosen();
      initMaskedInputs();
      $('.dynamic_box.tabs').dynamicBoxTabs();
      $('.trigger_dynamic_box').triggerDynamicBox('true');
   }
});
现在我有了一个基本/默认元素(
.editable_module
),它调用插件,并且有一些方法/函数将在所有实例中使用

我的问题是,当我需要为“一次性”交易添加一些东西时(我需要为这个回调/事件添加一些行为,但不是通常使用的东西)。是否可以扩展或添加到此回调/事件而不覆盖它?我是说,我知道我可以进去做这个:

$('#new_selector').editable({
   onShowEdit: function(el){
      initRequired();
      $(':radio, :checkbox', el).prettyCheckboxes();
      initDatePickers();
      initChosen();
      initMaskedInputs();
      $('.dynamic_box.tabs').dynamicBoxTabs();
      $('.trigger_dynamic_box').triggerDynamicBox('true');

      //ADD SOME NEW STUFF HERE
   }
});
但这真的是我唯一的选择吗


预先感谢任何输入/建议。

< P>你可以考虑jQuery的自己的事件系统如下:您可以非常轻松地将其集成到
$.fn
函数中,只需将适当的函数作为对象的属性而不是函数文本传递即可

$("input").on("foo", function() {
    alert(1);
});

// later

$("input").on("foo", function() {
    alert(2);
});

// later

$("input").trigger("foo"); // alerts 1 and 2

您可以简单地使用
.on
/
.off
绑定和解除绑定事件,并使用
.trigger
触发所有事件。jQuery还支持对事件名称进行排序,以确保您没有使用已使用的事件。

如果我理解正确,这里的关键词是“工厂”

jQuery本身就是一个工厂,但要获得您所描述的内容,您还需要将插件作为工厂中的一个工厂。这需要插件以某种方式编写


最简单的方法可能是使用jQuery的UI小部件工厂

您可以使用新的
$.Callbacks()
方法

var $onShowEditCBObj = $.Callbacks();
function onShowEditHandler() {
  $onShowEditCBObj.fire();
}
$('#new_selector').editable({
   onShowEdit: onShowEditHandler
});
// add default event to callbacks obj
$onShowEditCBObj.add(function(){
  initRequired();
  $(':radio, :checkbox', el).prettyCheckboxes();
  initDatePickers();
  initChosen();
  initMaskedInputs();
  $('.dynamic_box.tabs').dynamicBoxTabs();
  $('.trigger_dynamic_box').triggerDynamicBox('true');
});
// add a one time method to the callbacks obj
function oneTimeEvent () {
  alert("worky");
  $onShowEditCBObj.remove(oneTimeEvent);
}
$onShowEditCBObj.add(oneTimeEvent)
使用此设置,您可以更改将触发的回调,而无需对可编辑插件执行任何额外操作


编辑:我不知道是你写的插件。考虑到这一点,pimvdb的答案比要求开发人员以某种方式编码更可靠。

为onShowEdit定义一个单独的函数应该可以工作

var myOnShowEdit = function(el, extra_fn) {
    //standard functionality goes here
    if (typeof extra_fn==='function') extra_fn(); //support for extra stuff
}
$('.editable_module:not(.custom)').editable({
    onShowEdit: function(el) {
        myOnShowEdit(el);
    }
});
$('#new_selector').editable({
    onShowEdit: function(el) {
        myOnShowEdit(el, function(){console.log('hi');});
    }
});

这将为您提供公平的灵活性,以便在标准内容之外添加您需要的任何功能。请注意
这可能会改变上下文。

您可以创建一个基于事件的插件系统,以允许运行(和/或删除)多个“回调”。因此,类似于“onShowEdit”和“onShowEdit2”(可能是更好的名称,哈哈)。两者同时调用的位置?如pimvdbs应答中所示。你也可以为事件命名名称空间,以便区分事件。事实上,我在很多场合对此很好奇,包括一些我没有编写插件的地方,所以我认为这仍然非常有用!谢谢。这是我认为可行的路线。谢谢