Автозаполнение YUI: поиск после вставки?

Я использую виджет автозаполнения от YUI для реализации живого поиска, как в примерах. Однако он отлично работает, когда вводится текст для поиска, но не работает, когда текст вставляется в поле. Каким будет правильный способ инициировать автозаполнение при вставке? В документации ничего по этому поводу не нашел...

РЕДАКТИРОВАТЬ: Вставка не Ctrl-V, обычно это «Вставить» из контекстного меню. YUI реагирует на нажатие клавиши, но не реагирует, если что-то вставлено мышью.


person Nikolai Prokoschenko    schedule 18.08.2009    source источник


Ответы (3)


Мы расширили виджет автозаполнения YUI и обработали вставку из контекстного меню следующим образом:

YAHOO.util.Event.on(input, 'paste', function(e, autocomplete) {
    // We're interested in the value of the input field after text is pasted into
    // it instead of the pasted text because the autocomplete proposals are based 
    // upon the field's whole value. The paste event happens before the input 
    // field has been updated so we need to wait until after this event has been 
    // handled to check the value of the input field.
    window.setTimeout(function() {
        if (autocomplete._sInitInputValue !== autocomplete.getInputEl().value) {
            autocomplete.sendQuery(autocomplete.getInputEl().value);
        }
    }, 1);
}, this);

Где this — виджет автозаполнения.

person Walter Rumsby    schedule 15.06.2010
comment
Вы также можете использовать YAHOO.lang.later вместо window.setTimeout. - person Walter Rumsby; 06.11.2010

Возможно, в ключевом событии вы могли бы определить, нажимали ли они v, удерживая Ctrl. Если да, выполните sendQuery('query=' + textInput.value);

person Zoidberg    schedule 18.08.2009

Изменить

Вот таблица совместимости, показывающая, какие браузеры позволяют подписаться на события вставки.

http://www.quirksmode.org/dom/events/cutcopypaste.html

Вот его тестовая страница, где вы можете увидеть, как подписаться на события.

http://www.quirksmode.org/dom/events/tests/cutcopypaste.html

Я предполагаю, что вы могли бы подписаться на это, используя YUI, а затем просто сделать свой обратный вызов таким:

function() { 
    autoCompleteObject.sendQuery(autoCompleteElement.value);
}

Следите за несовместимостью браузеров, похоже, у некоторых странная реализация событий.

person Tivac    schedule 18.08.2009