前提・実現したいこと
jQueryで以下の条件をクリアする、完璧な入力ボックス(数値のみ)を作りたいです。
➀読み込み時のデフォルト値は「1」になる
➁前後ボタンでカウントアップ|ダウンできる
➂「1」から「指定の最大値($count_rows)」までの入力可能値が、直に入力できる
➃もし「指定の最大値」を超える値が直に入力されたら「指定の最大値」になる
➄クリックすると入力可能値が常に全件表示され、選択できる
発生している問題・エラーメッセージ
すべての条件を同時にクリアできません。
特に「直に入力できつつ(➂)、セレクトボックスのように選択肢が常に全件表示される(➄)」というのがとても難しいです。
該当のソースコード
対象となるのはこちらのHTML、CSSになります。
html
1<div class="pagenation"> 2 <button type="button" class="pagenation_btn" data-type="prev" id="pagenation_prev"></button> 3 <div class="pagenation_list"> 4 <input list="pagenation_select" value="1"> 5 <datalist id="pagenation_select"> 6 <!-- 7 この選択肢は以下PHPで出力されます 8 <?php 9 $count_rows = 4; // データベースのレコード数を取得(ここでは4件とする) 10 for($i=1; $i<=$count_rows; $i++){ 11 echo "<option value='{$i}'</option>"; 12 } 13 ?> 14 --> 15 <option value="1"></option> 16 <option value="2"></option> 17 <option value="3"></option> 18 <option value="4"></option> 19 </datalist> 20 </div> 21 <button type="button" class="pagenation_btn" data-type="next" id="pagenation_next"></button> 22</div>
CSS
1/* 全体 */ 2.pagenation { 3 display: flex; 4 align-items: center; 5} 6 7/* 入力ボックス */ 8.pagenation input { 9 width: 50px; 10 height: 30px; 11 margin: 0 10px; 12 border-radius: 10px; 13 text-align: center; 14} 15 16/* 前後ボタン */ 17#pagenation_prev, 18#pagenation_next { 19 border-top: solid 4px #5bc8ac; 20 border-right: solid 4px #5bc8ac; 21 width: 20px; 22 height: 20px; 23} 24#pagenation_prev { 25 transform: rotate(-135deg); 26} 27#pagenation_next { 28 transform: rotate(45deg); 29} 30 31/* CSSリセット */ 32button { 33 background: none; 34 border: none; 35 cursor: pointer; 36}
試したこと
この2日間苦労して、大体の機能は作れたと思います。
ですが下記jQueryの最後の行でコメントしてありますように、➄の条件について、「常に全件表示」の方法がわかりません。
jQuery
1/* 2➀読み込み時のデフォルト値は1 3---------------------------------------------------------------------------*/ 4// この機能はHTMLのvalueで実現 5 6/* 7➁前後ボタンでカウントアップ|ダウン 8---------------------------------------------------------------------------*/ 9$(document).on('click','.pagenation_btn', function(ev){ 10 const type = $(this).attr('data-type'); 11 const current_val = parseInt( $('.pagenation_list input').val() ); 12 const after_val = type === 'prev' ? current_val+1 : current_val-1; 13 $('.pagenation_list input').val(after_val); 14}); 15 16/* 17➂「1」から「指定の最大値($count_rows)」までの入力可能値が、直に入力できる 18---------------------------------------------------------------------------*/ 19// この機能はHTMLでdatalistを用いることで実現 20 21/* 22➃もし「指定の最大値」を超える値が入力されたら「指定の最大値」になる 23---------------------------------------------------------------------------*/ 24$(document).on('change','.pagenation_list input', function(ev){ 25 const current_val = parseInt( $('.pagenation_list input').val() ); 26 const max_val = $('#pagenation_select option:last').val(); 27 if ( current_val >= max_val ) { 28 $('.pagenation_list input').val(max_val); 29 } 30}); 31 32/* 33➄クリックすると入力可能値が常に全件表示され、選択できる 34---------------------------------------------------------------------------*/ 35// この機能はHTMLでdatalistを用いることで実現… 36// しようとしたが、「常に全件」にはならず行き詰った
datalistを用いたのがまずかったのでしょうか。しかしただのselectでは「直に入力」がクリアできなくなってしまい、あちらを立てればこちらが立たずな状態で、完全に行き詰りました。
補足情報(FW/ツールのバージョンなど)
上記HTML、CSS、jQueryはすべて大きく変えてしまっても構いません。(選択肢はoptionタグじゃなくても大丈夫です。)
最新版の、jQuery3.4.1 での実現を希望です。
お手数をおかけして本当にすみませんが、宜しくお願い致します。
回答2件
あなたの回答
tips
プレビュー