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;
}
}
});
スクリプトがどの入力がどの非表示バージョンに属しているかを知るには、IDanswer
とanswer-hidden
通常の非表示入力が必要です。このようにinput
して、同じページに複数のを配置し、1つまたは複数datalist
のを提案することができます。
ユーザー入力はすべてそのまま送信されます。ユーザー入力がデータリストに存在しないときに空の値を送信するには、次のように変更hiddenInput.value = inputValue
します。hiddenInput.value = ""
実用的なjsFiddleの例:プレーンなjavascriptとjQuery
value=""
、value=""
宣言されている場合は常に、タグ内の文字列よりも優先されるべきであるようです。したがって、提案は「答え」をあなたの価値属性にすることです。