質問: len; } | | | | --- | --- | | 行別カウンター | * 1行目: 0.0 / 35 * 2行目: 0.0 / 35 * 3行目: 0.0 / 35 |
回答: ano1です。 う~~~ん・・・ ・・とりあえず、 >usenum = str.split(/\r\n|\r|\n/);//これが機能していない感じ 直後にusenumの内容を調べてみれば、きちんと機能していることがわかると思います。 usenum(=配列)には改行で分割された1行ずつの文字列が取得できます。 通常は、str.split("\n") でも大丈夫だと思いますが、正規表現でもちゃんと動作します。 しかしながら、そのあとの文字チェックのループではもとの全文(str)を対象にループさせているので、なんのために1行ずつに分けたのわかりませんね。 さらには、そのループの中で >var usenum = new array(); >usenum.push(len); としているので、変数宣言に関しては巻き上げられますが、usenum = new array()の部分は実行されます。 結局、1文字チェックする毎にusenumを初期化して、それに変数lenをpushしていることになります。 そのあとで、(多分デバッグ用に?) >console.log(usenum); となさっていますが、usenumの値は予定通りの内容になっていますか? この結果、最初に1行ずつに分けたusenumの内容はすぐに破棄されるので、意味のない処理をしていることになりませんか? >showlength.innerhtml = len.tofixed(1); showlengthは実行中の関数名のはずですが、関数のinnerhtml属性にlen.tofixedの値を代入してどうしようというお考えでしょうか? (javascriptでは関数もオブジェクトなので、処理自体はエラーにはなりませんが...) >~~~.innerhtml = usenum[0]; >~~~.innerhtml = usenum[1]; ループの計算でusenumは初期化されているので、1要素の配列になっているはずです。 また、この値は最後にチェックしたlenの値が入っているはずですが、これを表示したいわけではないと思いますが? さらに、usenum[1]、 usenum[2]は存在しないので、常にundefinedが出力されるものと想像します。 その他に、 >str = str.replace(/\r\n|\n|\r/g, "");//改行削除 ループ内で毎回処理をしていますが、1度行えばよい処理のはずですので、効率を考えればループの外で処理すべきではないでしょうか? というよりも、本来なら >usenum = str.split(/\r\n|\r|\n/) ですでに改行は取り除かれている文字列を処理するはずなので、不要な処理とも言えます。 htmlを見てみると、table表示にしていますが、1行2セルのみの構成で、ほとんどの内容が後のセル内にありますが、tableにする意味があるのか疑問です。 などなど、他にもありそうですが・・・ 1行ずつ分割したなら、その各行に対して「質問者様がなさりたい文字数計算」を行って、結果をそれぞれの表示用要素に表示するようになさりたいのではないでしょうか? 処理の流れを、もう一度きちんと整理なさってからスクリプトを記述なさった方が良いかもしれません。 また、前回も指摘しましたが、3行決め打ちのスクリプトにしてしまうと、1行しかない時や4行以上ある時に予想外の結果となることがありますので、注意なさった方がよさそうに思います。 なんとなく、なさりたいことが見えてきましたので、似たようなものを作成してみました。 と言っても、全体的に構成をだいぶ変えてしまいましたので、あくまでもご参考としてのものです。 3行までを限定として処理しています。(4行目以降は、存在しても無視) なお、(どこかに書いてあったように思いますが)スペースの削除はしていません。 sample h4 { display: inline-block; } span.length { margin: 0 0.5em; } #countwrap { margin-left: 6em; } #### 行別カウンター * 1行目:0.0/ 35 * 2行目:0.0/ 35 * 3行目:0.0/ 35 function c(c, c1, c2){ return c >= c1 && c < c2; } function codecheck(c){ return c(c,0x0,0x81) || c(c,0xff61,0xffa0) || c(c,0xf8f1,0xf8f4) || (c==0xf8f0); } function countlength(s){ var i, len = 0; for (i=0; i