2012-03-19 4 views
1

私のオートコンプリートのソースにデータ属性を使用できますか?ソースにデータ属性を使用したオートコンプリート?

例えば

HTML

<input type="text" class="autocomplete" data-source="/search.php" /> 

Javascriptを

$(".autocomplete").autocomplete({ 
     source : $(this).data('source'), 
     minLength:1, 
     select: function(event, ui) { 
      console.log(ui.item ? 
       "Selected: " + ui.item.value + " aka " + ui.item.id : 
       "Nothing selected, input was " + this.value); 
     } 
    }); 

私はそれを試してみましたが、それはいつも私にエラーを与えます。 私のコードで何が問題になっていますか?

Uncaught TypeError: Property 'source' of object #<Object> is not a function

this
+0

を指しthis.elementを使用することができます。すべてのキーを押すとオートコンプリートウィジェットが再初期化されます。これは、中程度の使用の後でも、何百ものイベントリスナーが各 '.autocomplete'要素に追加されることを意味します。別のソリューションを使用することを強くお勧めします。 (おそらく、以下に挙げた3つのうちの1つ) – Xavi

+0

それを修正した場合は、_answer_と書いてください。答えは質問には出ません。 –

答えて

5

がここに修正

$('.autocomplete').keypress(function(){ 
    $(this).autocomplete({ 
     source: $(this).data('source'), 
     minLength: 1, 
     select: function(event, ui) { 
      console.log(ui.item ? "Selected: " + ui.item.value + " aka " + ui.item.id : "Nothing selected, input was " + this.value); 
     } 
    }); 
}); 

だ、それは現在の要素を取得するように、私は、キー押下機能を追加しました。

+0

大きな解決策は、これを行う方法を常に疑問に思っていました。個人的に私はあなたがキーを押すたびに(おそらく)オートコンプリート全体がリバウンドするように。 –

+1

これは、そのボックスでキーが押されるたびにオートコンプリートコントロールをインスタンス化するので、非常に悪いことです。 '$( '。autocomplete').data(' source ') 'を個別に取得して、それをオートコンプリート呼び出しに渡すことができます。 – Milimetric

1

ポインタが.autocomplete要素を参照していない - thisのみのjQueryによって実行コールバックの内部に選択された要素と等しいです。

$(".autocomplete") 
    .autocomplete({ 
     minLength:1, 
     select: function(event, ui) { 
      console.log(ui.item ? 
       "Selected: " + ui.item.value + " aka " + ui.item.id : 
       "Nothing selected, input was " + this.value); 
     } 
    }) 
    .each(function() { // Goes through `.autocomplete` elements and sets source 
     $(this).autocomplete("option", "source", $(this).data('source')); 
    }) 
; 
+0

は動作しますが、ソースのすべての戻り値を取得します。 – rjmcb

+2

私はあなたが何を意味するかを100%確信していませんが、サーバー側の問題のように聞こえます。サーバー側のコードで、 'term'というURLクエリパラメータの値でリストをフィルタリングしていることを確認してください。 – Xavi

1

ソースがURLの場合、すべてのオートコンプリートキーストロークでリモートリクエストがトリガーされます。データを「プリフェッチ」する(JSONの有効な配列を返すようにしてください)ことを防ぐためにできることは何ですか?そして、戻りデータをオートコンプリートのソースとして追加してください。そうすれば、データは一度だけ取り出され、オートコンプリートはそのデータを参照します。

jQueryオートコンプリートにはすでにフィルタリング機能があります。あなたはアイテムの完全なリストを必要とし、あなたのためにそれをフィルタリングします。

//get all input boxes with class "autocomplete" 
$('.autocomplete').each(function(){ 

    //reference input and get it's url 
    var input = $(this); 
    var url = input.data('source'); 

    //get list array only ONCE for each input using their specified urls 
    $.get(url, function(data) { 

     //when request is received, add autocomplete using the returned data 
     input.autocomplete({ 
      source: data, 
      minLength: 1, 
      select: function(event, ui) { 
       console.log(ui.item ? "Selected: " + ui.item.value + " aka " + ui.item.id : "Nothing selected, input was " + this.value); 
      } 
     }); 
    }); 
}); 
+0

ありがとうが、私は多くのオートコンプリート要素を持っています。 最初の要素のデータソースのみを取得します。すべての '.autocomplete'入力を見つけるために – rjmcb

+0

が更新されました。 – Joseph

7

ソースでは、これは良い解決策ではありません入力

$(".autocomplete").autocomplete({ 
    source : this.element.attr('data-source'), 
    minLength:1, 
    select: function(event, ui) { 
    console.log(ui.item ? 
      "Selected: " + ui.item.value + " aka " + ui.item.id : 
      "Nothing selected, input was " + this.value); 
    } 
}); 
+0

良い答え。ニースとシンプル:-) –

+0

私の文脈では、 'this'はwindow要素を参照しているので、この解決法は機能しません。私は、.autocompleteクラスを参照せずにデータソースを参照しないようにしたい。 – gitb

関連する問題