<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:thr="http://purl.org/syndication/thread/1.0">
    <title>ＣＤ、ＬＰ管理と音楽のデータベース・システム　RecLib: インターネット・パソコン</title>
    <link rel="self" type="application/atom+xml" href="http://reclib.blog.enjoy.jp/blog/cat_8/atom.xml" />
    <link rel="alternate" type="text/html" href="http://reclib.blog.enjoy.jp/blog/" />
    
    <id>tag:app.blog.enjoy.jp,2003:weblog-516161</id>
    <updated>2022-02-14T21:21:17+09:00</updated>
    <subtitle>ＣＤ、ＬＰ管理と音楽のデータベース・システム</subtitle>
    <entry>
        <title>window.resize （２）</title>
        <link rel="alternate" type="text/html" href="http://reclib.blog.enjoy.jp/blog/2022/02/windowresize-8e0e.html" />
        <link rel="replies" type="text/html" href="http://reclib.blog.enjoy.jp/blog/2022/02/windowresize-8e0e.html" />
        <id>tag:app.blog.enjoy.jp,2003:post-59551000</id>
        <published>2022-02-14T21:21:17+09:00</published>
        <updated>2022-02-14T21:21:18+09:00</updated>
        <summary>今回もＷｅｂページを作るサーバーサイドの話題です。 body onLoad=....</summary>
        <author>
            <name>reclib</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="インターネット・パソコン" />
        
        
<content type="html" xml:base="http://reclib.blog.enjoy.jp/blog/">
<![CDATA[
<div xmlns="http://www.w3.org/1999/xhtml"><p>今回もＷｅｂページを作るサーバーサイドの話題です。</p>
<p>&lt;body onLoad=...&gt;　よりも前に resize イベントが発生する事があるのが判りました。</p>
<p>onLoad で window サイズを取得して保存、window.onresize=function {....}; では、window サイズが変更されていれば resize に必用な処理、そうでなければ何もしない。としていたのですが、onLoad の前に onResize が実行されるとはねぇ。</p>
<p>結局、var windowHeight, var windowWidth という変数を用意して「あり得ない値」（たとえば 0 とか）で初期化しておき、onResize で&nbsp;windowHeight などが初期値であった場合はその時の window サイズを&nbsp;windowHeight などに代入し、resize の処理はしないようにしました。</p>
<p>var windowWidth = 0;</p>
<p>var windowHeight = 0;</p>
<p>&nbsp; &nbsp; onLoad 時に windowWidth,&nbsp;windowHeight&nbsp; にその時の window サイズを保存</p>
<p></p>
<p></p>
<p>window.onResize = function{</p>
<p>&nbsp; &nbsp; var curWindowWidth=window.innerWidth;</p>
<p>&nbsp; &nbsp; var curWindowWidth=window.innerWidth;</p>
<p>&nbsp; &nbsp; if((windowWidth == 0) &amp;&amp; (windowHeight&nbsp; == 0)){</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; windowWidth =&nbsp;curWindowWidth;<br />&nbsp; &nbsp; &nbsp; &nbsp; windowHeight =&nbsp;curWindowHeight;</p>
<p>&nbsp; &nbsp; }else{</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; if(ウインドウサイズが変化していたら){</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; onResize に必用な処置;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; }</p>
<p>&nbsp; &nbsp; }</p>
<p>}</p>
<p></p>
<p>としました。今のところＯＫみたい。</p>
<p>・・・ったく、面倒な・・・</p>
<p></p></div>
]]>
</content>


    </entry>
    <entry>
        <title>window.resize</title>
        <link rel="alternate" type="text/html" href="http://reclib.blog.enjoy.jp/blog/2022/02/windowresize.html" />
        <link rel="replies" type="text/html" href="http://reclib.blog.enjoy.jp/blog/2022/02/windowresize.html" thr:count="0" />
        <id>tag:app.blog.enjoy.jp,2003:post-59550162</id>
        <published>2022-02-13T04:11:43+09:00</published>
        <updated>2022-02-13T04:11:45+09:00</updated>
        <summary>今回はＷｅｂページを作るサーバーサイドの話題です。 ブラウザでＷｅｂページを見て...</summary>
        <author>
            <name>reclib</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="インターネット・パソコン" />
        
        
<content type="html" xml:base="http://reclib.blog.enjoy.jp/blog/">
<![CDATA[
<div xmlns="http://www.w3.org/1999/xhtml"><p>今回はＷｅｂページを作るサーバーサイドの話題です。</p>
<p>ブラウザでＷｅｂページを見ている時に、マウスなどでウインドウのサイズを変更すると window.resize イベントが発生します。イベントハンドラは新しいウインドウに合わせて画面レイアウトを修正したりするわけです。今作成中の版では、ウインドウ幅によって表示を変更するようにしているのですが・・・</p>
<p>画面表示を変更するにはページを作り直すのが簡単。ウインドウの大きさを変更なんて操作はさほど頻繁ではないし。と言う訳で、同じページを単純に再作成するようにしました。ＤＢを検索なども全部再実行。場面によっては結構重いけど、まあいいか。</p>
<p>ところが、ウインドウのサイズを変更していないにもかかわらず resize イベントが発生する事がありました。ページを移動すると、そのページが２回作成されてしまいます。それも全ページで。</p>
<p>https://www.infoscoop.org/blogjp/2015/02/27/ie8-window-resize/　に情報がありました。DOM の高さを変更すると resize が発生するのだそうです。回避策も書いてありました。resize のイベントハンドラで「本当にサイズが変わっているか」を調べ、変わっていない場合はイベントは無視する、というものでした。</p>
<p>あまりスマートではないと思うけど、他に方法がないのでは仕方がない。サイズの検査の数行を追加してＯＫになりましたが、なぜ２回実行されるのかが判るのに２日かかってしまいました。やれやれ。だけど、良かった、よかった。</p>
<p></p></div>
]]>
</content>


    </entry>
    <entry>
        <title>DOCTYPE HTML  その後</title>
        <link rel="alternate" type="text/html" href="http://reclib.blog.enjoy.jp/blog/2022/01/post-6063.html" />
        <link rel="replies" type="text/html" href="http://reclib.blog.enjoy.jp/blog/2022/01/post-6063.html" thr:count="0" />
        <id>tag:app.blog.enjoy.jp,2003:post-59539178</id>
        <published>2022-01-22T14:53:27+09:00</published>
        <updated>2022-01-22T14:54:01+09:00</updated>
        <summary>ＤＢアプリの各ページに  を入れたのですが、動かな...</summary>
        <author>
            <name>reclib</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="インターネット・パソコン" />
        
        
