您提到了 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 数组中删除原始事件处理程序,并绑定将执行您想要的新事件处理程序。
更新:您可以劫持 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);
};
现在,每次通过 jQuery 或其他方式调用 addEventListener 时,元素的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];
}
}
};
现在您应该能够检查在任何元素上注册的所有事件。您可以'keyup'
通过迭代input.events.keyup
对象并使用input.removeEventListener
.
attachEvent
anddetachEvent
被 IE<9 使用。我没有IE,所以没有在那里测试过。它在 Safari 5 中运行良好。如果您在其他浏览器中遇到问题,请告诉我。
注意:这些模块需要在页面上执行任何其他代码之前就位。
更新:显然,这在 FF 或 Opera 中不起作用。在代码中更改Element
为HTMLInputElement
将解决问题。