« 大文字、小文字に気をつけましょう・・ | メイン | Select Option の代替品(2) »

2021年11月 4日 (木)

Select Option の代替品(1)

スマホ版を作成中ですが、スマホは指で操作するため、ボタンなどを大きくしなくては思ったように操作できません。<Select><Option> では、オプションリストの行の高さを大きくしたいのですが、<Option> に style をセットしても手応えなし。
考えているうちに、<Select><Option> と同じような動きをする物が作れそうに思えてきたので、やってみました。本物の <Select><Option> とは多少違うのですが、主要な機能は同じものを作る事ができました。

【まだPC Windows 10 でしか動かしていません]

ブラウザのウインドウを小さくして動かした限り、よさそうです。実際のスマホの場合、アンドロイドだったりするわけで、問題が出る可能性はありますが、とりあえず動いたので公開します。

使っているのは JavaScript だけです。

多分、「<Select><Option> の代替品(5)」で実行可能な html ファイルを書き込む予定です。このブログサイトにはダウンロード可能なファイルをUpし、読者がダウンロードできる機能はないようなので、html をテキストとして投稿する予定です。

・<Select><Option> は使わない。

<Select> は <Option selected> あるいは最初の <Option> にある caption を現在選択されている物として表示すると思われます。つまり、<Option> が必用。<Option> が意図したように動いてくれないならば <Option> は使えない。<Select> は使用して <Option> の代わりに <MyOption> などを使うには <Select> を処理する部分(つまり、ブラウザ)を修正しなくてはならないでしょう。そういう訳なので、<Select><Option> は使いません。

・<Select> の代替品 【以下、MySelect と書く場合があります。】

必用条件は、現在の選択値のキャプションを表示できる事、それを JavaScript で書き換える事ができる事、ユーザーは書き換えられない事、クリックした時イベントが発生する事、<Select> の value 相当の値を適切なパラメータ名で送信できる事などです。結局、以下のようにしました。


<span style="outline:solid thin;width:150px;" id="MySel0" onClick="dispMyOption('MySel0','MySelT0','MyOpt0','MyLi0','17')">

<input type="text" readonly style="cursor:default;outline:none;border:none;width:135px;height:40px;" id="MySelT0" value="">

<input type="text" readonly style="cursor:default;outline:none;border:none;text-align:right;width:15px;height:40px;" value="v " class="aH">

</span>

<input type="hidden" name="TestParam" value="">

・現在選択値の表示、▽のボタンには readonly の text を使っているのは、最初に思いついたのが readonly text だったからで、動作したのでそのままになっています。

・Html パラメータの送出には <hidden> を使っています。hidden の name に記述する名前は <Select> に記述する名前です。

・text に表示される枠があると、現在値表示、▽ボタンに個別の枠が表示されてしまい、見た目が大きく異なります。「枠なし」とします。

・2つの text 全体を囲む枠は欲しいので、<span> で囲み、それに枠を付けました。

【重要】2つの ,input typw=text ...> の間に改行を入れてはいけません。ここでは読みやすさのために改行していますが、実際の html に改行を入れると

Firefox:まともに表示される。

Chrome, Edge : こけしを横倒ししたよう不思議な形の外形が表示される。

となります。どうやた、改行はデフォルト高さの空白文字に変換されているようです。


・<Select> の代替品、行ごとの説明

<span style="outline:solid thin;width:150px;" id="MySel0" onClick="dispMyOption('MySel0','MySelT0','MyOpt0','MyLi0','17')">

style="outline:solid thin; 枠あり、細い実線 width:150px;

id="MySel0   JavaScript で処理する時に参照するための id onClick="dispMyOption('MySel0','MySelT0','MyOpt0','MyLi0','17') クリックされた時の処理


'MySel0'   <Select 代替品を囲む <span> の id

'MySelT0' 現在値を表示する readonly text の id

'MyOpt0' オプションリスト(後述)全体の id

'MyUl0' オプションリストの <ul> の id

