onChange のハンドラをどうやって起動するかで苦戦していましたが、結局
通常の <Select> タグの onChange 記述するスクリプトを「そのまま」文字列として受け取り、eval() で起動することにしました。
<Select ... onChange="onChanheFunction(param1, param2,...)" であれば、
文字列「"onChanheFunction(param1, param2,...)" 」を受取り、
eval("onChanheFunction(param1, param2,...)" ) とするわけです。
param に document,MyForm.TextBox.Value のようにタグなどが記述されていても、きちんと評価して実行してくれます。
MDN などによると、eval() にはセキュリティー上のリスクがある上、負荷が重いので【使うな】となっています。確かに不特定の文字列を評価して実行するならば、たとえばユーザーが text box などに入力した文字列を実行するならば「とっても危険」でしょう。でも、私のシステムの場合は、本来は <Select onChange > に記述するものを eval() で実行しているだけです。これで eval() が危険と言うならば、onChange に何か書くと危険という事になってしまいますよね。
悪意のあるユーザーが Jsp, Java ファイルを改変して実行するならば、あるいは、「ページのソース」で取得したものを改変して実行可能ならば eval() なんか関係なしで「とっても危険」ですけどね。
ということで、eval() を使う事にしました。
これをやっていて分かった(分かった気になっている)こと。
・function を呼び出す時のパラメータの評価は、function を呼び出す前に(呼び出す処理の一部として)行われるようだ。
function testFunc(aaa){
console.log(aaa);
}
testFunc(document.MyForm.MyTextBox.value);
などとして、myTextBox に入力された値を表示しようとした時、「document.MyForm.MyTextBox.value」は function testFunc が呼び出される前に(testFunc(document.MyForm.MyTextBox.value); を認識してから testFunc の実行が始まるまでの間に)評価されるらしい。つまり、function の一部として引数の評価をしているわけではないらしい。
function は arguments を参照する事ができますが、arguments には引数リストに記述していない物も含まれています。という事は、function 実行開始前に評価されている、という事でしょうね。function 実行開始後に評価されるならば、eval() などとしなくても実行できるでしょうね。
さてさて、今ハマっているのは、MySelect の幅の指定なんです。幅をピクセル単位で指定するのは問題なくいのですが、% で指定するのに手こずっています。親要素の幅の「○%」なんですが、サーバー側では親要素が何であるかは認識できても、それの幅(クライアント側で動作しているブラウザが作成した画面内の「要素の幅」なんか取得のしようがありません(当たり前だけど)。さてさて、どうしようか。
%での指定が出来ないのは不便なんだけど、クライアント環境での幅(ピクセル数)なんかサーバープログラマは想定できませんよね。
現状では、各ページ起動時に window 幅を取得して、幅によってPC版、スマホ版を切替えています。必用に応じて同じページのPC版/スマホ版を呼び出すだけなんですけど、切替える時に取得した windoe.clientWidth などをサーバーに送信して、それを基準に何か出来ないか、などと考えています。
幸いな事に「CD・LP管理システム」では画面幅を20等分して <TD> などの幅を決めているので、何とかなりそうですね。
という所で、今日はこれでおしまい。一杯やっちゃったから。
の内容「aaa」