プロが教えるわが家の防犯対策術!

フォーム部品type=text の一行テキスト領域で入力した単語を、inputwordkensaku.cgiには辞書検索させ検索結果をCookieに書かせるところまでやらせ、そのCookie データをJavaScript で読み、あらかじめ設置しておいたフォーム部品であるメニューにセットしようとしているのですが、うまくいきません。
 cgiはエラーが出ずに動きますが、Cookie への書き込みができたか確認しようにも
<INPUT size="20" name="inputbox" type="text" onChange = "inputwordkensaku.cgi">のイベントにづけて、このCookie を読み出すための次のようなJavaScriptのプログラムをどこに書きつなげたらよいのかが分かりません。よろしくお願いいたします。

<script type="text/javascript"><!--
function set__resultsData(){
//クッキーに格納されたデータを読み出して、
//オプションメニューと隠しフィールドにセットする

getc=document.cookie+";";  //クッキーを読む
x1=getc.indexOf("resultdata");
if (x1!=-1) {
tem1=getc.substring(x1-1);
x2=tem1.indexOf("=");
x3=tem1.indexOf(";");
urls_data0=tem1.substring(x2+1,x3);
urls_data=unescape(urls_data0);
CkOpt=urls_data.split("<>"); //クッキーデータの分析
for (i=1; i<CkOpt.length; i++){
longlinestr = CkOpt[i-1];//これは見出し語の原型
pp = longlinestr.indexOf(" /// ");
midashigo = longlinestr.substr(0, pp-1);
yakugo = longlinestr.substring(pp+5);

document.form1.hiddenlist.options[i] = new Option();
document.form1.hiddenlist.options[i].text = yakugo;
//↑隠しリストに辞書の訳語部分のみをセットする
document.form1.wordlist.options[i]= new Option();
document.form1.wordlist.options[i].text=midashigo; //見出し語のみをセットする
}}} // --></script>

A 回答 (1件)

たびたび失礼します。



とりあえず、CGIで書き込んだCookieをHTML側で取得できるかどうかを確認する方法としては、Cookieを受け取る側のHTMLファイル上で、body以下に下記のソースを加えてみるのがよいのではないかと思います。

<script type="text/javascript"><!--
document.write(document.cookie);
//--></script>

このソースを加えると、この部分でCookieから取得した内容を加工なしに表示します。 これでCookieから取得したデータの内容が表示されますので、Cookieが保存できているかどうかと、Cookieから取得できるデータの内容を把握することができると思います。

質問文のソースにある関数ですが、呼び出す場合には呼び出したいところで、スクリプト内やイベントハンドラに関数名を指定すればよいと思います。
ページを読み込んだときに自動的にこの関数が実行されるようにしたい場合は、「<script type="text/javascript"><!--set__resultsData()//--></script>」というソースをform1のあとに追加する(form1の前に入れてしまうと、エラーになる可能性があります)か、bodyタグ内に「onLoad="set__resultsData()"」というイベントハンドラを追加すれば良いと思います。
ボタンクリックで実行させたい場合は、「<input type="button" value="データ取得" onClick="set__resultsData()">」といった感じのソースにすれば良いと思います。

ついでに、質問文中のソースですが、動作自体には問題はないかとは思いますが、

pp = longlinestr.indexOf(" /// ");
midashigo = longlinestr.substr(0, pp-1);
yakugo = longlinestr.substring(pp+5);

この部分は、

pp = longlinestr.split(" /// ");
midashigo = pp[0];
yakugo = pp[1];

このように書き換えても良いかと思います。 「配列名=文字列オブジェクト.split(***)」というソースは、split以下の括弧内の文字列を区切り文字として、文字列オブジェクトをそこで分割し、前から順に配列の中に格納する処理を行います。
あと、質問文中のソースを以前に回答したソースと組み合わせる場合は、変数名や配列名が重複していると、予期しない動作をすることもあるかもしれません。 もし予期しない動作が出た場合は、変数名や配列名が重複しないように書き直すのが良いかもしれません。

なお、Cookieは異なるディレクトリにあるファイル同士では共有できない場合もあります。 もし異なるディレクトリにおいてあるファイル同士でCookieのデータを共有したい場合は、Cookieの情報の中にpathを保存しておく必要があるかもしれません。
とりあえず、今のCGIとHTMLが同じディレクトリ内に保存されている場合には問題はないと思いますが、別のディレクトリにそれぞれが保存されていて、うまくCookieのデータが渡っていかない場合には、こちらの点についても見当が必要かもしれません。 一応、念のための情報として…

参考になれば…
    • good
    • 0
この回答へのお礼

lead1976様、ありがとうございました。参考になりました。

お礼日時:2003/11/16 22:31

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!