<content type="html" xml:base="http://reclib.blog.enjoy.jp/blog/">
<![CDATA[
<div xmlns="http://www.w3.org/1999/xhtml"><p>ＤＢアプリの各ページに&nbsp;&lt;!DOCTYPE HTML&gt;&nbsp; を入れたのですが、動かなくなったのは style.width でけではありませんでした。</p>
<p>画面のスクロール位置を得るのに</p>
<p>document.FORM_NAME.scrollLeft,&nbsp;&nbsp;document.FORM_NAME.scrollTop</p>
<p>を使っていたのですが、これらの値が常に０になってしまいました。</p>
<p>これ、元はＩＥの仕様らしいのですが、Firefox でも動いていたので気にしていなかったのですが、標準仕様ではなかったようです。</p>
<p>window.scrollX ,&nbsp;window.scrollY に変更したらＯＫでした。</p>
<p>位置の復元は&nbsp;</p>
<p>document.FORM_NAME.scrollLeft,&nbsp;&nbsp;document.FORM_NAME.scrollTop に値を代入していたのですが、これもＮＧ。　window.scrollTo(x,y); としたらＯＫでした。</p>
<p></p>
<p>Windows を買えばＩＥが付いてくるし、</p>
<p>ＩＥを前提にしたサイトが増えると Firefox としても対応せざるを得ない・・・ので対応しただけだったようです。Html にはこんなのが沢山ありそうで、次は何が発覚するかな？？</p>
<p>いろんなブラウザ屋さんが「独自に拡張」したのがデファクトスタンダードになってしまい、仕様は後追いなので、混乱の極みですね。何とかしてほしいけど、ブラウザもサイトも「出回ってしまった」のでどうしようもないでしょうね。</p>
<p></p>
<p></p>
<p></p></div>
]]>
</content>


    </entry>
    <entry>
        <title>ブラウザに警告された</title>
        <link rel="alternate" type="text/html" href="http://reclib.blog.enjoy.jp/blog/2022/01/post-44d2.html" />
        <link rel="replies" type="text/html" href="http://reclib.blog.enjoy.jp/blog/2022/01/post-44d2.html" thr:count="0" />
        <id>tag:app.blog.enjoy.jp,2003:post-59537147</id>
        <published>2022-01-19T11:39:51+09:00</published>
        <updated>2022-01-19T11:39:53+09:00</updated>
        <summary>ＤＢの新版作成中なんですが、firefox のブラウザコンソールに見慣れないメッ...</summary>
        <author>
            <name>reclib</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="インターネット・パソコン" />
        
        
<content type="html" xml:base="http://reclib.blog.enjoy.jp/blog/">
<![CDATA[
<div xmlns="http://www.w3.org/1999/xhtml"><p>ＤＢの新版作成中なんですが、firefox のブラウザコンソールに見慣れないメッセージが表示されました、それも全ページに対して。アプリ自体は動くのですが、気になります。読んでみたら「このページは後方互換性によって動いている。&lt;!DOCTYPE HTML&gt; を使えだそうです。そこで、各ページの先頭に&nbsp;&lt;!DOCTYPE HTML&gt;&nbsp; を入れると警告メッセージは出なくなったのですけど、画面のレイアウトが不正になってしまいました。</p>
<p>調べてみると「後方互換で動いているので画面のレイアウトが不正になる可能性がある」らしい。でも&nbsp;&lt;!DOCTYPE HTML&gt; を削除すれば正しいレイアウトになる、何じゃ、コレ。</p>
<p>どうやら JavaScript が function の途中で処理を打ち切っているらしい。（これ、JavaScript の仕様なんですね。エラーが起こると、その時点で処理を打ち切る）</p>
<p>...style="width:100;" などの行に単位「px, %」がないのが原因でした。</p>
<p>旧仕様：単位が記述されていない場合は「px である」として動作する。</p>
<p>新仕様：単位が記述されていない場合はエラーとする。</p>
<p>のようです。そこらじゅう直して動くようになりました。それにしても「単位が記述されていない場合は px であるとみなす」のではどんな不具合が起こるのでしょうか。理解できないけど、動いたから、まっ、いいか。</p>
<p></p></div>
]]>
</content>


    </entry>
    <entry>
        <title>Select　Option の代替品（１０）</title>
        <link rel="alternate" type="text/html" href="http://reclib.blog.enjoy.jp/blog/2021/11/selectoption-62db.html" />
        <link rel="replies" type="text/html" href="http://reclib.blog.enjoy.jp/blog/2021/11/selectoption-62db.html" thr:count="0" />
        <id>tag:app.blog.enjoy.jp,2003:post-59508374</id>
        <published>2021-11-26T16:04:47+09:00</published>
        <updated>2021-11-26T16:04:49+09:00</updated>
        <summary>Window 幅を直前のページから受け取り、それを基準にしていたのですが、ウイン...</summary>
        <author>
            <name>reclib</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="インターネット・パソコン" />
        
        
