CGIで出力したHTMLの中にJavaScript

[上に] [前に] [次に]
MOE 2000/02/24(木) 15:58:41
もしかしたら、基本的なことなのかもしれませんが・・・。

CGIプログラムの中で記述したHTMLの中にJavaScriptを記述すると
スクリプトエラーが出てしまうのですが、CGIプログラムの中にJavaScriptって問題あるんでしょうか。

ちなみに、普通のHTMLに同じJavaScriptのソースを書くと問題なく処理されますので、ソースに問題はありません。

どなたか、ご教授お願いします。

やっちゃん 2000/02/24(木) 16:13:42
エスケープするべき文字をしていないのかもしれません。

エラー:print"document.write("あいうえお");\n";
大丈夫:print"document\.write\(\"あいうえお\"\)\;\n";
Javascriptだからエラーというのはないと思います。

チャペル 2000/02/24(木) 16:14:49
こんにちわです。

文字コードなどの兼ね合いでエラーが出てるのかも・・・。

解決法というか、回避法として、
外部JavaScriptファイルを使うというのはどうでしょう?
(これでも、エラーが出たりして。)

EMI 2000/02/24(木) 16:27:00
おそらく、やっちゃんさんの言うとおりエスケープの問題でしょう。
ただ、少々エスケープしすぎな気が。
シングルクォートを使えば、たぶん大丈夫でしょう。
print 'document.write("あいうえお");'."\n";

MOE 2000/02/24(木) 18:13:08
レスありがとうございます。

エスケープの問題と言うことなのですが、皆さんの指摘のような
printなどでJavaScriptからかき出しているわけではないのです。
以下が私の書いたソースです。何か問題あるのでしょうか。
JavaScriptは初心者中の初心者なので・・・(恥)

function go() {
    var svc = "test.cgi";
    svc = svc + "?" + document.divselect.elements[0].name + "=" + document.divselect.div.options[document.divselect.div.selectedIndex].value;
    location.href = svc;
}

これと全く同じソースをHTMLに書いて実行しても、エラーは出ません。
フォームの名前なども全く同じ物です。
本来なら、ページを見ていただきたいのですが、仕事上の都合で見ていただくことが出来ません。すみません。

やりたいこととしては、<SELECT>で選択された値を指定したCGIへ渡し、
CGIはその値で処理を行ない、その結果をHTMLとして表示する。
ここまでは、上手く行くのですが・・・。
結果を表示したHTMLからもう一度<SELECT>で選択すると、エラーになります。
エラーは[document.divselect.div.optionsはオプションではありません]とでています。

非常にわかりづらい説明かもしれませんが、お願いします。

MOE 2000/02/24(木) 18:23:53
あ・・・・。
すみません。すごく見当違いな返事をしてしましました(恥)

皆さんの言ってるエスケープの問題の気がします。
私は、HTMLのソースをCGIの中で<<"HTML";のような形でまとめて書いているので、
printを違う意味でとってしまいました。
皆さんの言ってるprintは、HTML内にJavaScriptを書き出すprintのことですよね。

まずは、エスケープで対処してみます。

あぁ、恥ずかしい・・・。

EMI 2000/02/24(木) 18:25:48
なるほど。ならば、
print <<'HTML';
 〜
HTML

の様にすれば、たぶんうまくいくと思います。

MOE 2000/02/24(木) 18:40:00
うーん、やっぱりだめですねぇ(TT)

>[document.divselect.div.optionsはオプションではありません]
と言われてしまいます。
ちゃんと、divselectと言うフォーム名もつけてますし、divと言う<SELECT>もあります。

どうしてなのでしょうか・・・・。

EMI 2000/02/24(木) 18:53:56
divという要素があるから、というのは関係あるんでしょうか?
名前を変えてみると、もしかしたらうまくいくかもしれません。

MOE 2000/02/25(金) 10:02:00
おはようございます。

EMIさんの言う通り、divと言う名前を変えてみました。
期待した通りの結果が返ってきました(^0^)

が、なぜdivと言う名前だとエラーになるのかがわかりません。
すみませんが、ご説明いただけないでしょうか。
お願いします。

EMI 2000/02/25(金) 11:31:01
HTMLにdivという名前の要素があるからです。
つまり、divと指定したことにより、divという名前のコントロールではなくどこかにあるdiv要素(idがoptionsのもの?)を探しに行っているのが誤動作の原因です。たぶん。
だから、おそらくこのJavaScriptは次のようなものを探してるのでしょう。たぶん。
<div id="options">
  〜
</div>

Syn [E-Mail] 2000/02/25(金) 11:40:01
> [document.divselect.div.optionsはオプションではありません]

わたしも少し前に似たようなエラーで悩みました。
このテのエラーを避けるために、

document.forms("divselect").elements("div").options

としたほうがブナンかもしれません。

EMI 2000/02/25(金) 11:43:36
>> [document.divselect.div.optionsはオプションではありません]
>
>わたしも少し前に似たようなエラーで悩みました。
あぁ、そうか。エラーが出るんでしたっけ。
よく読みとってませんでした、すみません。
つまり、div要素にoptionはないといっているのでしょう。

MOE 2000/02/25(金) 11:52:46
なるほど。
確かにHTMLに<DIV>がありますよね。それでですか・・・。納得。
しかし、まだ疑問が・・・。
同じdivと言う名前を使っているのに、ただのHTMLではエラーが出ないのって何ででしょうか。

Synさんの書かれているように
>document.forms("divselect").elements("div").options
としてみました。
[document.forms(...).elements(...).optionsはオブジェクトではありません]
と言われました。

う〜ん。JavaScriptは難しい・・・(TT)

MOE 2000/02/25(金) 11:59:21
何度もすみません。

先ほどエラーになると書きましたが、ただのHTMLではエラーになりませんでした。
CGIで出力しているもののみです。
文字括りは前にEMIさんに指摘していただいた通り、
<<'HTML';にしています。

MOE 2000/02/28(月) 10:28:33
[[解決]]
もう少し、自分で勉強してみます。

EMIさん、Synさん、ありがとうございました。

[上に] [前に] [次に]