你提到的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