<content type="html" xml:base="http://reclib.blog.enjoy.jp/blog/">
<![CDATA[
<div xmlns="http://www.w3.org/1999/xhtml"><p>Window 幅を直前のページから受け取り、それを基準にしていたのですが、ウインドウの横幅を大きくしたり小さくしたり・・があるんですよね。幅を縮小するとページ作成を再実行しようが何をしようがうまくいかない。当たり前なんだけど、こういうのって直面するまで気づかないのは「よくある事」で（なに、お前が不注意なだけだって？？）。</p>
<p>で、どうするかと言うと、ページ起動時に window 幅と「サーバー側にある」幅を示すパラメータ値を取得して実際の幅を決める方法です。似たような小細工は「音源の再生」の場面でもやったのですが、面倒なので誤魔化そうとしていたんです。</p>
<p>どうやったかと言うと、Jsp, Java&nbsp; プログラムが JavaScript から参照したいサーバー側のパラメータを JavaScript のグローバル変数として書き出しておいて、JavaScript&nbsp; はそれを参照する、というだけです。片方向だけどパラメータを受け渡す事ができますね。やれやれ。余計な手間がかかってしまった。（手を抜くとロクなことないぞ・・・分かっているんですけどね・・・）</p>
<p></p>
<p></p></div>
]]>
</content>


    </entry>
    <entry>
        <title>Select　Option の代替品（９）</title>
        <link rel="alternate" type="text/html" href="http://reclib.blog.enjoy.jp/blog/2021/11/selectoption-d09b.html" />
        <link rel="replies" type="text/html" href="http://reclib.blog.enjoy.jp/blog/2021/11/selectoption-d09b.html" thr:count="0" />
        <id>tag:app.blog.enjoy.jp,2003:post-59504586</id>
        <published>2021-11-19T18:38:26+09:00</published>
        <updated>2021-11-19T18:38:27+09:00</updated>
        <summary>MySelect の幅、％単位での指定は、うまくいかないので諦めました。親要素の...</summary>
        <author>
            <name>reclib</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="インターネット・パソコン" />
        
        
<content type="html" xml:base="http://reclib.blog.enjoy.jp/blog/">
<![CDATA[
<div xmlns="http://www.w3.org/1999/xhtml"><p>MySelect の幅、％単位での指定は、うまくいかないので諦めました。親要素の幅が分かればいいんですけど、サーバー側からはクライアント上のブラウザの内にある情報なんか見えない。要素の幅をサーバーへ送信するページとかを作れば出来るはずですが、とっても面倒。結局％指定はあきらめて、「ウインドウ幅の１／２０」を基準とした幅の単位を定義して％単位の代わりにしました。</p>
<p>ここで必用なのはウインドウ幅なんですが、これもクライアント上のブラウザ内の情報なので簡単には取得できません。そこで、直前のページの幅を基準として使う事にしました。これならば各ページが window.innerWidth の値を送信～受信して幅を算出すれば良い。なんとかなりました。（送受信するパラメータが、また１つ増えてしまった）</p>
<p></p>
<p>おまけ的な機能、背景色の指定を作っていたのですが、Html, CSS, JavaScript に遊ばれてしまいました。背景色の指定には bgColoe=...,、 style backgroundColor:...、element.style.backgroundColoe、element.style.background=... などがあり、同じ意味、目的なのに相手によって使い分けなくてはいけない。うっかり element.style.background-color などと書くとエラーになる。「-」が演算子と解釈されるみたい。</p>
<p>style="background-color:'red' はＮＧで、style="background-color:red と書かなくてはならない。一方、element.style.background=red と書くとエラー（そんな変数はない）で、element.style.background='red' と書かなくてはならない。</p>
<p>Html、CSS、JavaScript は統一的に設計～仕様を決定ではなくて、デファクトスタンダードを寄せ集めたように思えるので、仕方ないか。それにして何とかならんのか。と言って、今から仕様を追加しても古い仕様を捨てるわけにもいかない。せいぜい「古い仕様なので推奨しない」と警告するくらいしか出来そうにありませんね。</p>
<p>我慢して使うしかなさそうです。</p>
<p></p>
<p>、</p>
<p></p>
<p></p></div>
]]>
</content>


    </entry>
    <entry>
        <title>Select　Option の代替品（８）</title>
        <link rel="alternate" type="text/html" href="http://reclib.blog.enjoy.jp/blog/2021/11/selectoption-e76e.html" />
        <link rel="replies" type="text/html" href="http://reclib.blog.enjoy.jp/blog/2021/11/selectoption-e76e.html" thr:count="0" />
        <id>tag:app.blog.enjoy.jp,2003:post-59501882</id>
        <published>2021-11-15T19:43:46+09:00</published>
        <updated>2021-11-15T19:43:48+09:00</updated>
        <summary>onChange のハンドラをどうやって起動するかで苦戦していましたが、結局 通...</summary>
        <author>
            <name>reclib</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="インターネット・パソコン" />
        
        
