現在、HTML5 <datalist>
要素は、ほとんどの主要なブラウザー(Safariを除く)でサポートされており、入力に提案を追加する興味深い方法のようです。
ただし、value
属性の実装と<option>
の内部テキストとの間に矛盾があるようです。例えば:
<input list="answers" name="answer">
<datalist id="answers">
<option value="42">The answer</option>
</datalist>
これは、ブラウザごとに異なる方法で処理されます。
ChromeとOpera:
FireFoxおよびIE 11:
いずれかを選択すると、入力には内部テキストではなく値が入力されます。ユーザーにドロップダウンと入力にテキスト( "The answer")のみを表示したいのですが、送信時にselect
のように値42
を渡します。
すべてのブラウザで<option>
sのラベル(内部テキスト)をドロップダウンリストに表示し、フォームの送信時にvalue
属性を送信するにはどうすればよいですか?
datalist
はselect
と同じではないことに注意してください。ユーザーはリストにないカスタム値を入力できます。また、最初に定義しない限り、そのような入力の代替値を取得することはできません。
ユーザー入力を処理する方法としては、入力された値をそのまま送信するか、空の値を送信するか、送信を禁止します。この回答は、最初の2つのオプションのみを処理します。
ユーザー入力を完全に禁止する場合は、select
を選択することをお勧めします。
ドロップダウンでoption
のテキスト値のみを表示するには、内部テキストを使用してvalue
属性を省略します。送信する実際の値は、カスタムdata-value
属性に保存されます。
このdata-value
を送信するには、<input type="hidden">
を使用する必要があります。この場合、通常の入力のname="answer"
を省略し、非表示のコピーに移動します。
<input list="suggestionList" id="answerInput">
<datalist id="suggestionList">
<option data-value="42">The answer</option>
</datalist>
<input type="hidden" name="answer" id="answerInput-hidden">
このように、元の入力のテキストが変更された場合、javascriptを使用して、テキストがdatalist
にも存在するかどうかを確認し、data-value
をフェッチできます。その値は非表示の入力に挿入され、送信されます。
document.querySelector('input[list]').addEventListener('input', function(e) {
var input = e.target,
list = input.getAttribute('list'),
options = document.querySelectorAll('#' + list + ' option'),
hiddenInput = document.getElementById(input.getAttribute('id') + '-hidden'),
inputValue = input.value;
hiddenInput.value = inputValue;
for(var i = 0; i < options.length; i++) {
var option = options[i];
if(option.innerText === inputValue) {
hiddenInput.value = option.getAttribute('data-value');
break;
}
}
});
スクリプトがどの入力がどの非表示バージョンに属しているかを知るには、通常および非表示の入力のID answer
およびanswer-hidden
が必要です。この方法では、複数のinput
を同じページに配置して、1つ以上のdatalist
で候補を提供できます。
ユーザー入力はそのまま送信されます。ユーザー入力がデータリストにないときに空の値を送信するには、hiddenInput.value = label
をhiddenInput.value = ""
に変更します
動作するjsFiddleの例: plain javascript および jQuery
私が使用するソリューションは次のとおりです。
<input list="answers" id="answer">
<datalist id="answers">
<option data-value="42" value="The answer">
</datalist>
次に、次のようなJavaScriptを使用して、サーバーに送信される値にアクセスします。
var shownVal = document.getElementById("answer").value;
var value2send = document.querySelector("#answers option[value='"+shownVal+"']").dataset.value;
それが役に立てば幸い。
検索用のボタンをクリックすると、ループなしで検索できます。
必要な値(id
など)を持つ属性をオプションに追加し、特定の属性を検索します。
$('#search_wrapper button').on('click', function(){
console.log($('option[value="'+
$('#autocomplete_input').val() +'"]').data('value'));
})