JavaScriptを使ってformのテキストボックスの内容がデフォルト・バリューから変更されたものだけを選択してCGIに送信するスクリプトを書いています。
変更されたテキストだけをピックアップし、location.hrefに渡すまではできるのですが、引数に日本語が入っている場合escapeする必要があります。escape()だとunicodeに変更してしまうので、CGI側でデコードできません。CGIはPerlで書いています。
どなたか、JavaScriptでEUCやSJISをそのまま%nn%nnに変換する方法をご存知ありませんか?
あるいは、nkfとかjcode.plでunicodeをデコードする方法を知りませんか?
変更があったformの内容を一度ブラウザに表示して、確認(submit)をクリックしてもらえば、多分引数のescapeの問題は回避できるでしょうが、できれば確認画面を見せずにやりたいな、と思います。
データを一度input type="hidden"に入れて、submitすればどうでしょう。(ユーザが入力するフォームと独立したフォームで)
CGI側で変換するならJcode.pmを入れるのがいいかも。jcode.plではUnicodeの変換はできません。
Javascriptでsubmit()ですよ。
ご教示ありがとうございます。
私もそう考えまして、下のようなスクリプトを作ってみましたが、IE5ではうまく行きそうですが、Netscape Comunicator 4.6 では15行目の"cur"が未定義と言われて動きません。document.openしたとたんにcurのことは忘れてしまうみたいです。
デバッグに利用しているNetscapeで動かないと何かと不便なので"hidden"方式は断念してしまいました。
Netscapeでopenより前の変数を忘れない方法ってありますか?
<HTML>
<HEAD>
<TITLE>フォーム送信のテスト</TITLE>
</HEAD>
<BODY>
<SCRIPT language="JavaScript">
<!--
function findChanged () {
nm = document.form1.elm1.name;
org = document.form1.elm1.defaultValue;
cur = document.form1.elm1.value;
if ( org != cur ) {
document.open;
document.writeln( '<FORM name="form2" action="http://127.0.0.1/~aaa/bbb.cgi" type="submit">' );
document.writeln( '<INPUT type="hidden" name="elm2" value="', cur, '">' );
document.writeln( '</FORM>');
document.close;
document.form2.submit();
}
else {
alert( "変更されていません" );
}
return(true);
}
// -->
</SCRIPT>
<FORM name="form1">
<INPUT name="elm1" value="あいうえお">
<INPUT onClick=findChanged() type="button" value="変更する">
</FORM>
</BODY></HTML>
わざわざJavascriptでフォームを書かなくても、最初からページに書いておいて、
document.form2.elm2.value = document.form1.elm1.value;
でいいのでは?
フォームのエレメント数が少なければそれで良いかなとも思います。
本番のページで、エレメント数が70もあるので、form2に70もhiddenを埋め込むのもちょっと芸が無いかと思いまして...
とは言え実際問題、valueが代入されなかったエレメントは空文字が送信されるだけですし、postで送信すれば文字数制限もない。
EUCやSJISをescapeするとか、JavaScriptで引数を整理するとか、面倒な事を考えるより、空文字をビシバシ送信した方が簡単かなという気がしてきました。
form2のhiddenは一つあればできますよ。データの区切りをCGI側でなんとかすれば。
それより、入力の無いフォーム部品をJavascriptでdisabled指定すれば送信されませんね。
えー、disabledする?
その手がありますね、何で思いつかなかったんだろう!!
ありがとうございます。
試してみます。
disabledは、たしかNNでは、使えなかったと思う。
うろ覚えですが、、、
確かにNNでは効きませんでした。
そこでNNとIEで処理を分けて、IEではdisabledを使い、NNでは変更の無かったエレメントだけ空文字にしました。「name=」の送信は止められませんが、引数のvalueが空文字ならCGI側でデータ内容のチェックとか、データベースの書き換えとか、if文が1エレメントにつき2つ位節約できますから、それで良しとします。
サーバーはかなりパワフルなUNIXマシンなので、過敏にif文を節約することも無いかも知れないんですけどね。