我需要裝飾我無法修改的第三方功能,因此我需要以任何方式修飾它。我發現在Prototype中有一些容易做的事情[1]。JavaScript裝飾工具HOWTO?
在jQuery或純JavaScript中有沒有其他選擇?
[1] http://api.prototypejs.org/language/Function/prototype/wrap/
我需要裝飾我無法修改的第三方功能,因此我需要以任何方式修飾它。我發現在Prototype中有一些容易做的事情[1]。JavaScript裝飾工具HOWTO?
在jQuery或純JavaScript中有沒有其他選擇?
[1] http://api.prototypejs.org/language/Function/prototype/wrap/
那你的方案需要一個圖書館嗎?這似乎與本地JavaScript,你可以簡單地說:
你的意思是保存原件的副本? 這樣的事情? new_func = originalFunc function myExtendedVersion() { // do my stuff new_func(); // do my stuff }
–
2009-12-04 18:48:50
是的,然後設置originalFunc = myExtendedVersion。 – 2009-12-04 18:53:09
我喜歡庫提供的wrap函數:Prototype具有wrap函數。在ExtJS中,可以使用createDelegate或createInterceptor。 Dojo具有聲明式AOP。 SANS框架,一個可以做到這一點:
myFunction(){
something();
thirdParty.call(); // or apply
perhapsSomethingElse();
}
與jQuery,這將是很容易只添加其他功能使用。嘗試是這樣的:
//Sample function you're wrapping around
function say_hi(){
alert('hi');
}
//quick jq plugin
jQuery.fn.functionWrap = function(arg,opts){
if(opts.before && typeof(opts.before)=='function'){
opts.before();
}
arg();
if(opts.after && typeof(opts.after)=='function'){
opts.after();
}
};
//sample function to use the wrapper func
function btnPress(){
$().functionWrap(
say_hi,
{
before : function(){ alert('happens before'); },
after : function(){ alert('happens after'); }
}
);
}
嘗試添加到您的網頁,而這樣的事情來測試它:
<input type="button" value="asdf" onClick="btnPress();" />
希望這有助於你。
這將做到這一點,謝謝。但我發現接受的答案更清楚。 – 2009-12-04 18:55:46
我會去弗蘭克Schwieterman解決方案:
new_func = originalFunc
function myExtendedVersion()
{
// do my stuff
new_func();
// do my stuff
}
你可以用jQuery的AOP插件做到這一點:http://code.google.com/p/jquery-aop/
代碼是這樣:
jQuery.aop.around({target: window, method: 'originalFunc'},
function(invocation) {
// do your stuff
invocation.proceed();
// do your stuff
}
);
注:需要用jquery或普通的js來做,不能添加另一個js框架。 – 2009-12-04 18:46:02