Как удалить слушатели событий KeyUp с помощью JavaScript - PullRequest
0 голосов
/ 22 сентября 2011

Я использую API автозаполнения Google в текстовом поле, чтобы предлагать места при вводе.Основная проблема, с которой я столкнулся, заключается в том, что Google не позволяет ограничивать результаты конкретной страной, он просто позволяет смещать результаты в границы областей, что является бесполезным.

Так что поиск по термину "ru" будетдать вам Россию в предложениях, даже если ваш регион находится где-то в Европе.

Я понял, однако, что если вы добавите, например, "france ru", это даст вам французские местоположения, только совпадающие с ru, что идеально.

Так что моя проблема в том, что автозаполнение полностью построено с помощью google javascript.

autocomplete = new google.maps.places.Autocomplete(input, options);

Так что я не могу легко поиграть со строкой поиска, чтобы постоянно добавлять в нее "france"

Я могупосмотрим, что связано с событием onkeyup в этом поле, и могу взять его и вызвать его сам, однако я не могу отсоединить его от keyup.Я пробовал несколько решений, как это сделать, но не могу найти способ.JQuery Unbind не будет работать, поскольку это не связано через него, очевидно.Нативные функции хотят ссылку на функцию, привязанную к слушателю, но это анонимная функция.Нашел несколько примеров использования циклов над element.data['events'], но я получаю неопределенную ошибку с данными.

Есть ли у кого-нибудь решение отменить привязку всего, что зарегистрировано в onkeyup?

Ответы [ 2 ]

0 голосов
/ 23 сентября 2011

Вы пытались привязать автозаполнение к границам текущей карты, , как показано в документации : autocomplete.bindTo('bounds', map)?

0 голосов
/ 22 сентября 2011

Вы упомянули 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 в коде решит проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...