2011-11-11 9 views
0

そうですが、 オートコンプリートフィールドに入力する時間を検出し、1つのアイテムしか見つからない場合は自動選択

が素敵な作品

$(".autoItem").each(function() { 
     var id = $(this).attr("id"); 
     var itemNumber = id.replace('item', ''); 
     $(this).autocomplete({ 
      source: "jsonOut/products.aspx", 
      minLength: 2, 
      select: function (event, ui) { 
       $('#price' + itemNumber).val(ui.item.price); 
       $('#id' + itemNumber).val(ui.item.id); 
      } 
     }); 
    }); 

自動補完するために、単純なjQueryのコールを考えると、私はいつものように起因する私のアプリケーションにそれを複雑にする上で今の私。

これは、店舗での販売を行うウェブフォーム用です。テキストボックスには、次の2つの方法で入力できます。

A)通常通り入力します。
B)バーコードスキャナーでコードをスキャンする。

ケースAの場合はすべて正常ですが、オートコンプリートはオートコンプリートと同じように機能します。ケースBでは

しかし、私は2つの問題があります:コードは後ろの私のデータベースのバーコードフィールドを検索するために知っているように

  1. を私は、このエントリはスキャナからのものであることを検出できるようにする必要があります、アイテムタイトルではありません。明らかにブラウザはそのことを知らないので、私が考えることができる唯一の方法は、時間をかけて行うことです。スキャナは誰でも入力できるよりも速くフィールドにデータを入力します。

  2. 結果がバーコードでAutoCompleteによって生成されると、明らかに1つの結果しか返されないので、結果が1つしか返されない場合は、その結果を自動的に選択して、必要に応じて他のフィールドこのような

(スキャンした後、それはすぐにテキストフィールドに次のいずれかに上の移動をぼかすように、バーコードスキャナは、TABターミネータを持っている)

何かは可能?

誰かが孤立して問題を解決することができれば、それはクールです。私は点Bのためにhttps://github.com/scottgonzalez/jquery-ui-extensions/blob/master/autocomplete/jquery.ui.autocomplete.selectFirst.jsを見ましたが、それを動作させることができませんでした。

注:最悪が最悪の場合は、コードの後ろにisNumericを使用してスキャンされたエントリを検出することができますが、スキャンするコードの一部は数値ではありません。製品SKUから生成されたバーコードは、数値ではない可能性があります。

+0

なぜバーコード読み取り後にキャリッジリターン(Enterキーを押す)を送信するようにバーコードリーダーを設定しないのですか?それはすぐにフォームを提出し、AJAXオートコンプリートのものは無関係でなければなりません。 – Teddy

+0

フォームは送信準備が整っていない可能性があります。顧客名などのその他のデータを入力する必要があります。これは必ずしも単一の商品販売ではありません。 jQueryは、最初の販売アイテムの詳細フィールドが完成した後、次のアイテムフィールドを作成します。 –

+0

私の最初の印象は、ブラウザと入力フィールドに焦点が当てられているため、この[web page/app]はバーコードスキャンアプリの正しいアプローチではないと思います。 )。あなたのアプリはあなたの顧客に非常に固有でウェブサービスを構築しているので、ブラウザプラグインを作成してみることもできます。 –

答えて

1

jQueryUIオートコンプリートにdelayオプションを使用していますか? http://jqueryui.com/demos/autocomplete/#option-delay

これは人間と機械を分離し、人間のためだけにオートコンプリートを行う必要があります。それは単品販売をされていない限り


...

はJavaScriptを使用してバーコードフィールドのキャリッジリターンイベントをキャプチャしfalseを返すことで、フォームの送信を防ぎます。

+0

また、キャリッジリターンを防止する場合は、次のバーコード入力フィールドにフォーカスを移動してください。 – Teddy

+0

これはほとんどありません...私は、データベースから価格を引き出すために何かを提出して、フォームフィールドに入力する$( '#price' + itemNumber).val(ui.item.price);を実行する必要があることを除いては、フォーム提出後にそれを行うことができましたが、バーコードをスキャンする際に販売員が価格を入力するのに便利です。フォームをあまりにも早く提出しようとする試みがあったかどうかを検出する必要があります。これは価格を引き上げるために別のAJAX関数を呼び出すことになります。それはうまくいくだろうが、フィールドが速く埋められている場合、オートコンプリートによって返される最初の(唯一の)アイテムを強制的に選択するコードが少なくなるだろうと思うだろう。 –

+0

あなたはまだこの時点で立ち往生していますか?あるいは、あなたは十分な解決策を用意していますか? – Teddy

0

右...

は、私は自分の質問に答えるに熱心ではないんだけど、これを手伝ってくれましたみんな、本当にありがとうございました。私は私が必要とするものを正確に得られませんでしたが、いつものように正しい方向に私を指摘しました。

最後に本当にシンプルになった... focus()blur()と(すべての)種類の識別子を使って時間を過ごした後に!

@Teddyあなたのヒントと答えはかなりそれをしました。

バーコードリーダのデフォルトでは、スキャン直後に生成されるターミネータとしてキャリッジリターンが設定されています。私はそれがうまくいくかどうかわからなかったが、ブラウザは入力キー入力としてこれを拾うんので、私は行うことができます。@Teddyとして

$('.findProduct').live('keypress', function (e) { 
    var code = (e.keyCode ? e.keyCode : e.which); 
    if (code == 13) { 
     // call a load function to get details from bar code 
    }; 
}); 

$('.findProduct').live('focus', function() { findProduct() }); // findProduct is the AutoComplete function 

、あなたが言った、オートコンプリートの遅延機能は、このウォンを確保しますオートコンプリートには何の影響もありません。スキャナがEnterターミネータを送信するとすぐに、必要なデータをjQueryに呼び出すことができます。

ボックスに手動で入力するとき、オートコンプリートはそれを正常に行います。

アドバイスの次の部分は、オートコンプリートが完了した後にEnterキーを無効にして、混乱を避けるべきだと思いますか?同様に、オートコンプリート機能をいくつかの手段で無効にしていますか?

編集:フォームには送信ボタンがなく、送信可能なdivや画像などで送信されます。

関連する問題