私はあなたが探している情報を入手する方法を見つけましたが、それが最善の方法でも唯一の方法でもないことを願っています。
$(this).autocomplete({
select: function(event, ui){
// blah
},
open: function(event, ui) {
console.log($(this).next().next().children());
}
});
オープンイベントは、「提案メニューが開かれたとき、または更新されたときにトリガーされます」です。<input>
その時点で、オートコンプリートウィジェットは、オートコンプリートがアタッチされた直後に選択するための独自のクリックリスナーを持つdom要素を作成しました。<span>
( createdもあるので、 .next()
2回呼び出します。)しかし、open関数のそのコード行は、内部で作成される<li>
子ノードのリストを返します。<ul>
あなたの例と一致すると<li>
、次のHTMLマークアップの要素のjQueryコレクションを取得します。
<li class="ui-menu-item" role="presentation">
<a id="ui-id-0" class="ui-corner-all" tabindex="-1">apple</a>
</li>
<li class="ui-menu-item" role="presentation">
<a id="ui-id-1" class="ui-corner-all" tabindex="-1">pear</a>
</li>
<li class="ui-menu-item" role="presentation">
<a id="ui-id-2" class="ui-corner-all" tabindex="-1">orange</a>
</li>
重要な注意:ここでのid
タグは、要素の数値インデックスではありません。代わりに、元のソースの要素の絶対IDです。そのため、それらがシーケンシャルであるという保証はありません。例として、元のソースが実際にこれである場合、結果のデータ["apple", "banana", "pear", "starfruit", "grape", "orange"]
のタグのIDは、<a>
実際にはapple:ui-id-0
、pear:ui-id-2
、orange:になりui-id-5
ます。このIDを信頼して、ユーザーがリストでクリックしたアイテムの順序を指定することはできません。これは、結果セットに対してではなく、ソースに対して絶対的なものであるためです。
(私は元々、リストに1から始まるIDを持っていましたが、ホーガンが指摘しているように、それらは0から始まります。)
その時点で、残りの方法を実行するために2つのことのいずれかを実行できます。select
1つ目は、コレクション(rawまたはオブジェクト形式のように変換された)を、イベントコールバックのスコープ内にある変数に格納することです。リストを次のようなオブジェクトに変換することをお勧めします。
lastResultSet = {
apple : 1,
pear : 2,
orange : 3
}
次に、.select
コードはこれを行うことができます。
var selectedIndex = lastResultSet[$(this).val(ui.item.value)];
もう1つのアプローチは.click
、dom要素に独自のコールバックを設定<li><a>
して、その時点でインデックスをキャプチャすることです。<li>
オートコンプリートによってdom要素が破棄される前に、クリックハンドラーをバインド解除して破棄しないことで、オートコンプリートの動作を簡単に妨害したり、メモリリークを引き起こしたりする可能性があるため、これはお勧めしません。
とにかく、 jQuery UIフォーラムまたはIRCサポートチャネルでこれと同じ質問をすることをお勧めします。うまくいけば、Dom要素の暗黙の順序にそれほどひどく依存しない答えを誰かが得ることができます。