🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
jQuery

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

HTML

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

Q&A

解決済

3回答

2299閲覧

インプットに入力された文字数を合計したい

sense6n23rp

総合スコア14

jQuery

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

HTML

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

0グッド

1クリップ

投稿2019/10/09 14:26

インプットに入力された文字数を合計したいです。
インプットには追加ボタンがありinput自体を追加していき各インプットの文字数を合計して
全てのインプットの文字数をリアルタイムで合計したいです。

一応下記のような形で各インプットの文字数は取得できているのですが
それを合計して<span class="all_txt"></span>へ出力する方法がわかりません。
(必要なのは合計数なので各インプット別の文字数は取得しなくても問題ないです)

html

1<span class="all_txt">合計:0 文字</span> 2 3<div class="hash"> 4<p class="add_area"><button type="button" class="add_hash_btn">追加</button></p> 5<div class="hash_set_template"><div><input type="text"><span>各0</span></div></div> 6</div>

jquery

1 $('.add_hash_btn').click(function (e) { 2 e.preventDefault(); 3 var html = $('.hash_set_template').html(); 4 var hash_set_t = $.parseHTML(html); 5 var append = $(this).parent('.add_area'); 6 append.before(hash_set_t); 7 }); 8 9$(document).on("keyup change",".hash input",function(){ 10 $(this).each(function(){ 11 var count = $(this).val().length; 12 $(this).next("span").text(count) 13 }) 14});

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

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

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

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

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

guest

回答3

0

こんにちは

ご質問に

(必要なのは合計数なので各インプット別の文字数は取得しなくても問題ないです)

とあったので、HTMLを以下のように修正して、各 input の文字数を表示しないようにしました。

html

1<span class="all_txt">合計:0 文字</span> 2 3<div class="hash"> 4 <p class="add_area"><button type="button" class="add_hash_btn">追加</button></p> 5 <div class="hash_set_template"><div><input type="text"></div></div> 6</div>

JS では、各 input の value の長さを合計して、.all_txt のテキストを変更する関数を追加して、これをkeyupinput のハンドラに設定するように修正します。

javascript

1const updateTotal = () => { 2 const total = $('.hash > div > input') 3 .toArray() 4 .reduce((sum, e) => sum + e.value.length, 0); 5 6 $('.all_txt').text(`合計: ${total} 文字`); 7} 8 9$(document).on("keyup change", ".hash input", updateTotal);

以上、参考になれば幸いです。

投稿2019/10/09 17:17

編集2019/10/09 17:31
jun68ykt

総合スコア9058

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

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

kyoya0819

2019/10/09 22:42

横槍すみません。 サンプル拝見させていただきましたが、既表のボックスの文字数が計算されていません。
sense6n23rp

2019/10/09 22:46

ありがとうございます できました。
jun68ykt

2019/10/10 01:52

@ense6n23rpさん どういたしまして。 > できました。 とのことで、よかったです。 @asuchi0819さん 当方の拙いサンプルをご覧頂き、ありがとうございます。 確認ですが、コメントにある > 既表のボックス とは、どの要素のことでしょうか?
kyoya0819

2019/10/10 02:04

<input type="text"><span>各0</span>という要素を指しています。 ページ表示時に初期表示のinputボックスのことです。
jun68ykt

2019/10/13 12:02 編集

