9

入力中にオートコンプリート検索をトリガーする検索フィールドがあります。キーアップでトリガーします。これはほとんどのブラウザーで完全に機能しますが、Android 上の Firefox では機能しません。入力中に keyup イベントがトリガーされないようです。これは、Android キーボードの設定で単語の提案がオンになっている場合にのみ発生します。

Google 検索で、オートコンプリート検索が同じ設定で機能することを確認したので、明らかに可能です。どうやって?これが機能するために聞く必要があるのは特別なイベントですか?

さらに、イベントの変更、キーダウン、キープレスをリッスンしようとしましたが、何もトリガーされません。

HTML:

<input type="text" id="searchField" 
 autocomplete="off" spellcheck="false" autocorrect="off" />

jQuery イベント バインディング:

  $('#searchField').keyup(function (e) {
    var searchValue = $(this).val();
    searchApi._executeAutocomplete(searchValue);
  });

注:
場合によっては、キー イベントトリガーされることがあります。これは通常、単語を形成するプロセスに至らないキーを押すことです。ここで最も明白なのはEnter、常にトリガーする です。もう 1 つは ですSpace。スペースは完全な単語の定義であるため、単語にスペースが含まれていないためにトリガーされます。Backspaceトリガーする場合削除された最後の文字が単語内にありませんでした。つまり、単語の最後に残っている文字を削除した場合 (つまり、フィールドの先頭、またはスペースに続くカーソル) はトリガーされますが、カーソルがまだある単語の末尾にあるいくつかの文字を削除した場合はトリガーされません。手紙の直後。基本的に、キーを押した結果、キーボード アプリから何らかの単語が提案された場合、キー イベントはトリガーされません。

補足として、同じデバイスの Chrome ではすべてが正常に機能すると言えます。

4

3 に答える 3

0

私は別の質問に対するこの回答で解決策を見つけました。質問は基本的に「私が動的に書いたテキストをページの別の部分に複製すること」でした。その答えは、マウスを使用してテキストを貼り付けるなど、キーボード以外のアクションによる変更のキャッチのサポートを含むことでした。を使用して値が変更されたかどうかをチェックするテキストフィールドでフォーカスのスニファを開始することで解決しましたsetInterval(...)。ぼかし時にタイマーをクリアします。

これにより、基本的にキーイベントがトリガーされないという私の問題が解決しました。また、この答えが見つかるまで問題であることに気づかなかった「マウスによる貼り付け」の問題も解決しました...!

これは機能しますが、スニファを使用しているため、このソリューションに完全に満足しているとは言えません。変更の原因が何であれ、値の変更時にトリガーされるある種のイベントを使用する方が幸せです。changeフォーカスがフィールドを離れるまでトリガーされないため、イベントの使用は機能しません。

于 2013-01-08T09:10:25.770 に答える
0

Android 上の Firefox はキーイベントをトリガーしないだけでなく、何らかの奇妙な入力イベントもトリガーするという事実 (1 つのキーを押すと 2 つのイベントがトリガーされ、離れた場合にも入力イベントがトリガーされるなど)入力) 私は自分のイベントを書かなければなりませんでした:

(function($){
var $event = $.event,
    $special = $event.special.fennecInput = {
        setup: function(){
            $(this).on('input',$special.handler);
        },
        teardown: function(){
            $(this).off('input',$spceial.handler);
        },
        handler: function(event) {
            var context = this,
                args = arguments,
                dispatch = function() {
                    event.type='fennecInput';
                    $event.dispatch.apply(context,args);
                };
            if($(context).val() != $(context).attr('data-fennecInput-oldval')){
                dispatch();
                $(context).attr('data-fennecInput-oldval',$(context).val());
            }
        }
    };
})(jQuery);

このイベントは、値を変更する入力イベントが発生した場合にのみトリガーされるため、不要なイベントは実行されません。

于 2015-04-01T10:09:44.803 に答える