你提到的jQuery,所以我會使用:
$(input).data('events').keyup
是將包含所有keyup
處理器陣列。如果只有一個由自動完成功能使用keyup事件,你可以劫持的處理程序第一次運行什麼功能,你需要的,然後運行原:
var originalKeyup = $(input).data('events').keyup[0].handler;
$(input).data('events').keyup[0].handler = function(){
// your code here, where you can add 'france' to input.value
// fire the old function
originalKeyup.apply(this,arguments);
};
你也只是從KEYUP數組中刪除原來的事件處理程序,並綁定新的會做你想做的事情。
UPDATE: 您可以劫持Element.prototype.addEventListener(前將所有代碼)的events
屬性添加到元素將包含任何代碼添加任何處理程序:
var oldAddEventListener = Element.prototype.addEventListener || Element.prototype.attachEvent;
Element.prototype.addEventListener = Element.prototype.attachEvent = function(type, handler){
this.events = this.events || {};
this.events[type] = this.events[type] || [];
this.events[type].push({handler: handler})
oldAddEventListener.apply(this,arguments);
};
現在,每次調用addEventListener時,都會通過jQuery或其他方式調用元素的events
屬性,並使用當前事件進行更新。您可能還需要劫持removeEventListener
刪除從events
對象相應的事件時removeEventListener
叫做:
var oldREL = Element.prototype.removeEventListener || Element.prototype.detachEvent;
Element.prototype.removeEventListener = Element.prototype.detachEvent = function(type, handler){
this.oldREL.apply(this,arguments);
if(this.events && this.events[type]){
for(var i=this.events[type].length-1; i>=0; i--){
if(this.events[type][i].handler == handler){
this.events[type].splice(i,1);
break; // remove only the first occurrence from the end
}
}
if(this.events[type].length==0){
delete this.events[type];
}
}
};
現在你應該能夠檢查任何元素上註冊的所有事件。您可以遍歷input.events.keyup
對象並使用input.removeEventListener
刪除所有'keyup'
事件。
attachEvent
和detachEvent
用於IE < 9.我沒有IE,所以它沒有在那裏測試過。它在Safari 5中運行良好。如果您在其他瀏覽器中遇到問題,請告知我。
注意:這些MODS需要在任何其他代碼的頁面上執行到位。
更新: 顯然,這不適用於FF或Opera。在代碼中更改Element
到HTMLInputElement
將解決問題。
thnaks的答案。但我的輸入元素有數據('事件')未定義。 使用選擇器來構造元素,並試圖將jQuery的objet包裝到javascript dom元素中。兩者都構建良好,但數據('事件')只是沒有定義。試過鍍鉻和ff。 – Stan
我用一個可能的解決方案更新了我的答案。看看它是否適合你。 – ampersand
都能跟得上; O(我使用鉻添加的代碼覆蓋在script標籤中添加和刪除監聽器來加載磁頭任何其他JS之前,我沒有錯誤,但事件仍是不確定的 – Stan