我正在使用一个用户控件,该控件具有在执行操作时调用的一组javascript函数。此用户控件在应用程序的许多位置使用。
当其中一个内置JS函数完成执行时,我需要在我的页面上触发自定义JS函数。
当另一个函数完成执行时,我有没有办法附加要触发的函数?我不想更新内置的JS函数来调用这个JS函数。
希望这是有道理的。
答案 0 :(得分:4)
您可以使用几种设计模式,具体取决于具体代码(您尚未共享)以及您可以和不可以更改的内容:
选项1:为某些现有代码添加回调:
function mainFunction(callbackWhenDone) {
// do other stuff here
callbackWhenDone();
}
所以,你可以用:
来调用它mainFunction(myFunction);
选项2:换行上一个功能:
obj.oldMethod = obj.mainFunction;
obj.mainFunction = function() {
this.oldMethod.apply(this, arguments);
// call your stuff here after executing the old method
myFunction();
}
所以,现在任何时候有人这样做:
obj.mainFunction();
它会调用原始方法,然后调用你的函数。
答案 1 :(得分:2)
你基本上是在尝试做回调。既然你没有提到你正在谈论的函数(如在代码中),最好的办法就是基本上包装函数,-quick和dirty-并使其与回调一起使用。
这样你可以传递Lambda(匿名函数)并在完成后执行你想要的任何东西。
更新以演示如何添加回调:
function my_function($a, $callback) {
alert($a);
$callback();
}
my_function('argument', function() {
alert('Completed');
});
答案 2 :(得分:2)
最丑陋和最好的解决方案是修补内置功能。假设内置函数被称为“thirdParty”:
// first, store a ref to the original
var copyOfThirdParty = thirdParty;
// then, redefine it
var thirdParty = function() {
// call the original first (passing any necessary args on through)
copyOfThirdParty.apply(this, arguments);
// then do whatever you want when it's done;
// custom code goes here
customFunction();
};
我们基本上创建了内置函数的修改版本,而没有触及原始版本。
答案 3 :(得分:1)
由于Javascript是高度动态的,您可以修改原始函数而无需修改其源代码:
function connect_after(before, after){
return function(){
before.apply(this, arguments);
after();
};
}
var original_function = function(){ console.log(1); }
original_function = connect_after(original_function, function(){ console.log(2); })