@asuchi0819さん ご指摘の意味を理解できたので返答します。 > ページ表示時に初期表示のinputボックス に入力されたテキストも、文字数合計時に含めるのかどうかについては、私も回答時に検討しました。 したがって、回答に挙げているコード https://codepen.io/jun68ykt/pen/rNNVZWB?editors=1010 において、文字数をカウントする対象となる input を指定するために、 $('.hash > div > input') としている部分も、当初は単に $('input') としていましたが、検討の結果 > ページ表示時に初期表示のinputボックス は、文字数合計には含めないようにするために $('.hash > div > input') のほうを採用しました。 その検討の内容は以下です。 > ページ表示時に初期表示のinputボックス は、以下のように <div class="hash_set_template"><div><input type="text"><span>各0</span></div></div> という <div> に囲まれていますが、一番外側の <div> の class が hash_set_template となっています。このクラス名はアンダースコアで hash, set, template という3つの英単語が連結されて構成されていますが、最後の template という英単語を私の手元にあるオックスフォード現代英英辞典でひくと、以下のようになっていました。 1. a shape cut of a hard material, used as a model for producing exactly the same shape many times in another material 2. a thing that is used as a model for producing other similar examples 上記をふまえ、日本語だと template は多くの場合、 "ひな形" と和訳されますが、質問者の sense6n23rpさんが、この、末尾が " _template" であるクラス名をつけた意図としては、 <div class="hash_set_template"><div><input type="text"><span>各0</span></div></div> に囲まれている input はひな形で、「追加」がクリックされたときのコピー元として使うだけで、入力フィールドとして実際に使うのはコピーによって作られた input のほうだけ、という意味合いが込められているものと勘案し、そのために単に $('input') とするか $('.hash > div > input') とするかを考えた際に、よりhash_set_template というクラス名の意図に沿った後者とした次第です。 上記のような経緯によって、 > ページ表示時に初期表示のinputボックス は文字数のカウントから、意図して外したということをご理解頂けましたら、幸甚に存じます。
kyoya0819

2019/10/13 12:06

了解しました。 お手数おかけしました。
guest

0

テキストボックス個々にIDを振って、入力時に全ての値を結合し文字数を計測する方法が単純でいい気がします。

投稿2019/10/09 15:55

編集2019/10/09 15:56
kyoya0819

総合スコア10429

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

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

0

ベストアンサー

js

1$( document ).on( "keyup change", ".hash input", function() { 2 // $( this ).each( function() { // ← 特に意味がないので削除 3 var count = $( this ).val().length; 4 $( this ).next( "span" ).text( count ); 5 // } ); // ← 〃 6 var total = 0; 7 $( ".hash input" ).each( function() { 8 total += $( this ).val().length; 9 } ); 10 $( ".all_txt" ).html( "合計:" + total + " 文字" ); 11} ); // 未テスト

投稿2019/10/09 17:10

kei344

総合スコア69596

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

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

miyabi_takatsuk

2019/10/09 17:31

横槍すみません。 documentにキーイベント入れるスマートさに惚れ惚れしました。 さすがです・・・。
sense6n23rp

2019/10/09 22:48

ありがとうございます。 整形したところ(//を消しました)こちらが単純で分かりやすかったので助かりました
sense6n23rp

2019/10/09 23:07 編集

ただ文字数の計算を半角全角で分ける必要が出てきてしまして $(document).on("keyup change",".hash input",function(){ var o = $(this); var str = o.val(); var r = 0; for (var i = 0; i < str.length; ++i) { var c = str.charCodeAt(i); if (c >= 0x0 && c <= 0x7f) { r += 1; } else { r += 2; } } var all = r/2 var total = 0; $( ".hash input" ).each( function() { total += all } ) $( ".all_txt" ).text(total); }); としたのですが足された数値がおかしくなってしました。
sense6n23rp

2019/10/09 23:07

たびたびすいません。 追加したinputをremove()した場合に入力してあった文字数を合計から引く場合はどうしたらよいでしょうか?
kei344

2019/10/10 02:02

To: miyabi_takatsukさん 質問文にあったものですよ。 To: sense6n23rpさん > 数値がおかしくなってしました。 「文字を数える処理」を関数化しましょう。 $( document ).on(/*略*/); function moji( text ) { var count = 0; // 文字を数える処理 return count; } 上記のように関数を用意して、 var count = $( this ).val().length; を var count = moji( $( this ).val() ); に、 total += $( this ).val().length; を total += moji( $( this ).val() ); にすれば(文字を数える処理に問題がなければ)できると思います。
kei344

2019/10/10 02:04

To: sense6n23rpさん > inputをremove()した場合 削除する処理の最後に下記を追加。 $( document ).trigger( "keyup" ); 【.trigger() | jQuery API Documentation】 https://api.jquery.com/trigger/
miyabi_takatsuk

2019/10/10 02:58

kei344さん>大変失礼しました。 sense6n23rpさん>すばらしい構文だと思いました。非常に勉強になりました!
sense6n23rp

2019/10/10 07:59

色々とやってみたのですが詰まってしまいました 別の質問で再度立てますね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問