とことん標準に拘ったCSS切り替えスクリプト(その3) (agenda)の続き。今回からは具体的な設計に入ります。
「CSSの集合」をオブジェクトとして考えてみました。これを暫定的に「CSSList」と呼ぶことにします。つまり、例えばCSSを全て無効にする場合には:
CSSList.disableAll();
このような形式になります(disableAllはCSSを全て無効にするメソッド)。
そんな感じである程度煮詰めたのですが、CSSの集合、というか「スタイルシートのリスト」を扱うオブジェクトは既に存在するではありませんか。そう、document.styleSheets
です。先程の例はこうなります:
document.styleSheets.disableAll();
このように既存のオブジェクトの拡張を行なった方が直感的かと思われました。実装するには次のようにします。
document.styleSheets.disableAll = function(){
for (var i=0,len=this.length; i<len; i++)
this.item(i).disabled = true;
};
こんな調子でメソッドをどんどん加えていけば良いのですが、少し脱線して遊んでみました。
今更ですが、document.styleSheets
はオブジェクトです。ということはそれを作成した「鋳型」を参照できるかも知れません:
var StyleSheetList = document.styleSheets.constructor
こいつが関数オブジェクトであったなら占めたもの:
if (StyleSheetList instanceof Function) {
StyleSheetList.prototype.disableAll = function(){/*..*/};
}
document.styleSheets.disableAll();
このように、インターフェイスを拡張できます。ただ、今回の場合インスタンスがdocument.styleSheets
唯一つしかあり得ないので、悲しいことに、document.styleSheets
に直接メソッドを追加する方法と何の違いもありません。何れにしろ「鋳型」、というかコンストラクタを参照できるかどうかは実装依存なので、ウェブページ用のスクリプトには使用できません。
因みにMozillaの場合、Element
インターフェイスを持ったオブジェクトを作成するコンストラクタは「Element
」で参照できますから、こんなことができたりします:
Element.prototype.suicide = function(){
this.parentNode.removeChild(this);
};
//使用例
document.body.suicide();
脱線終わり。
というわけで、スタイルシートのリストを表すdocument.styleSheets
というオブジェクトを中心に、CSS切り替え機能を考えていくことになりました。主役は常にdocument.styleSheets
です。
オブジェクト指向なんて私は知りませんが、このようにオブジェクトを中心に考えると、JavaScriptは実に「しっくり」きます。「スタイルシートのリスト」を扱うオブジェクトが無かったら、自作していたでしょう(というかしました)。それだけの話です。
しかし自作した方が安全ではあります。
document.styleSheets
にメソッドを追加するとエラーになるブラウザがあるかも知れない
このような不安があるのです。この辺りを一応念頭に置きつつ、今後考えてゆくことになります。