このドキュメントの内容を、『DOMにより、エレメントを変化(へんげ)させる』というコンテンツで新しく書き直しました。
DOM4で追加されたインターフェイスに関しても記載しています。ぜひご覧ください。
これまでの方法は、個々のタグに対して、スタイルを変更するものでした。しかし、状況によっては、複数のタグの内容を、一度に変更したい場合が有ります。
このような場合、スタイルシートのセレクタ毎に、スタイルの内容を設定することができます。
IDLは、以下のようになります。
interface DocumentStyle {
readonly attribute StyleSheetList styleSheets;
};
インターフェイス、DocumentStyleは、documentオブジェクトに実装されているので、documentオブジェクトから、直接styleSheetsアトリビュートを参照できます。
interface StyleSheetList {
readonly attribute unsigned long length;
StyleSheet item(in unsigned long index);
};
itemメソッドは、定義されているスタイルシートがCSSの場合、CSSStyleSheetを返します。
interface CSSStyleSheet : stylesheets::StyleSheet {
-- 省略 --
readonly attribute CSSRuleList cssRules;
-- 省略 --
};
interface CSSRuleList {
readonly attribute unsigned long length;
CSSRule item(in unsigned long index);
};
interface CSSRule {
// RuleType
const unsigned short UNKNOWN_RULE = 0;
const unsigned short STYLE_RULE = 1;
const unsigned short CHARSET_RULE = 2;
const unsigned short IMPORT_RULE = 3;
const unsigned short MEDIA_RULE = 4;
const unsigned short FONT_FACE_RULE = 5;
const unsigned short PAGE_RULE = 6;
readonly attribute unsigned short type;
attribute DOMString cssText;
// raises(DOMException) on setting
readonly attribute CSSStyleSheet parentStyleSheet;
readonly attribute CSSRule parentRule;
};
interface CSSStyleRule : CSSRule {
attribute DOMString selectorText;
// raises(DOMException) on setting
readonly attribute CSSStyleDeclaration style;
};
まず、ドキュメントオブジェクトから、スタイルシートのリストを取得します。このリストの中には、ドキュメントに対して、linkエレメントでリンクされたスタイルシートや、stylesheetエレメントで指定されたスタイルシートが含まれます。
次に、スタイルシートの中から、必要なCSSRuleオブジェクトを検索します。このとき、セレクタ名称などで検索する方法は提供されないので、自分で用意することになります。
必要なCSSRuleオブジェクトさえ見つければ、後は特定のタグのスタイルを変更する場合と、大差有りません。但し、直接スタイルを変更できる、CSSStyleDeclarationオブジェクトを持っているのは、typeがSTYLE_RULE・FONT_FACE_RULE・PAGE_RULEのCSSRuleオブジェクトだけである点に注意が必要です。
また、同じセレクタを複数回定義している様な(カスケードしている)場合、当然同じセレクタ名称が複数見つかる事にも、注意する必要が有るでしょう。
下の例は、指定されたセレクタ名称のCSSRuleオブジェクトを返す関数です。どのような記述のスタイルシートにも対応させるためには、CSSRuleオブジェクトのselectorTextアトリビュートを判定する前に、RuleTypeがSTYLE_RULEかPAGE_RULEである事を、チェックしなければなりません。何故なら、それ以外のRuleTypeの場合、selectorTextアトリビュートが存在しないからです。
標準に準拠したスクリプトはIEでは動作しないので、非標準な実装も含んでいます。
function getCssRuleItemBySelector(selectorText) {
var styleList = document.styleSheets;
for (var i = 0; i < styleList.length; i ++) {
var styleSheet = styleList.item(i);
var cssRuleList;
if ('undefined' != typeof styleSheet.cssRules) {
/*
* 標準に準拠した実装
*/
cssRuleList = styleSheet.cssRules;
}
else {
/*
* 非標準な実装
*/
cssRuleList = styleSheet.rules;
}
for (var j = 0; j < cssRuleList.length; j ++) {
var cssRuleItem = cssRuleList.item(j);
if (cssRuleItem.selectorText == selectorText) {
return cssRuleItem;
}
}
}
return null;
}
上の関数を使って、日英を切替えるサンプルを作ってみました。「翻訳」ボタンを押すと、日英が切り替わります。実際のコードはこのページのソースを参照してください。
これは、ペンです。
This is a pen.
私の名前はマイクです。
My name is Mike.