« Select Option の代替品(7) | メイン | Select Option の代替品(9) »

2021年11月15日 (月)

Select Option の代替品(8)

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」

コメント

コメントを投稿