<content type="html" xml:base="http://reclib.blog.enjoy.jp/blog/">
<![CDATA[
<div xmlns="http://www.w3.org/1999/xhtml"><p>onChange のハンドラをどうやって起動するかで苦戦していましたが、結局</p>
<p>通常の &lt;Select&gt; タグの onChange 記述するスクリプトを「そのまま」文字列として受け取り、eval() で起動することにしました。</p>
<p>&lt;Select ... onChange="onChanheFunction(param1, param2,...)" であれば、</p>
<p>文字列「"onChanheFunction(param1, param2,...)" 」を受取り、</p>
<p>eval("onChanheFunction(param1, param2,...)" ) とするわけです。</p>
<p>param に document,MyForm.TextBox.Value のようにタグなどが記述されていても、きちんと評価して実行してくれます。</p>
<p>MDN などによると、eval() にはセキュリティー上のリスクがある上、負荷が重いので【使うな】となっています。確かに不特定の文字列を評価して実行するならば、たとえばユーザーが text box などに入力した文字列を実行するならば「とっても危険」でしょう。でも、私のシステムの場合は、本来は &lt;Select onChange &gt; に記述するものを eval() で実行しているだけです。これで eval() が危険と言うならば、onChange に何か書くと危険という事になってしまいますよね。</p>
<p>悪意のあるユーザーが Jsp, Java ファイルを改変して実行するならば、あるいは、「ページのソース」で取得したものを改変して実行可能ならば eval() なんか関係なしで「とっても危険」ですけどね。</p>
<p>ということで、eval() を使う事にしました。</p>
<p>これをやっていて分かった（分かった気になっている）こと。</p>
<p>・function を呼び出す時のパラメータの評価は、function を呼び出す前に（呼び出す処理の一部として）行われるようだ。</p>
<p>function testFunc(aaa){</p>
<p>&nbsp; console.log(aaa);</p>
<p>}</p>
<p>testFunc(document.MyForm.MyTextBox.value);</p>
<p>などとして、myTextBox に入力された値を表示しようとした時、「document.MyForm.MyTextBox.value」は function testFunc が呼び出される前に（testFunc(document.MyForm.MyTextBox.value); を認識してから testFunc の実行が始まるまでの間に）評価されるらしい。つまり、function の一部として引数の評価をしているわけではないらしい。</p>
<p>function は arguments を参照する事ができますが、arguments には引数リストに記述していない物も含まれています。という事は、function 実行開始前に評価されている、という事でしょうね。function 実行開始後に評価されるならば、eval()&nbsp; などとしなくても実行できるでしょうね。</p>
<p></p>
<p>さてさて、今ハマっているのは、MySelect の幅の指定なんです。幅をピクセル単位で指定するのは問題なくいのですが、% で指定するのに手こずっています。親要素の幅の「○％」なんですが、サーバー側では親要素が何であるかは認識できても、それの幅（クライアント側で動作しているブラウザが作成した画面内の「要素の幅」なんか取得のしようがありません（当たり前だけど）。さてさて、どうしようか。</p>
<p>％での指定が出来ないのは不便なんだけど、クライアント環境での幅（ピクセル数）なんかサーバープログラマは想定できませんよね。</p>
<p>現状では、各ページ起動時に window 幅を取得して、幅によってＰＣ版、スマホ版を切替えています。必用に応じて同じページのＰＣ版／スマホ版を呼び出すだけなんですけど、切替える時に取得した windoe.clientWidth などをサーバーに送信して、それを基準に何か出来ないか、などと考えています。</p>
<p>幸いな事に「ＣＤ・ＬＰ管理システム」では画面幅を２０等分して &lt;TD&gt; などの幅を決めているので、何とかなりそうですね。</p>
<p>という所で、今日はこれでおしまい。一杯やっちゃったから。</p>
<p></p>
<p></p>
<p></p>
<p>の内容「aaa」</p>
<p></p>
<p></p></div>
]]>
</content>


    </entry>
    <entry>
        <title>Select　Option の代替品（７）</title>
        <link rel="alternate" type="text/html" href="http://reclib.blog.enjoy.jp/blog/2021/11/selectoption-1135-1.html" />
        <link rel="replies" type="text/html" href="http://reclib.blog.enjoy.jp/blog/2021/11/selectoption-1135-1.html" thr:count="0" />
        <id>tag:app.blog.enjoy.jp,2003:post-59500219</id>
        <published>2021-11-12T18:19:15+09:00</published>
        <updated>2021-11-15T18:42:46+09:00</updated>
        <summary>  の代替品を作ったのは、ＣＤ、ＬＰデータ管理デ...</summary>
        <author>
            <name>reclib</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="インターネット・パソコン" />
        
        
