開発日記はここで続けると思うけど、最新版のテストは今日以降iDiskに移行。
一応名称は決定。考えてみれば「切り換え」ではなく「選択」の方が何となくいいかも。
スタイルシート名のリストから階層化された配列を出力し、そこからoptgroup
のメニューを書出す事が出来る様になった。ただ、抽象化は完了したものの書き出しの部分で階層化はまだ。ニ階層以上のグループが在るとバグる。
残念な事に、meta
でデフォルトスタイルを変えると見た目は変わるのだがUse Stylesheetメニューは変わらないと言う不思議な仕様になっている事が分かった。そしてスクリプトからの呼び出しでも同じ。今調べたから分かったのだが、link
要素におけるスタイルシートのdisabled
はDOM1で既に定義されている。
ビギナーのためのネットスケープ6講座のその他の情報によると、Geckoで<meta http-equiv="Default-Style" content="云々">
としてやれば、デフォルトのスタイルシートを切り換える事ができるらしい。これがスクリプトから書出されたタグでも認識するかどうか試した所、うまくいった。Cookieとクエリの処理は問題無いので、残る問題はフォームの書き出しだけだ。
StyleSheetとElementを同一視するべきなのかそうでは無いのかがさっぱり分からず。取り敢えず、HTMLの仕様的には代換スタイルシートの指定時にはstyle
要素は使うなと言う事なので、対処は見送り。
今まであんまり気にせずにことえりのなすがままにして来たけど、「きりかえ」って、「切り替え」「切り換え」「切替え」「切換え」「切替」「切換」のうち、どれが適当なんだろう?
HTML4仕様書には、固定スタイルシート、優先スタイルシート、代換スタイルシートの概念はlink
要素での指定でしか表現出来ないかの様な書き方なんだが、DOM2Style仕様書にはstyle
要素もDocumentStyle.styleSheets
に含まれるかの様な書き方がしてある。今の所IE5:macで確認した所ではDocumentStyle.styleSheets
にstyle
要素が含まれる事は無いみたいなので(これは多分に読み込み順に関係しているのでは無いかと僕は睨んでいるが)放っといているが、本当の所はownerNode
からちゃんと要素名を取得して処理するべきだろう。
今script
要素より前にstyle
要素を置いて試した所見事にlink
要素と同じ挙動をしてくれた。やっぱりHTMLの読み込みとスクリプトの処理順で得られるDocumentStyle.styleSheets
が違ってくる様だ。
確認したのはGecko、IE、Operaなのだが、IE以外は今の所全滅。Geckoは標準準拠を謳ってはいるけど、これだけに関して言えば本家本元のIEに劣る。Geckoがこの調子だから、他もあんまり期待出来そうにない。
window.onload=main;
だとデフォルトの妙な影響が残り、window.onload=main();
だとマトモになる事が分かった。JavaScriptの記法的にはどちらが正しいのだろう?
前述の方法は意味が無い。
optgroup
階層化を睨んでのメニューの抽象化。外部スタイルシートに関する仕様書の記述から得られる条件は、
title
のスタイルシートは同時には選ばれない。title
の優先スタイルシートを同時に指定してはいけない。title
を持つもののみ。こう言う細かなルールはDTDでは絶対に表現不可能なので、是非ともXML Schemaによる詳細なルール決定を望む。
form
application/x-www-form-urlencoded
でエンコーディングされたフォームデータの+が、もともとは半角スペースだったのか、或いはもとから+記号だったのかを区別する手段は無い。
対処法は二つ。form
の値に+記号は使わない。もう一つは、半角スペースを使わない。
代換スタイルシートと優先スタイルシートをオフにし、固定スタイルシートのみを適用している状態は必要か?
Geckoの実装に倣えばNo。
IE4:winでの動作を確認。あとは、永続スタイルシート(title
無しのlink
、?xml-stylesheet
、それにstyle
要素)に関するエスケープだ。
document.styleSheesを参照せずに、DOM1 Coreからdocument.getElementsByTagName("link")
で直接link
要素を参照してdisabled
を得てみたらalternate stylesheet
のもfalse
になっていた。もしlink rel="alternate stylesheet"
をStyleSheet
として認識しているのであればこれはどのスタイルシートも適用されていると言う意味になってしまう。結局、DOM2 Styleからのスタイルシート切り換えはMozillaでは無理と言う事か。
……となると、一体MozillaはUse Stylesheetメニューをどの様に実装しているのかと言う疑問が出てくる。一応代換スタイルシート選択の手順を用意しているもののJavaScript等からはアクセス不可能な為にクライアントサイドではCookieとの連係が取り様のないMozillaと、多少buggyなものの実装しておりJavaScriptからもアクセス可能なのに何故か表に出していないIEとどちらがマシなんだろう?
document.styleSheet.length
をキーにfor文を書くとUse Sylesheetメニューが潰れる事が分かった。
form
提出の時兎に角半角スペースは+になると分かったので取り敢えずtitleに半角スペースを使っても問題の無い様にした。あとはグループ分けとMozilla対策……グループ分けは何とかなりそうなんだが、MozillaのJavaScript実装次第だから如何ともし難い。
試しにオンロードから切り換えを呼び出してみた所、ロード中は一旦デフォルトが適用されロードが完了した時点で指定したスタイルシートに切り替わるのだが、どうもそれだとデフォルトの影響が残るようだ。もしや、これが原因でMozillaは実装を見送ったのか?
色々調べてみて、どうやらIE4:winはdocument.styleSheets
からスタイルシートを選ぶインターフェイスを備えているらしいと分かった。とすればウチのIE5:macでもいけるのでは?と試した所うまくいく。
ここでハタと考えてしまったのだが、JavaScriptからこれを実行して完璧に動作したと言う事はIEはWin、Mac問わず既に内部的に代換スタイルシートの機能を完璧に実装している事になる。何で表に出してくれない(泣)。
喜び勇んでMozillaで試したのだが……うまくいかない。何故かalert
を無視してくれるので途中経過報告をdocument.write
に頼らなければならないのは置いとくにしても、代換スタイルシートがUse Stylesheetメニューから全て消え失せて残るのはNoneとデフォルトのみ、しかも選択されるのはNoneと言うとんでもないバグだか仕様だかは一体何時からのモノなんだ?それとも、document.styleSheets
ではなくもっとちゃんとしたアクセスインターフェイスがDOM2HTMLで定義されていると言う事か?(恥ずかしながら未確認)。
兎に角、わかっている限りの現状ではN4はCSS的にも無視しているので置いておくとしても、IEのみスクリプトを適用してN6/Mozillaを弾かなければならないと言う悲しい結論に至る。
document.styleSheets
は標準には無いらしい。で、document.styleSheets[].addRule
には代換手段があるらしいのだが、document.styleSheetsそのものはざっと調べただけでは出て来ない。欲しいのはStyleSheetList
なんだが、一体何処から取得すればいいんだ?
DOM2StyleでもDocumentStyle
インターフェイスを実装したDocument
であればいいので、結局document.styleSheets
でStyleSheetList
を得ればいい事が分かった。だと言うのにちゃんと動かないので試しにdocument.styleSheets.length
を表示させてみたら1と出た。……考えられる可能性は二つ。Mozillaはこう言う類いの実装をしていない。か、別の所からStyleSheetListを取得しなければならない。