'17' オプションリストの行数


<input type="text" readonly style="cursor:default;outline:none;border:none;width:135px;height:40px;" id="MySelT0" value=""> 現在値を表示する領域。


<input type="text" readonly style="cursor:default;outline:none;border:none;

text-align:right;width:15px;height:40px;" value="v " class="aH">

▽を表示する領域。▽は小文字の v で代用しています。

</span>
<input type="hidden" name="TestParam" value="">

選択値を Html パラメータとして送出するためのもの。name は送出されるパラメータの名前で、<Select name=...> に記述する名前。

・<Option> の代替品

<div id="MyOpt0" style="display:none;position:fixed;border:1px solid #000;background-color:#fff;">

<ul style="list-style:none;padding-left:0;padding-top:0;margin-top:0;padding-bottom:0;margin-bottom:0;overflow-y:auto;" id="MyUl0">

<li onMouseOut="onMouseOutFunction('MySel0',this,'0');" onMouseOver="this.style.background='lightskyblue';" style="text-align:left;padding-left:20;padding-top:10;padding-bottom:10;" onClick="setValue('MySel0','MySelT0','MyOpt0','222','アイルランド','0','TestParam')">アイルランド</li>

<li onMouseOut=・・中略・・</li>  必用なだけ繰返し記述

</ul></div>
オプションリストには <div><ul> <li></li> </ul><div> を使いました。<div> はオプションリスト全体で、その時の画面の大きさ、スクロール量に応じて表示位置を調整する時、オプションリスト全体を「1つの物」として扱うためのものです。

<ul> <li> の説明は不要は省略


・<Option> の代替品 行ごとの説明

<div id="MyOpt0" style="display:none;position:fixed;border:1px solid #000;background-color:#fff;">

id="MyOpt0" JavaScript から参照するための id

styledisplay:none; 初期状態は非表示

position:fixed;border:1px solid #000; 境界線あり、1px 幅の実線、黒色background-color:#fff; 背景色は白

<ul style="list-style:none;padding-left:0;padding-top:0;margin-top:0;padding-bottom:0;margin-bottom:0;overflow-y:auto;" id="MyUl0">

id="MyOpt0" JavaScript から参照するための id
styledisplay:none; 非表示

position:fixed; 位置は固定。実際に表示する時 JavaScript で調整します。

border:1px solid #000 境界線。1px 幅の実線、黒色

background-color:#fff 背景色は白


<li onMouseOut="onMouseOutFunction('MySel0',this,'0');" onMouseOver="this.style.background='lightskyblue';" style="text-align:left;padding-left:20;padding-top:10;padding-bottom:10;" onClick="setValue('MySel0','MySelT0','MyOpt0','222','アイルランド','0','TestParam')">アイルランド</li>

onMouseOut="onMouseOutFunction('MySel0',this,'0');マウスが離れた時の処理

onMouseOver="this.style.background='lightskyblue'; マウスが乗った時の処理。「選択色」とする。

styletext-align:left; テキストは左詰め

padding-left:20 左の padding

padding-top:10; 上の padding

padding-bottom:10; 下のpaddingon

Click="setValue('MySel0','MySelT0','MyOpt0','222','アイルランド', '0','TestParam')">

クリックされた時の処理。

'MySel0','MySelT0','MyOpt0', JavaScript から参照するための id。

何の id かは「<Select> の代替品、行ごとの説明」にあります。

'222' 「アイルランド」の パラメータ値。<Option value=...> に記述する値に相当。

'アイルランド' クリックされた時、mySelect に表示する文字列。<Option> </Option> 間に記述する文字列に相当。

'0' 「アイルランド」の、<ul> 内の位置。行番号。

'TestParam' Html パラメータの名前。JavaScript が <hidden> を参照するための名前。</ul></div>
今回はここまで。次回は JavaScript その1。かなり長いスクリプトなので、2回に分けて書きます。

コメント

コメントを投稿