[解決済み] データリストのラベルを表示し、実際の値を送信する
質問
現在、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です。
1つを選択した後、入力は値で満たされ、内側のテキストではありません。私はユーザーにドロップダウンと入力のテキスト ("The answer") を見せたいだけで、値は渡します。
42
のように、送信時に
select
のようになります。
のラベル(内側のテキスト)がドロップダウンリストに表示されるようにするには、どのブラウザも
<option>
のラベルは表示されますが
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
. その値が hidden input に挿入され、送信されます。
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
を使うことができます。
datalist
が提案します。
任意のユーザー入力はそのまま送信されます。ユーザー入力がdatalistに存在しない場合に空の値を送信するには、以下のように変更します。
hiddenInput.value = inputValue
を
hiddenInput.value = ""
jsFiddleの動作例です。 プレーンなjavascript と jQuery
関連
-
[解決済み] セレクトボックスのプレースホルダーを作成するにはどうすればよいですか?
-
[解決済み] How can I set the default value for an HTML <select> element?
-
[解決済み] 入力テキストボックスの値を取得する
-
[解決済み] HTMLのチェックボックスのchecked属性の適切な値は何ですか?
-
[解決済み] HTML要素に対するブラウザのデフォルトCSS
-
[解決済み】WebKitとは何ですか、CSSとどのような関係があるのですか?
-
[解決済み] HTML5 の input type="text" と input type="search" の比較
-
[解決済み] なぜJavaScriptでは!{}[true]がtrueに評価されるのですか?
-
[解決済み] モバイルWeb HTML5フレームワークの選び方【終了しました
-
[解決済み] JavaScriptで文字列を数値に変換する最速の方法は何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 配列からオブジェクトを生成する
-
[解決済み] なぜ "use strict "はパフォーマンスを10倍向上させるのか?
-
[解決済み] WebStormで未解決の変数が大量にある場合の警告に対処する方法は?
-
[解決済み] JavaScriptでの大文字小文字を区別しない正規表現
-
[解決済み] jQueryの$という記号の意味は何ですか?
-
[解決済み] モデルフェッチ時に1をtrueに、0をfalseに変換する方法
-
[解決済み] イテレータでmap()を使用する
-
[解決済み] <ng-content>が空かどうかを確認する方法は?(これまでのAngular 2+で)
-
[解決済み] キャッチされない不変量違反。再レンダリング回数が多すぎる。React は無限ループを防ぐためにレンダリングの回数を制限している
-
[解決済み] javascriptオブジェクトの要素数