- ベストアンサー
テキストエリアでの行数を調べる
<script language="JavaScript"><!-- function check() { txt = document.myFORM.myTEXT.value; n = txt.match(/\r/g); if (n) len = n.length + 1; else len = 1; alert(len+"行です"); } // --></script> <form name="myFORM"> <textarea rows="3" name="myTEXT"></textarea> <input type="button" value="Check" onClick="check()"> </form> これで調べられると書いてあったのですがページエラーが出てしまいます 『n = txt.match(/\r/g);』の部分 ○UNIXの改行コードは0x0Aの1バイト(正規表現では\n)となります とあったので『n = txt.match(/\n/g);』として試してみたのですがこちらでもページエラーが出てしまいます ○『n = txt.match(/\r/g);』を『n = 2;』などのようにしたら alertはでるのですが『Nan行です』と表示されます サンプル紹介されているサイトでは改行3回だと『4行です』のように表示されるのですが自分でCGIファイルに組み込んでみると表示されません(><) どうしてかお分かりになる方いらっしゃいますでしょうか?
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>ANo.5回答 CGIスクリプト(アプリケーション)に問題があります。 \はエスケープコードです。 エスケープコードを「表示」したい場合は、それをエスケープさせて、「エスケープコードとして認識させない処理」が必要です。 詳しくはCGIに使用している言語と「エスケープ」または「エスケープコード」で検索してみてください。 「エスケープシーケンス」で調べてもいいかも知れません。 > ANo.3 回答 > ページを表示するときに『'/'がありません』が なるほど、たしかにこのエラーになりますね。 > javascriptの構文チェックする方法ってあるのでしょうか? 基本的にはブラウザのエラーメッセージを参考にします。 IEは1行でごく簡単なメッセージしか表示出来ませんが、 OperaのコンソールやFirefoxのエラーコンソールや、FireBugというアドオン(プラグイン)では、より詳しいメッセージが表示されますので、 私はこれらを使うことの方が多いです。 CGIから出力する場合は > ANo.5 > CGIスクリプトのソースの内容と異なることがあります。(特にCGIスクリプトで動的に生成している場合) と書いているとおり、あらかじめ動作確認済みのスクリプトとCGIスクリプトから出力したコードの差違を直せば 余程のことがない限り動作します。
その他の回答 (5)
- 神崎 渉瑠(@taloo)
- ベストアンサー率44% (1016/2280)
> n = txt.match(/\r/g); この部分を、 n='\r'; にしたときにも同じエラーメッセージが表示されますか? 同じメッセージが表示されるなら、n = txt.match(/\r/g);これに問題があり、エラーメッセージが変われば別の場所に問題があります。 私が試したのは、UTF-8で記述し、ブラウザの文字コードShift_JISで表示したときにエラーが出ました。 これは、UTF-8の"す"の3バイト目が0x99ですから、 Shift_JISではエスケープコードとして処理されるため、「"行です"」の2つ目の"がエスケープされていることが原因です。 > 参考にしたサイトに改めて訪れてみたところhtmlファイルで作ってあるみたいなのですがcgiファイルだと無理なのですかね~~(@@;) CGIは関係ありません。 ブラウザで表示して、ブラウザの「ソースを表示」で確認してください。 それが、ブラウザが実行しているJavaScriptです。 CGIスクリプトのソースの内容と異なることがあります。(特にCGIスクリプトで動的に生成している場合)
お礼
お世話になります >『n='\r';』にしたときにも同じエラーメッセージが表示されますか? メッセージは変わりました(><) 『変更前』:14行16文字 '/'がありません 『変更後』:14行4文字 終了していない文字列型の定数です となりました >ブラウザの「ソースを表示」で確認してください。 確認してみたところ・・・ n = txt.match(/\r/g); の部分が n = txt.match(/ /g); となってました(--;) 『n='\r';』だと n=' '; これが原因ですかね?ソース表示した場合丁度14行目と15行目になりますので・・・
- hkd9001
- ベストアンサー率48% (99/204)
レスありがとうございました。 うん、解決への道が な~んとなく うっすらと見えて来ましたねぇ… というわけで、もうすこし私の「おたずね」に お付き合いくださいまし。 (スミマセン[汗]) さて、まずお答えから。 (1)『セキュリティー保護のため…で制御されています』と出ているということですが、これはエラーではありません。今回のような、自PCで、自作のhtmlファイルを開く場合は この黄色いバーをクリック→「ブロックされているコンテンツを許可」をクリック→「アティブコンテンツを実行しますか?」で「はい」をクリック でOKです。 ここからは おたずね です。 (2)「</textarea>を加えてやってみたのですがやはりダメ」ということですが、具体的にどういうエラーになったのでしょうか(表示されたエラーメッセージは何)? (3)「…test.htmlでは作動するみたいなのですがtest.cgiではエラー」ということですが、これは「ご質問に有った JavaScript コードを、本来使いたい cgi スクリプトの中へ組み込んだ」のでしょうか、それとも「ファイル名を test.html から test.cgi に変更しただけ」なのでしょうか? お手数ですが、よろしくお願いいたします。
お礼
お世話になります (2)ページ全体にエラーが表示されるのではなく下のステータスバー(?)(名前が出てこない・・・(--;))に黄色い△に『!』で『ページでエラーが発生しました』と出るのです これはjavascriptが正常に機能してないときに出るエラーですよね? javascriptの構文チェックする方法ってあるのでしょうか?cgiはコマンドプロンプトでできるみたいですけど・・・ それで昨日ちょっとググッてIEでブラウズエラーチェックができるみたいなのでやってみました 結果はNo.3の方のお礼に書いた通りなのですが分かりますでしょうか? (3)javascriptはまだ勉強中の身(2,3ヶ月程度)なので新しい構文は見てもすぐには分からないのでtest.cgiとtest.html両方に組み込んで色々試してから使ってます(^^) test.cgiはheader,footer,decode,error,lock,unlockなど基本的なものを書き込んだのをBASEにしてて<body>部だけ変更してます いつもは他の方の書かれたスクリプトをそのままコピペして自分用に(画像のパスやURLなど)変えてやれば機能するのですがこれだけは何処を変えてやればいいのかまったく分からなくて質問させてもらいました >「ファイル名を test.html から test.cgi に変更しただけ」 これはさすがにcgiとして機能しないのは分かりますのでやってません(笑) 上で書いたように<body>部にソース文を貼り付けてやってます(^^) 追記 参考にしたサイトに改めて訪れてみたところhtmlファイルで作ってあるみたいなのですがcgiファイルだと無理なのですかね~~(@@;) http://www.openspc2.org/reibun/javascript/form_textarea/006/
- 神崎 渉瑠(@taloo)
- ベストアンサー率44% (1016/2280)
> ページエラーが出てしまいます エラーの内容(エラーがあった行数)を見てみて下さい。 text.matchの行ではなく、alert()の行が表示されていると思います。 行数の数え方がブラウザごとに違うので、それぞれ違う行数が表示されますが、指し示している部分は同じです(と思います) おそらく文字コードと思います。 CGIからの出力はUTF-8で、ブラウザはShift_JISで表示しようとしていませんか? <META http-equiv="Content-Type" content="text/html; charset=UTF-8"> などを書いて、UTF-8として表示するようにしてみてはいかがでしょうか。 > </textarea>有る無しでコード指定(5種類)試してみたのですがそれもダメでした(><) </textarea>がないとHTMLの文法エラーですから、 表示出来ないか、document.myFormやdocument.myForm.myTEXTが存在しない、ということもあり得ます。 コード指定するのはいいですが、保存したコードと指定しているコードは一致していますか?
お礼
回答ありがとうございます >エラーの内容(エラーがあった行数)を見てみて下さい javascriptのデバック方法分からなかったのでIEのブラウズエラーチェックを試してみたところ・・・ ページを表示するときに『'/'がありません』が checkボタンを押すと『オブジェクトを指定してください』と出ます 行数も14行目と22行目と別の場所を示すのでわからなくなってます 『n = txt.match(/\/r/g);』とすると『15行目構文エラー』となったので 『txt = document.myFORM.myTEXT.value;』と『<input type="button" value="Check" onClick="check()">』(?)だと思うのですが・・・ >おそらく文字コードと思います。 header,footer,decoad,errorなどの基本構文はモデルとして別に保存していていつも内容だけを変えています 他のものは正常に作動するのでどこか構文がおかしいと思うのですが・・・ 上のエラーで推測できないでしょうか?
- hkd9001
- ベストアンサー率48% (99/204)
こんにちは。 まず、おためしいただきたいことがあります… 以下のサンプルを「 test.html 」などのファイル名をつけてお手元のPC上に保存し、ダブルクリックで開いてみてください。 もしOKならば、CGIへ組み込んだときに何かが欠けたりダブったりしている可能性がありますのでチェックしてみてください。NGなら、ファイル保存をするときの文字コードを変えてみてください。 ---------------------------------------------- <html><head> <script language="JavaScript"><!-- function check() { txt = document.myFORM.myTEXT.value; n = txt.match(/\r/g); if (n) len = n.length + 1; else len = 1; alert(len+"行です"); } // --></script> </head> <body> <form name="myFORM"> <textarea rows="3" name="myTEXT"> <input type="button" value="Check" onClick="check()"> </form><body></html> ---------------------------------------------- あと、n=2 とした場合に NaN が出る理由ですが、これは以下の通りです: もとのスクリプト「n = txt.match(/\r/g);」で、n に値がセットされるのですが、n に入るのは「何回マッチしたか」という「数値」ではなく、マッチした結果が順に配列として入ります。だから n=2 としてしまうと次行のif文が実行されず(条件式そのものがエラーになり意味をなさない)len に数値がセットされないので、NaN になるのです。 ですから、マッチした回数を出す場合は、次行の if 文にあるように「 n.length 」としてやる必要があります。 追加でご質問あれば、お気軽にどうぞ。
お礼
回答ありがとうございます そのままコピペしてやったら<textarea>内に<input>以降のソースが入ってしまったので </textarea>を加えてやってみたのですがやはりダメでした >NGなら、ファイル保存をするときの文字コードを変えてみてください。 </textarea>有る無しでコード指定(5種類)試してみたのですがそれもダメでした(><) htmlファイルをダブクリで開くと情報バーに 『セキュリティー保護のため、コンピューターにアクセスできるアクティブコンテンツはInternet Explorer で制御されています』 と出るのですがこれは関係ありますか? 送る前にもう一度確かめてみたのですが・・・ ダブクリではなくURLを直接入力するとtest.htmlでは作動するみたいなのですがtest.cgiではエラーになります 分かりますでしょうか?
- ANASTASIAK
- ベストアンサー率19% (658/3306)
ふむ。コードはまちがっていないと思いますね。 txt = document.myFORM.myTEXT.value; を var txt = document.myFORM.myTEXT.value; に差し替えたらどうなりますか?
お礼
回答ありがとうございます 差し替えてやってみたのですがやはりページエラーになってしまいます(><)
お礼
できました~~ 『\』はエスケープコードというのですね(^^) 『表示』などそのまま実行したら違う文字になってるから文字化けした文字を\で囲めば文字化けが抑制できると安易な認識しかしてなくて意味も知らずに使ってました(滝汗) 質疑応答の中で色々なことを勉強させてもらいました 回答を頂いた皆様方、お世話になりましたm(--)m また何かありましたらよろしくお願いします