Вы упомянули jQuery, поэтому я буду использовать это:
$(input).data('events').keyup
- это массив, который будет содержать все обработчики keyup
. Если Autocomplete использует только одно событие 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];
}
}
* *} Тысяча двадцать-одина; * * тысяча двадцать две
Теперь вы должны иметь возможность проверять все события, зарегистрированные на любом элементе. Вы можете удалить все 'keyup'
события, перебирая объект input.events.keyup
и используя input.removeEventListener
.
attachEvent
и detachEvent
используются IE <9. У меня нет IE, поэтому он там не тестировался. Он хорошо работает в Safari 5. Дайте мне знать, если у вас есть проблемы в других браузерах. </p>
ПРИМЕЧАНИЕ: эти моды должны быть на месте ДО того, как любой другой код будет выполнен на странице.
Обновление:
По-видимому, это не будет работать в FF или Opera. Изменение Element
на HTMLInputElement
в коде решит проблему.