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

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

ただいまの
回答率

90.01%

if文で文字数を取得するには

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 503

rYdrMKc

score 16

勉強しはじめの初心者です。
文字数カウントのJavascriptを作ったのですが、その下にチェックボタンを置いて、10文字以下ならアラートでOK11文字以上ならNGと表示させたいのですが、うまく分岐ができません。
アラート部分で文字数を拾えていないようなのですが、原因がわかりません。なにかヒントを頂けないでしょうか?
よろしくお願い致します。

<!DOCTYPE html>
<html lang="ja" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>文字数カウンター</title>
  </head>
  <body>
    <h1>文字数カウンター</h1>
    <textarea id="input_text" rows="5" cols="50"></textarea>
    <p id="character_count_wrap">残り<span id="character_count">0</span>文字です</p>
    <input id="btn" type="button" value="チェック">

    <script src="character_counter.js"></script>
  </body>
</html>
(function(){ // 即時関数
  'use strict'; //strictモード(厳格モード)

  // id input_textのエレメントを取得
  var e = document.getElementById('input_text');
  // 初期値をセット
  document.getElementById('character_count').innerHTML = 10;

  // keyupのイベント発生時に、入力文字数をコンソールに出力
  e.addEventListener('keyup', function() {
    // console.log(e.value);
    // console.log(e.value.length);

    // テキストエリアの文字列を変数に代入
    var str = e.value;
    //改行の削除
    str = str.replace(/\r?\n/g, '');
    // 文字数の表示
    // console.log(str.length);

    var remaining = 10 - str.length;
    document.getElementById('character_count').innerHTML = remaining;

    if(remaining >= 0) {
      document.getElementById('character_count_wrap').style.color = 'black';
    } else {
      document.getElementById('character_count_wrap').style.color = 'red';
    }
  });



})();
// ボタンをクリックした時に文字数が上限を超えていたらアラート
var btn = document.getElementById('btn');
var getNum = document.getElementById('character_count');

btn.addEventListener('click', function(){
  console.log(getNum.innerHTML);

  if(getNum.innerHTML <= 10) {
    alert('OK' + getNum.innerHTML);
  } else {
    alert('NG' + getNum.innerHTML);
  }
})
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • FKM

    2019/03/08 20:22

    str.lengthの値は毎回加算されていってるのでしょうか?
    console.log(str.length)を使って、ブラウザの開発画面で確認してみてください。

    キャンセル

  • papinianus

    2019/03/08 20:36

    この2つを組み合わせて確認しましたが、おそらく意図通り動作しています(アラートが出ます)
    keyupでの文字数表示は動いていて、ボタンアラートだけ動かないということでしょうか?
    また、これ以外にもコードはあって、必要部分だけ抜いているのですよね?idや変数名に重複がないか見ていただけますか?

    キャンセル

  • rYdrMKc

    2019/03/11 12:20

    ご連絡が遅くなってしまい申し訳ございません。
    ボタンアラートだけが意図しない動作になっています。

    inputフォームに文字を入力すると、フォーム下にリアルタイムでカウントされていき、10文字以上になるとマイナス表記になります。
    同じ様に、ボタンアラートでinputフォームの入力文字数が10文字以内の場合は「OK」、10文字を超えている場合は「NG」とアラートで表示させたいのです。
    しかし質問文で貼り付けたソースですと、10文字を超えてもアラートは「OK」と表示されてしまいます。

    キャンセル

回答 1

checkベストアンサー

+1

質問者の意図と異なる値が返されているのが原因です。
getNumには入力文字数ではなく、残り入力できる文字数が返っています。

ですが、if文は10文字未満かという制御しかされていませんね。なので、0文字以上という制御を付けないとif文の判定でtrueを返します。

【エラーの原因について】
スクリプトの記述がひょっとして、htmlを読み出す前じゃないでしょうか?
そうだとするとinnerHTMLプロパティはセレクタが読み取れないのでnullを返してしまうエラーとなり、何も動きません。

なので、htmlより後にそのスクリプトを記述する必要がありますね(そうすると、システムはちゃんと動きました)

補足
javascriptはどこに記述してもいいのではなく、記述した位置によって読み込む順番が変わるので、ロード時にhtmlからセレクタの要素を取得、操作したりする場合は必ずhtmlより後に記述するか、bodyタグにonLoadイベントなどを与えるかする必要があります。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/11 12:47

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

    キャンセル

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

  • ただいまの回答率 90.01%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる