JavaScript for CSS (9)

スタイルシートには代替スタイルシートという方法が用意されています。Netscape6はメニューで選択することができますが、IEでも同等の機能を実現することを考えます。

<LINK rel="alternate stylesheet" type="text/css" href="new2.css"
   title="代替スタイル" media="screen, print">
<LINK rel="stylesheet" type="text/css" href="new1.css"
   title="通常スタイル" media="screen, print">
<LINK rel="stylesheet" type="text/css"
   href="../index.css" media="all">
<LINK rel="stylesheet" type="text/css"
   href="js.css" media="all">
<SCRIPT type="text/javascript">
<!--
if(document.styleSheets){
 var sS=document.styleSheets;
 var LINKs= document.all ?
  document.all.tags("LINK") : document.getElementsByTagName("LINK");
}
//-->
</SCRIPT>

IE4以降やNetscape6では、StyleSheetオブジェクトのdisabledプロパティは、LINK rel="stylesheet"の場合はfalse、rel="alternate stylesheet"ならtrueになっています。※ MacIEは、4.5以降でないとrel="alternate stylesheet"のLINK要素をスタイルシートとして認識しません。

sS[0]の各プロパティ
Xif(sS) document.write(X)備考
sS[0].typereadonly
sS[0].disabled
sS[0].ownerNodereadonly
sS[0].parentStyleSheetreadonly
sS[0].hrefreadonly
sS[0].titlereadonly
sS[0].mediareadonly
各ブラウザの対応状況(sS[0])
プロパティMacIE4MacIE4.5MacIE5WinIE4/5/6Netscape6
typetext/csstext/csstext/csstext/csstext/css
disabled
ownerNodeundefinedundefinedundefinedundefined[object HTMLLinkElement]
parentStyleSheetnullnullnullnullnull
hrefnew1.cssnew2.cssnew2.cssnew2.csshttp://...new2.css
titleundefinedundefined代替スタイル代替スタイル代替スタイル
mediaundefinedprint,screenprint,screenscreen, print[object MediaList]

LINK要素としてアクセスすると、WinIEは何故かdisabledプロパティがfalseになってしまいます。LINK要素としては有効だけど、スタイルシートとしては無効といったような特殊な扱いなのかもしれません。

LINKs[0]の各プロパティ
Xif(LINKs) document.write(X)
LINKs[0].type
LINKs[0].disabled
LINKs[0].href
LINKs[0].title
LINKs[0].media

代替スタイルシート機能を模倣するには、以下のような関数を実行することになります。

<SCRIPT type="text/javascript">
<!--
function selectAlternate(){   // "代替スタイルシート"を選択
 if(!sS) return;

 for(var i=0; i<sS.length; i++)
  sS[i].title=="通常スタイル" ?
   sS[i].disabled=true : sS[i].disabled=false;
}

function selectNormal(){   // "通常スタイルシート"を選択
 for(var i=0; i<sS.length; i++)
  sS[i].title=="代替スタイル" ?
   sS[i].disabled=true : sS[i].disabled=false;
}

function none(){   // どちらも選択しない
 for(var i=0; i<sS.length; i++)
  sS[i].title ?
   sS[i].disabled=true : sS[i].disabled=false;
}
//-->
</SCRIPT>

これだけだと、他のページに移動すると無効になってしまうので、クッキーを利用して記憶させるとすると、最終的には以下のようになります。※ Netscape6ではきちんと動作しないようです

上のボタンで選択すると、クッキーが有効ならブラウザを終了させるまでこのページだけ選択が記憶されます(WinIE4以降/MacIE5/Netscape6のみ)。

<SCRIPT type="text/javascript">
<!--
var sS=document.styleSheets;

if(sS && navigator.cookieEnabled){
 var c=document.cookie;

 if(c.indexOf("sheet=none")!=-1){ // どちらも選択しない
  for(var i=0; i<sS.length; i++)
   if(sS[i].title) sS[i].disabled=true;
 }
 else if(c.indexOf("sheet=alternate")!=-1){ // 代替スタイルシート
  for(i=0; i<sS.length; i++){
   if(sS[i].title=="通常スタイル") sS[i].disabled=true;
   else if(sS[i].title=="代替スタイル") sS[i].disabled=false;
  }
 }

 window.onunload=setCookie;
}

function setCookie(){
 for(var i=0,text; i<sS.length; i++){
  if(sS[i].title=="通常スタイル" && sS[i].disabled==false){
    text="normal";
    break;
  }
  else if(sS[i].title=="代替スタイル" && sS[i].disabled==false){
    text="alternate";
    break;
  }
 }
 if(!text) text="none";

 document.cookie="sheet="+text+"; domain=.portland.ne.jp";
}
//-->
</SCRIPT>
</HEAD>