WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:JavaScriptでEUCかSJISをescape

0:[投稿] かば [MAIL] [2002/01/26 11:00 ][環境:WIN+IE WIN系+OTHER]

JavaScriptを使ってformのテキストボックスの内容がデフォルト・バリューから変更されたものだけを選択してCGIに送信するスクリプトを書いています。
変更されたテキストだけをピックアップし、location.hrefに渡すまではできるのですが、引数に日本語が入っている場合escapeする必要があります。escape()だとunicodeに変更してしまうので、CGI側でデコードできません。CGIはPerlで書いています。
どなたか、JavaScriptでEUCやSJISをそのまま%nn%nnに変換する方法をご存知ありませんか?
あるいは、nkfとかjcode.plでunicodeをデコードする方法を知りませんか?
変更があったformの内容を一度ブラウザに表示して、確認(submit)をクリックしてもらえば、多分引数のescapeの問題は回避できるでしょうが、できれば確認画面を見せずにやりたいな、と思います。


1:[回答] TOM neko [2002/01/26 16:30 ]

データを一度input type="hidden"に入れて、submitすればどうでしょう。(ユーザが入力するフォームと独立したフォームで)

CGI側で変換するならJcode.pmを入れるのがいいかも。jcode.plではUnicodeの変換はできません。


2:[回答] TOM neko [2002/01/26 16:33 ]

Javascriptでsubmit()ですよ。


3:[回答] かば [MAIL] [2002/01/26 17:48 ]

ご教示ありがとうございます。
私もそう考えまして、下のようなスクリプトを作ってみましたが、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>


4:[回答] TOM neko [2002/01/26 20:22 ]

わざわざJavascriptでフォームを書かなくても、最初からページに書いておいて、

document.form2.elm2.value = document.form1.elm1.value;

でいいのでは?


5:[回答] かば [MAIL] [2002/01/27 13:24 ]

フォームのエレメント数が少なければそれで良いかなとも思います。
本番のページで、エレメント数が70もあるので、form2に70もhiddenを埋め込むのもちょっと芸が無いかと思いまして...
とは言え実際問題、valueが代入されなかったエレメントは空文字が送信されるだけですし、postで送信すれば文字数制限もない。
EUCやSJISをescapeするとか、JavaScriptで引数を整理するとか、面倒な事を考えるより、空文字をビシバシ送信した方が簡単かなという気がしてきました。


6:[回答] TOM neko [2002/01/27 21:28 ]

form2のhiddenは一つあればできますよ。データの区切りをCGI側でなんとかすれば。

それより、入力の無いフォーム部品をJavascriptでdisabled指定すれば送信されませんね。


7:[完了] かば [MAIL] [2002/01/29 06:07 ]

えー、disabledする?
その手がありますね、何で思いつかなかったんだろう!!
ありがとうございます。
試してみます。


8:[関連] のぐりん [MAIL] [2002/01/29 09:35 ]

disabledは、たしかNNでは、使えなかったと思う。
うろ覚えですが、、、


9:[回答] かば [MAIL] [2002/01/29 20:48 ]

確かにNNでは効きませんでした。
そこでNNとIEで処理を分けて、IEではdisabledを使い、NNでは変更の無かったエレメントだけ空文字にしました。「name=」の送信は止められませんが、引数のvalueが空文字ならCGI側でデータ内容のチェックとか、データベースの書き換えとか、if文が1エレメントにつき2つ位節約できますから、それで良しとします。
サーバーはかなりパワフルなUNIXマシンなので、過敏にif文を節約することも無いかも知れないんですけどね。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World