在JavaScript中,是否可以添加回调函数而不是覆盖它?
我不知道我说的是否正确,所以我会用一个例子来解释 假设我编写了一个jQuery插件,其中包含一个在JavaScript中,是否可以添加回调函数而不是覆盖它?,javascript,jquery,Javascript,Jquery,我不知道我说的是否正确,所以我会用一个例子来解释 假设我编写了一个jQuery插件,其中包含一个onShowEdit回调 我后来使用我的插件并向事件添加了一系列其他默认函数/方法: $('.editable_module:not(.custom)').editable({ onShowEdit: function(el){ initRequired(); $(':radio, :checkbox', el).prettyCheckboxes(); ini
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应答中所示。你也可以为事件命名名称空间,以便区分事件。事实上,我在很多场合对此很好奇,包括一些我没有编写插件的地方,所以我认为这仍然非常有用!谢谢。这是我认为可行的路线。谢谢