ページに関するTips


・続コントロールパネル

NN2No good NN3OK NN4OK MozillaBug IE3No good IE4OK

この Tips集のようにブラウザのウィンドウを Frame で分割してレイアウトしたり 「コントロールパネル」の場合のように別ウィンドウで表示したりできますが、 どちらが良いかはページ構成もさることながら、ユーザの環境による要因もあります。

例えば、「画面が広いので別ウィンドウより Frame 分割の方が扱いやい」場合や、 「沢山のウィンドウで同時に作業しながら見るので別ウィンドウにして、 目次部分は縦長に、本文は横長にしたい」場合などです。

そこで、どちらの方式にするかをユーザに選択させたい場合も出てきます。

ということで、今度はウィンドウ方式とフレーム方式の切替えについてです。

表示方式をユーザが選択して切替える例

Frame方式の親( Default.htm )

<head>
    :
<script language="JavaScript"≶<!--
function unLoadWin(){} // ダミー関数
idxURL  = "contents.htm"; // パネルに表示するURL
idxName = "contents";     // パネルのウィンドウ名
idxPer  = "30";           // パネルの比率(横)
docURL  = "main.htm";     // 本文のURL
docName = "tips";         // 本文のウィンドウ名
document.write(
   '<frameset cols="'+idxPer+'%,*">'
  +'<frame src="'+idxURL+'" name="'+idxName+'">'
  +'<frame src="'+docURL+'" name="'+docName+'">'
  +'<\/frameset>');
);
// --></script>
    :
</head>

ウィンドウ方式の親( DefaultF.htm )

<head>
    :
<script language="JavaScript"><!--
idxURL    = "contents.htm"; // パネルに表示するURL
idxName   = "contents";     // パネルのウィンドウ名
docURL    = "main.htm";     // 本文のURL
docName   = "tips";         // 本文のウィンドウ名
                            // ウィンドウの装飾
features  = 'scrollbars,resizable,width=200,height=400';
menuWin   = window.open(idxURL,idxName,features);
function unLoadWin(){
  if(menuWin){
    if(!menuWin.closed) menuWin.close();
    menuWin = null;
  }
}
document.write(
   '<frameset rows="100%,*" border=0 framespacing=0 '
  +          'onUnload="unLoadWin()">'
  +  '<frame src="'+docURL+'" name="'+docName+'">'
  +'<\/frameset>
  );
// --></script>
    :
</head>

パネル( contents.htm )

<head>
    :
<script language="JavaScript"><!--
docName = "tips" // 本文のウィンドウ名

// 表示フレームを切替える関数
function checkTarget(link,extdoc){
  if(window.opener && link.target=='_top'){
    if(extdoc){
      window.opener.location = link.href;
      window.close();
      return false; // 念のめた
    } else kl.target=docName;
  }
  return true;
}
// --></script>
<script language="JavaScript1.1"><!--
frameTop   = 'Default.htm';      // Frame方式の親
frameLabel = 'フレームメニュー'; // ボタンのタイトル
floatTop   = 'DefaultF.htm';     // ウィンドウ方式の親
floatLabel = 'フロートメニュー'; // ボタンのタイトル
idxName    = 'contents';         // パネルのフレーム名称

// メニュー方式を切替える関数
function toggleMenu(){
  if(opener) opener.location.replace(frameTop);
  else       parent.location.replace(floatTop);
}
// --></script>
    :
</head>
<body ...>
    :
<script language="JavaScript1.1"><!--
if(   navigator.appName!='Microsfot Internet Exporer'
   || parseFloat(navigator.appVersion)>=4.0){
  document.write(
     '<form>'
    +'<input type="button" '
    +  'value="'+(top.name==idxName?frameLabel:floatLabel)+'" '
    +  'onClick="toggleMenu();">'
    +'<\/form>
    );
}
// --></script>
    :
<a href="xxx.htm" target="tips"
   >普通のリンク</a><br>

<a href="yyy.htm" target="_top"
   onClick="checkTarget(this,false);"
   >全体に表示するリンク1</a><br>

<a href="zzz.htm" target="_top"
   onClick="checkTarget(this,true );"
   >全体に表示するリンク2</a><br>
    :
</body>

この文字の部分は必要に応じて修正します。

idxURL,idxName はメニュー側に表示する URL とウィンドウ名で、 docURL,docName はメイン側に表示する URL と ウィンドウ名です。

また、idxPer,features はフレーム時の幅の比率と別ウィンドウの装飾で、 必要に応じてサイズなど修正してください。

メニュー( contents.htm )ではframeTop, floatTopはそれぞれ フレーム方式、ウィンドウ方式の親の URL で、 frameLabel,floatLabel方式切替えボタンに表示する文字列です。

また、リンクの部分は単なるサンプルなので作成するページに合わせた記述に変更してください。

リンク部分に指定する checkTarget関数の呼出形式は以下の通りです。

checkTarget(link,extdoc);
link : リンクオブジェクト extdoc : true = 外部ページへのリンク false = サイト内のページへのリンク

extdoc を true にするとウィンドウ方式の表示中には表示しているウィンドウを閉じ、 メインのフレームを解除して表示します。

切替ボタンは、この例の場合 FORM の BUTTON を使用していますが、 切替にはtoggleMenu() を呼出せば良いだけなので、特に BUTTON を使用する必要はありません。


使用例

サンプルはこの Tip集自体です。 f(^^;


注意事項

Caution
この方式の問題点はメニュー方式を切替える度に Frame の親を切替えるので キャッシュにない場合切替えに時間がかかります ( Frameの親のドキュメントをロードしなければなりませんから )。

Frame の親を共通にするにはリロード時に選択状態を伝える手だてが必要です。

選択状態を伝える方法は CGI を利用したダイナミックな HTML 生成が考えられますが、 JavaScript での実現方法もあります( この Tips集は JavaScript なので f(^^;)。
それは、 location.search プロパティを利用する方法です。

私の開発環境では、 Microsoft Personal Web Server を利用していますが、 このサーバは URL に「?」マークが付加されるとスクリプトと解釈してしまうので 作成してもデバッグができません。 だから、ここでは紹介しません( もし、暇なら考えてみて下さい )。

NN2 IE3
window.open メソッドで開いたウィンドウ内の JavaScript から元の(メインの) ウィンドウを制御するには opener プロパティを使用するので JavaScript1.1 準拠の ブラウザ(つまり、 MSIE4.0 以上 及び NN3.0 以上)からしか使えません。
もし、それでも使用したい場合は window.open() で開いた window オブジェクトに 代わりに winobj.mainwindow = window などと指定して、これを window.opener の代わりに使用できると思います ( やはり、私の環境では確認ができないので詳細は紹介しません )。

NN4
このスクリプトでは問題が起こらないように回避策をとっていますが、 Netscape Communicator 4.0(少なくとも 4.04)は location.replace メソッドを 使用する場合、 body タグに onUnload イベントを指定すると replace したドキュメント 内からメソッドを探すことがあり、エラーが発生することがあります。

Copyright(c) 1998 - 2001 ShinSoft. All rights reserved.