2011-08-10 89 views
0

我正在加載一個框架(Microsoft AJAX框架)以及Prototype和一個自動完成文本框。框架和自動完成都在向一些文本框添加行爲。我通常希望這兩個片段都可以運行,但不是一直運行。基本上,如果自動完成項目已被選中,我不希望框架JS運行。無法覆蓋另一個框架的JavaScript函數

我想我會嘗試覆蓋框架使用這樣的技術:Overriding a JavaScript function while referencing the original

var original_doSomething = doSomething; 
doSomething = function() 
{ 
    //do something *else* 
    if(something) original_doSomething(); 
} 

但是,框架有點聰明,並且已被證明難以覆蓋事件處理程序正在保留原始功能。我寫了一個jsfiddle來嘲笑這種情況。 http://jsfiddle.net/jeffrod/haHD4/2/

是否有覆蓋dosomething所以我可以添加自己的邏輯?

回答

2

可你只是你自己改變這一功能:

$(function() 
{ 
    var someObject = { 'a':'aaa' } 
    $('input').keypress(createHandler(someObject,dosomething)); 
}); 

或重新分配keypress處理程序自己。該功能在您有機會自己更改dosomething之前綁定dosomething

+0

取消綁定原有的處理器和然後重新綁定我的?你是這個意思嗎?這可以工作。 – Jeff

+0

@Jeff是的,那 – Griffin

+0

太棒了。那工作。我不知道爲什麼我沒有想到這一點。我想我錯過了樹林。謝謝! – Jeff

0

您需要確保腳本運行之後所有其他庫腳本都已運行。這裏有一個更新的小提琴:http://jsfiddle.net/mrchief/haHD4/5/

更新: 由於的jsfiddle的方式呈現,這個演示可能會誤導。我想說的本質是這樣的:

這是腳本塊應該如何註冊(注意覆蓋塊在最後一刻被註冊,所有的框架腳本後):

<script src="MsAJax.js></script> 
<script src="Prototype.js></script> 
<script src="blahblah.js></script> 

<script type="javascript"> 
    //this represents my file that i have control over. this 
    //js snippet runs after the framework 

    window._dosomething = window.dosomething; 
    function dosomething() { 
     console.log('overwritten'); 
    } 
</script> 
+0

這個小提琴基本上把新的'dosomething' JavaScript函數放在框架js文件中。我無法編輯這個文件,所以這個解決方案不會爲我工作。這就是爲什麼我把我的'dosomething'函數放在標記的腳本標記中。 – Jeff

+0

哦,不,當你把東西放在標記中時,總是先運行(這是jsfiddle渲染它的方式)。我把它們放在最後來演示我提到的想法。在你的頁面中,你不必修改框架js。只要確保在所有框架腳本標籤之後寫入「覆蓋」腳本塊即可。希望這是有道理的。 – Mrchief

+0

@Jeff,看我的更新。希望它能澄清我的觀點。 – Mrchief