<content type="html" xml:base="http://reclib.blog.enjoy.jp/blog/">
<![CDATA[
<div xmlns="http://www.w3.org/1999/xhtml"><p>&lt;Select&gt; &lt;Option&gt; の代替品を作ったのは、ＣＤ、ＬＰデータ管理データベースのスマホ版に使用するためでした。実際に組み込もうとして見直したら、いくつかの問題が見つかりました。<br />（１）「初期状態で選択されているオプションがない場合は、最初のオプションを選択状態とする」が未作成だった。<br />（２）選択肢表示ウインドウの幅が固定である。オプションリストの幅を決めるには、選択肢キャプションの長さ（文字数ではなく、画面上でのピクセル数が必用なんですが、それを調べるのに時間がかかってしまいました。以下の方法で取得できました。 &lt;canvas id=\"canvas\" width=\"0\" height=\"0\" style=\"visibility:hidden;position:absolute;\"&gt;&lt;/canvas&gt;canvas はグラフィックやアニメーションのための要素だそうですが、使った事はなかった。<br /> var canvas = document.getElementById('canvas'); var context = canvas.getContext('2d'); var maxOptionLength = 0; metrics = context.measureText(optionText); if(maxOptionLength &lt; metrics.width){ maxOptionLength = metrics.width; }としてキャプションの最大長さを取得しました。<br />・オプションリストに使える幅（可能な最大幅）を得る。画面幅から適当な余白を差し引いた幅。・キャプションの最大長さが可能な最大幅よりも小さい場合は、キャプションの最大長さをオプションリストの幅とする。・そうでない場合は、長いキャプションの末尾を切り捨て、省略記号「…」とする。これを実現するために、&lt;li style に「overflow:hidden;white-space:nowrap; text-overflow:ellipsis;」を付け加えました。キャプションが長すぎるものにだけ付加すればいいのだけど、面倒なので全部に付加しました。後は左右の位置を適当に決めれば良い。MySelect 左端から右側の余地が十分な場合は MySelect の左端に揃えて、そうでない場合は画面右側に適度な余白がある位置としました。<br />（３）onChange などのイベントハンドラを起動できない。記述してなかったので起動できるわけはなかったのですが・・・。ちょっと苦戦しましたが、何とかなりました。とりあえず必用なのは onChange なので、それだけを実装しました。本来の &lt;Select&gt; はイベント change を投げるのでしょうが、MySelect では指定された function を実行するようにしました。理由は mySelect は Html のタグではなく、私の応用では Java のメソッドで書き出すようになっているからです。苦戦した理由は、change を検出できるのは function setValue() 内なのですが、その場所に直接に直接呼び出すべき function を記述するのはまずいからです。そんな事をすると汎用性なしになってしまいますからね。MySelect を書き出すメソッドに change で起動すべき function と、その function に渡すパラメータを引数として渡すように、それを etValue へ引数として渡すようにしました。手こずったのは、setValue() に引数で渡す function と function のパラメータでした。setValue() へのパラメータを記述する部分で呼び出すべき function などを「'」（シングルクォート）で囲んでいたのが原因でした。受け取った setValue() は文字列だと解釈していたのですね。確かに、文字列は function ではない。「'」で囲むのをやめたらＯＫでした。次に問題になったのは、onChange function に渡すパラメータでした。パラメータの数は MySelect を書き出す Java のメソッドが決めるのではなく、そのメソッドを呼び出すもの（私のアプリでは別の Java メソッド）が決めるんです。調べているうちに、JavaScript に arguments というのがある事が分かりました。やれやれ、何とかなりました。</p>
<p>後は冗長な部分を直すとかですね。</p>
<p></p></div>
]]>
</content>


    </entry>
    <entry>
        <title>Select　Option の代替品（６）</title>
        <link rel="alternate" type="text/html" href="http://reclib.blog.enjoy.jp/blog/2021/11/selectoption-1135.html" />
        <link rel="replies" type="text/html" href="http://reclib.blog.enjoy.jp/blog/2021/11/selectoption-1135.html" thr:count="0" />
        <id>tag:app.blog.enjoy.jp,2003:post-59495294</id>
        <published>2021-11-05T08:42:45+09:00</published>
        <updated>2021-11-05T08:42:47+09:00</updated>
        <summary>（５）でＵｐした html をコピペ～保存して Firefox で試したところ、...</summary>
        <author>
            <name>reclib</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="インターネット・パソコン" />
        
        
<content type="html" xml:base="http://reclib.blog.enjoy.jp/blog/">
<![CDATA[
<div xmlns="http://www.w3.org/1999/xhtml"><p></p>
<p>（５）でＵｐした html をコピペ～保存して Firefox で試したところ、動作しました。</p>
<p></p>
<p>今分かっている問題点や改善したい点など</p>
<p>・クリックする場所によってはオプションリストが閉じない場合がある。</p>
<p>アドレスバーやメニューバーなどをクリックしても閉じません。どんなイベントが発生するのかが分からないので、ハンドラを登録できないからです。調べてみても（今のところ）分かっていません。まぁ、そんな場所で発生したイベントの処理が【重要な】アプリは殆どないと思えるので、情報が少ないのです。</p>
<p>実際に動かしてみても、さほどの問題ではないので、放置しています。</p>
<p></p>
<p>・オプションリストの幅</p>
<p>選択肢のキャプションに長いものがあった場合、現状では折り返して表示されます。</p>
<p>文字列は折り返されるのですが、背景色が「選択色」になるのは１行だけ。そのように作ったわけではなく、「やってみたらそうなった」だけなんですが、あまりかっこよくない。</p>
<p>文字列の最大長さは (2 ** 32)-1 だったような記憶がある。何にしても極端に長い文字列があり得るので、何らかの制限を付ける方がいいかな。選択肢に画面全体を使っても表示できないものを記述するとも思えないけどね。</p>
<p>リストの表示幅を拡げる、背景色を変える範囲を何とかする、省略記号（…）を使うなどが考えられますが、それは「実用品」として使う時に考えよう。</p>
<p></p>
<p>さて、ずいぶん長い間作業が止まっていた「ＥＳＬ－６３改造」を再開するかな。。。</p>
<p></p>
<p></p></div>
]]>
</content>


    </entry>
    <entry>
        <title>Select　Option の代替品（５）</title>
        <link rel="alternate" type="text/html" href="http://reclib.blog.enjoy.jp/blog/2021/11/selectoption-ec17.html" />
        <link rel="replies" type="text/html" href="http://reclib.blog.enjoy.jp/blog/2021/11/selectoption-ec17.html" thr:count="0" />
        <id>tag:app.blog.enjoy.jp,2003:post-59495265</id>
        <published>2021-11-05T08:01:49+09:00</published>
        <updated>2021-11-05T08:01:51+09:00</updated>
        <summary>!-- ・サンプルの Html ファイル （１）適当なテキストエディタにコピペ...</summary>
        <author>
            <name>reclib</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="インターネット・パソコン" />
        
        
