質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

2回答

1362閲覧

jQueryの課題で助けて頂きたいことがあり、質問投稿させて頂きます

hyadain

総合スコア1

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

1クリップ

投稿2020/08/30 20:47

編集2020/08/30 20:48

前提・実現したいこと

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 での実現を希望です。

お手数をおかけして本当にすみませんが、宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miyabi_takatsuk

2020/08/31 00:47

jQueryを必ず使うという課題要件なのでしょうか? ネイティブじゃないと逆に苦しくなりそうな要件な気がします。 また、課題のようなので、答えの回答はできません。 考え方くらいしか回答できませんが、それでもよろしいのでしょうか?
guest

回答2

0

ベストアンサー

流れ的にはこんな感じでしょうか?

投稿2020/08/31 00:45

yambejp

総合スコア114843

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hyadain

2020/08/31 01:50

そんな感じです!やはりネックは➄の「常に全件表示」ですね。 そちらのcodepenですと「2」が入力されているときにクリックすると「2」しか表示ができず「全件」ではなくなってしまい、それが大変難しいところだと思います。
yambejp

2020/08/31 02:00 編集

そうなるとdatalistは無理ですね。 datalistは前方一致するので値が入っていると他のモノは見せることはできません。 どうせjsで処理するのですからセレクトボックスとかでもいいですか?
hyadain

2020/08/31 02:16

はい!セレクトボックスでも大丈夫です。ただ、 >selectでは「直に入力」がクリアできなくなってしまい、あちらを立てればこちらが立たず というところで行き詰っているので、もしもそれをクリアできそうなのでしたらぜひ、お願いしたく思っています。
yambejp

2020/08/31 02:39

サンプルを更新しました。確認してみてください
hyadain

2020/08/31 03:21

完ッッッ璧な動作です。メソッドチェーンだらけ…スゴすぎです。感動をありがとうございました。
yambejp

2020/08/31 03:24

ごめんなさい、multipleよりsize指定のほうが良さそうなで修正してあります
hyadain

2020/08/31 04:04

なるほどです。それならばcount_rowsが少ないときに余計な高さがなくなりますね。さっそくそのようにして、さらに $(function(){ const count_rows=30; var size = ( count_rows < 10 ) ? count_rows : 10; // 追加 のようにsize変数を追加して、 .attr({'size':size}) のようにアレンジして、count_rowsが多いときにも備えてみました。 最後までありがとうございました。
guest

0

➄クリックすると入力可能値が常に全件表示され、選択できる

がネックになっているようなので、
ここについて、考え方のみの回答とさせていただきます。

まず、datalist要素の仕様から考えていきましょう。
いわゆる、入力候補の表示が、主な仕様のように思えます。
つまり、
inputに値が入っている場合は、その値に付随する一覧が表示される仕様となっていますので、
値が入っている以上、全件表示はされません。

であるならば、
クリック時に値をクリアするようにすれば解決するかと思います。
つまり、値を直接入力する際は、クリックした瞬間だけ、input.value = "";とするわけです。
そうすれば、datalistの仕様として、全件表示ができるかと。
ただ、HTMLの仕様的にそれが適うかは、やってみないとわかりません。
もしかしたら、クリック時に、setTimeoutなどでタイムラグを作らないと、動作しない可能性もあります。

ヒント追記

クリックだと、挙動のタイミング的に、動作させるのは難しいようです。
なので、要素のフォーカスが重要になります。
(どの要素をフォーカスさせるかも大事)
なので、処理の中心をフォーカスさせた時何かをする、という考えでいくと、
構文を導けると思いますよ。

以上、HTML(datalist)の仕様から考えた、実装の仕方の方向性の一つです。
参考になれば幸いです。

投稿2020/08/31 01:07

編集2020/08/31 01:47
miyabi_takatsuk

総合スコア9528

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問