<content type="html" xml:base="http://reclib.blog.enjoy.jp/blog/">
<![CDATA[
<div xmlns="http://www.w3.org/1999/xhtml"><p>&lt;!--</p>
<p>・サンプルの Html ファイル</p>
<p>（１）適当なテキストエディタにコピペして適当なフォルダに保存し、</p>
<p>（２）ブラウザからファイルとして開いてください。</p>
<p>Firefox ならば、【ファイル】【ファイルを開く】とすれば開くことができます。Chtome, Edge にはそのようなメニュー等はないようです。アドレスバーにファイルの URL を直接入力すれば開く事ができます。入力する URL は「file:///C:/ ファイルのパス名」などとします。</p>
<p>【送信】ボタンをクリックするとパラメータを送出し、自分自身を呼び出します。通常、送信先のＵＲＬ を指定してから送信しますが、このテストページではＵＲＬは指定していない（自分自身なので）ので、保存する時のファイル名はどのような名前でもかまいませんが、拡張子は「.html」とするのが無難でしょう。ブラウザが「html ファイルではない」と誤解するとまずいので。<br />以下のサンプルは</p>
<p>・コメントは削除してあります。ブログ入力ソフトが「通常の文書」として処理する過程で余分なスペースや、時には改行などを削除したりするので、必用な行の先頭に「//」があるかに見える場合があるからです。</p>
<p>・私の環境では動作していますが、動作を保証するものではありません。念のため。</p>
<p>・動かなかったり、変な動きをした場合には動作環境を明示してコメントを頂けると幸いです。もっとも、私が同じような環境でテストできるか、は別問題ですが。</p>
<p>--&gt;</p>
<p>&lt;html&gt;&lt;Head&gt; &lt;meta contentType="text/html"; charset="utf-8"; pageEncoding="utf-8"&gt; &lt;Title&gt;&amp;lt;select&amp;gt;&amp;lt;option&amp;gt; の代替品のテスト&lt;/Title&gt;&lt;/Head&gt;<br />&lt;Body onLoad="onLoadFunction()"&gt;&lt;Form name="TEST" method="get"&gt;&lt;p&gt;&amp;lt;select&amp;gt;&amp;lt;option&amp;gt; の代替品のテスト&lt;/p&gt;&lt;BR&gt;&lt;BR&gt;&lt;span style="outline:solid thin;width:150px;" id="MySel0" onClick="dispMyOption('MySel0','MySelT0','MyOpt0','MyUl0','17')"&gt;&lt;input type="text" readonly style="cursor:default;outline:none;border:none;width:135px;height:40px;" id="MySelT0" value=""&gt;&lt;input type="text" readonly style="cursor:default;outline:none;border:none;text-align:right;width:15px;height:40px;" value="v " class="aH"&gt;&lt;/span&gt;&lt;input type="hidden" name="TestParam" value=""&gt;<br />&lt;div id="MyOpt0" style="display:none;position:fixed;border:1px solid #000;background-color:#fff;"&gt;&lt;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"&gt;<br />&lt;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')"&gt;アイルランド&lt;/li&gt;&lt;li onMouseOut="onMouseOutFunction('MySel0',this,'1');" onMouseOver="this.style.background='lightskyblue';" style="text-align:left;padding-left:20;padding-top:10;padding-bottom:10;" onClick="setValue('MySel0','MySelT0','MyOpt0','278','アメリカ','1','TestParam')"&gt;アメリカ&lt;/li&gt;&lt;li onMouseOut="onMouseOutFunction('MySel0',this,'2');" onMouseOver="this.style.background='lightskyblue';" style="text-align:left;padding-left:20;padding-top:10;padding-bottom:10;" onClick="setValue('MySel0','MySelT0','MyOpt0','242','イギリス','2','TestParam')"&gt;イギリス&lt;/li&gt;&lt;li onMouseOut="onMouseOutFunction('MySel0',this,'3');" onMouseOver="this.style.background='lightskyblue';" style="text-align:left;padding-left:20;padding-top:10;padding-bottom:10;" onClick="setValue('MySel0','MySelT0','MyOpt0','223','イタリア','3','TestParam')"&gt;イタリア&lt;/li&gt;&lt;li onMouseOut="onMouseOutFunction('MySel0',this,'4');" onMouseOver="this.style.background='lightskyblue';" style="text-align:left;padding-left:20;padding-top:10;padding-bottom:10;" onClick="setValue('MySel0','MySelT0','MyOpt0','207','オーストリア','4','TestParam')"&gt;オーストリア&lt;/li&gt;&lt;li onMouseOut="onMouseOutFunction('MySel0',this,'5');" onMouseOver="this.style.background='lightskyblue';" style="text-align:left;padding-left:20;padding-top:10;padding-bottom:10;" onClick="setValue('MySel0','MySelT0','MyOpt0','230','オランダ','5','TestParam')"&gt;オランダ&lt;/li&gt;&lt;li onMouseOut="onMouseOutFunction('MySel0',this,'6');" onMouseOver="this.style.background='lightskyblue';" style="text-align:left;padding-left:20;padding-top:10;padding-bottom:10;" onClick="setValue('MySel0','MySelT0','MyOpt0','218','ギリシャ','6','TestParam')"&gt;ギリシャ&lt;/li&gt;&lt;li onMouseOut="onMouseOutFunction('MySel0',this,'7');" onMouseOver="this.style.background='lightskyblue';" style="text-align:left;padding-left:20;padding-top:10;padding-bottom:10;" onClick="setValue('MySel0','MySelT0','MyOpt0','238','スペイン','7','TestParam')"&gt;スペイン&lt;/li&gt;&lt;li onMouseOut="onMouseOutFunction('MySel0',this,'8');" onMouseOver="this.style.background='lightskyblue';" style="text-align:left;padding-left:20;padding-top:10;padding-bottom:10;" onClick="setValue('MySel0','MySelT0','MyOpt0','212','チェコ','8','TestParam')"&gt;チェコ&lt;/li&gt;&lt;li onMouseOut="onMouseOutFunction('MySel0',this,'9');" onMouseOver="this.style.background='lightskyblue';" style="text-align:left;padding-left:20;padding-top:10;padding-bottom:10;" onClick="setValue('MySel0','MySelT0','MyOpt0','213','デンマーク','9','TestParam')"&gt;デンマーク&lt;/li&gt;&lt;li onMouseOut="onMouseOutFunction('MySel0',this,'10');" onMouseOver="this.style.background='lightskyblue';" style="text-align:left;padding-left:20;padding-top:10;padding-bottom:10;" onClick="setValue('MySel0','MySelT0','MyOpt0','217','ドイツ','10','TestParam')"&gt;ドイツ&lt;/li&gt;&lt;li onMouseOut="onMouseOutFunction('MySel0',this,'11');"&nbsp; onMouseOver="this.style.background='lightskyblue';" style="text-align:left;padding-left:20;padding-top:10;padding-bottom:10;" onClick="setValue('MySel0','MySelT0','MyOpt0','113','日本','11','TestParam')"&gt;日本&lt;/li&gt;&lt;li onMouseOut="onMouseOutFunction('MySel0',this,'12');" onMouseOver="this.style.background='lightskyblue';" style="text-align:left;padding-left:20;padding-top:10;padding-bottom:10;" onClick="setValue('MySel0','MySelT0','MyOpt0','231','ノルウェー','12','TestParam')"&gt;ノルウェー&lt;/li&gt;&lt;li onMouseOut="onMouseOutFunction('MySel0',this,'13');" onMouseOver="this.style.background='lightskyblue';" style="text-align:left;padding-left:20;padding-top:10;padding-bottom:10;" onClick="setValue('MySel0','MySelT0','MyOpt0','220','ハンガリー','13','TestParam')"&gt;ハンガリー&lt;/li&gt;&lt;li onMouseOut="onMouseOutFunction('MySel0',this,'14');" onMouseOver="this.style.background='lightskyblue';" style="text-align:left;padding-left:20;padding-top:10;padding-bottom:10;" onClick="setValue('MySel0','MySelT0','MyOpt0','216','フランス','14','TestParam')"&gt;フランス&lt;/li&gt;&lt;li onMouseOut="onMouseOutFunction('MySel0',this,'15');" onMouseOver="this.style.background='lightskyblue';" style="text-align:left;padding-left:20;padding-top:10;padding-bottom:10;" onClick="setValue('MySel0','MySelT0','MyOpt0','208','ベルギー','15','TestParam')"&gt;ベルギー&lt;/li&gt;&lt;li onMouseOut="onMouseOutFunction('MySel0',this,'16');" onMouseOver="this.style.background='lightskyblue';" style="text-align:left;padding-left:20;padding-top:10;padding-bottom:10;" onClick="setValue('MySel0','MySelT0','MyOpt0','232','ポーランド','16','TestParam')"&gt;ポーランド&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;BR&gt;&lt;BR&gt;&lt;input type="button" style=\"-webkit-appearance:none;height:40px;\" value="送信" onClick="reload()"&gt;&lt;/Form&gt;&lt;script language="JavaScript"&gt;var selectedCode = '';var codeIDList = [ [222, 'アイルランド'], [278, 'アメリカ'], [242, 'イギリス'], [223, 'イタリア'], [207, 'オーストリア'], [230, 'オランダ'], [218, 'ギリシャ'], [238, 'スペイン'], [212, 'チェコ'], [213, 'デンマーク'], [217, 'ドイツ'], [113, '日本'], [231, 'ノルウェー'], [220, 'ハンガリー'], [216, 'フランス'], [208, 'ベルギー'], [232, 'ポーランド'] ];var initialSelection = -1;<br />function onLoadFunction(){ document.addEventListener('auxclick', closeMyOption, {capture:true}); document.addEventListener('scroll', closeMyOption, {capture:true}); document.addEventListener('keydown', closeMyOption, {capture:true}); document.addEventListener('mousedown', mouseDownHandler, {capture:true}); var urlStr = document.location.search; initialSelection = -1; if((urlStr != null) &amp;&amp; (urlStr.length != 0)){ var eqPos = document.location.search.indexOf('='); selectedCode = urlStr.substring(eqPos + 1); if(selectedCode != ''){ for(var i=0; i&lt;codeIDList.length; i++){ if(codeIDList[i][0] == selectedCode){ initialSelection = i; var mySelectElement = document.getElementById('MySelT0'); mySelectElement.value = codeIDList[i][1]; break; } } } }}<br />var activeMySelect=null;var activeMyOption=null;var selectedItems=null;var normalHeight=20;<br />function dispMyOption(mySelectID, mySelectTextID, myOptionID, myUlID, numOptions){ var myOptionElement = document.getElementById(myOptionID); var ulElement = document.getElementById(myUlID); if(activeMyOption != null){ myOptionElement.style.display='none'; activeMyOption=null; activeMySelect=null; return; } var selectedNo = -2; if(selectedItems == null){ selectedItems = new Array(0); } for(var i=0; i&lt;selectedItems.length; i++){ if(selectedItems[i][0] == mySelectID){ selectedNo = selectedItems[i][1]; break; } } if(selectedNo == -2){ selectedNo = initialSelection; var workArray = new Array(2); workArray[0] = mySelectID; workArray[1] = selectedNo; selectedItems.push(workArray); } var optionRows = ulElement.children;<br /> for(var i=0; i&lt;optionRows.length; i++){ optionRows[i].style.backgroundColor=''; } if(selectedNo != -1){ var selectedRow = optionRows[selectedNo]; selectedRow.style.backgroundColor='aquamarine'; } var mySelectTextElement = document.getElementById(mySelectTextID); var mySelectTextRect = mySelectTextElement.getBoundingClientRect(); var mySelectElement = document.getElementById(mySelectID); var mySelectRect = mySelectElement.getBoundingClientRect(); var mySelectTop = mySelectTextRect.top; var mySelectBottom = mySelectTextRect.bottom; var mySelectLeft = mySelectRect.left; var mySelectWidth = mySelectRect.width; var myOptionLiHeight=normalHeight + 20; var myOptionTotlaHeight=myOptionLiHeight * numOptions; var windowHeight=window.innerHeight; var upperMatgin=mySelectTop; var lowerMargin=windowHeight-mySelectBottom; var dispAbove=false; var numRows = 0; if((upperMatgin &lt; myOptionTotlaHeight) &amp;&amp; (lowerMargin &lt; myOptionTotlaHeight)){ dispAbove = lowerMargin &lt; upperMatgin; var margine; if(dispAbove){ margin = upperMatgin; }else{ margin = lowerMargin; } numRows = Math.floor(margin / myOptionLiHeight); myOptionTotlaHeight = myOptionLiHeight * numRows; }else{ dispAbove = lowerMargin &lt; myOptionTotlaHeight; } ulElement.style.height = myOptionTotlaHeight; ulElement.style.width = mySelectWidth; if(dispAbove){ myOptionElement.style.top = mySelectTop - myOptionTotlaHeight; }else{ myOptionElement.style.top = mySelectBottom; } myOptionElement.style.left = mySelectLeft; var listElement=document.getElementById(myOptionID); listElement.style.display='block'; for(var i=0; i&lt;optionRows.length; i++){ optionRows[i].style.height=normalHeight; } var scrollRows = 0; if(selectedNo != 0){ var maxScrollRows = numOptions - numRows; var scrollOffset = Math.floor(numRows / 2); scrollRows = selectedNo - scrollOffset; if(scrollRows &lt; 0){ scrollRows = 0; }else{ if(maxScrollRows &lt; scrollRows){ scrollRows = maxScrollRows; } } } ulElement.scrollTop=scrollRows * myOptionLiHeight; activeMyOption=myOptionID; activeMySelect=mySelectID;}<br />function mouseDownHandler(e){ if(activeMyOption == null){ return; } var mySelector='#' + activeMySelect; if(e.target.closest(mySelector) != null){ return; } closeMyOption(e);}<br />function closeMyOption(e){ if(activeMyOption == null){ return; } var eventType=e.toString(); if(eventType.indexOf('KeyboardEvent') != -1){ var keyCode=e.key; if((keyCode != 'Escape') &amp;&amp;(keyCode != 'OS') &amp;&amp;(keyCode != 'F10') &amp;&amp;(keyCode != 'Tab') &amp;&amp; (keyCode != 'Enter')){ return; } } var targetObjType = e.target.toString(); var posEllement=targetObjType.indexOf('Element'); var closeIt=false; if(posEllement == -1){ closeIt = true; }else{ var mySelector='#' + activeMyOption; closeIt = e.target.closest(mySelector) == null; } if(!closeIt){ return; } var myOptionElement=document.getElementById(activeMyOption); myOptionElement.style.display='none'; activeMyOption=null; activeMySelect=null;}<br />function setValue(mySelectID, mySelectTextID, myOptionID, codeID, caption, rowNo, htmlParamName){ var mySelectElement = document.getElementById(mySelectTextID); var myOptionElement=document.getElementById(myOptionID); mySelectElement.value=caption; var hiddenElements = document.getElementsByName(htmlParamName); hiddenElements[0].value=codeID; for(var i=0; i&lt;selectedItems.length; i++){ if(selectedItems[i][0] == mySelectID){ selectedItems[i][1] = rowNo; break; } } myOptionElement.style.display='none'; activeMyOption=null; activeMySelect=null;}<br />function onMouseOutFunction(MySelID, liElement, rowNo){ for(var i=0; i&lt;selectedItems.length; i++){ if(MySelID == selectedItems[i][0]){ if(rowNo == selectedItems[i][1]){ liElement.style.background='aquamarine'; }else{ liElement.style.background=''; } return; } }}function reload(){ document.TEST.submit();}&lt;/script&gt;&lt;/BODY&gt;&lt;/HTML&gt;</p></div>
]]>
</content>


    </entry>
 
</feed>
