js関数のframe内の相互呼び出しの詳細


フレーム間の相互参照ページのすべてのフレームは、集合としてwindowオブジェクトの属性として提供されます。例えば、window.frameは、ページ内のすべてのフレームのセットを表します。フォームオブジェクト、リンクオブジェクト、画像オブジェクトなどと同様に、これらのセットはdocumentの属性です。したがって、サブフレームを引用するには、次のような文法が使用されます。

window.frames["frameName"];
window.frames.frameName
window.frames[index]
その中で、window文字もselfで代替または省略できます。frame Nameをページの最初のフレームと仮定すると、以下の表記は等価です。

self.frames["frameName"]
self.frames[0]
frames[0]
frameName
各フレームはHTMLページに対応していますので、このフレームも独立したブラウザウィンドウであり、ウィンドウのすべての性質を持っています。フレームに対する参照とはwindowオブジェクトへの参照です。このwindowオブジェクトがあれば、その中のページを簡単に操作できます。例えばwindow.documentオブジェクトを使ってページにデータを書き込み、window.location属性を使ってフレーム内のページを変更するなどです。それぞれの階層のフレーム間の相互参照を紹介します。
1.親のフレームからサブフレームへの引用は、上記の原理を知り、親のフレームからサブフレームを引用することが非常に容易になる。すなわち、

window.frames["frameName"];
このように、ページの内名をframe Nameのサブフレームとして引用しました。サブフレーム内のサブフレームを参照するなら、参照のフレームワークによって、実際にはwindowオブジェクトの性質である。これにより、

window.frames["frameName"].frames["frameName2"];
は、2つのサブフレームに引用され、これに類推して、多層フレームの参照が可能になる。
2.サブフレームから親フレームまでの引用は各windowオブジェクトにparent属性があり、親フレームを表します。このフレームが最上階のフレームであるならば、window.parentはまたフレーム自体を表している。
3.兄弟フレーム間の参照2つのフレームが同じフレームのサブフレームである場合、それらは兄弟フレームと呼ばれ、相互参照は親フレームで実現され得る。例えば、1ページは2つのサブフレームを含む。

<frameset rows="50%,50%">
     <frame src="1.html" name="frame1" />
     <frame src="2.html" name="frame2" />
</frameset>
frame 1では、frame 2:

self.parent.frames["frame2"];
を参照するために、次のような文が使用されてもよい。
4.異なる階層のフレーム間の相互参照フレームの階層は、トップフレームに対するものである。レベルが違っている場合、自分のいるレベルと別のフレームのあるレベルと名前を知っていれば、フレームを利用して参照されるwindowオブジェクトの性質を利用して、相互訪問が容易に実現できます。例えば、

self.parent.frames["childName"].frames["targetFrameName"];
5.トップフレームに対する参照はparent属性と似ています。windowオブジェクトにはもう一つのtop属性があります。これはトップフレームへの参照を表しています。これはフレーム自体がトップフレームであるかどうかを判断するために使用できます。

//
if(self==top){
       //dosomething
}
フレームを変更するロードページのフレームに対する参照はwindowオブジェクトの参照であり、windowオブジェクトのlocation属性を利用して、フレームのナビゲーションを変えることができます。これはページの最初のフレームのページを1.にリダイレクトします。この性質を利用して、リンクを使って複数のフレームを更新することもできます。

<frameset rows="50%,50%">
     <frame src="1.html" name="frame1" />
     <frame src="2.html" name="frame2" />
</frameset>
<!--somecode-->
<a href="frame1.location='3.html;frame2.location='4.html'" onclick="">link</a>
<!--somecode-->
他のフレーム内のJavaScript変数と関数を参照すると、他のフレーム内のJavaScript変数と関数を引用する技術を紹介する前に、以下のコードを参照してください。

<script language="JavaScript" type="text/javascript">
<!--
function hello(){
      alert("hello,ajax!");
}
window.hello();
//-->
</script>
このコードを実行すると、「ハロー、ajax!」これはハロー関数を実行した結果です。なぜハローはwindowの対象になったのですか?一つのページで定義されているグローバル変数とグローバル関数はすべてwindowオブジェクトのメンバーです。例えば、

var a=1;
alert(window.a);
では、ダイアログが1として表示されます。同じ原理で、変数と関数を異なるフレーム間で共有することは、windowオブジェクトを通じて呼び出すことです。例えば、一つの商品閲覧ページは二つのサブフレームからなり、左側は商品分類のリンクを表します。ユーザーが分類リンクをクリックすると、右側に該当する商品リストが表示されます。ユーザーは商品の隣の【購入】リンクをクリックして商品をカートに入れることができます。この例では、ユーザーがナビゲーションリンクをクリックすると、変化するのは別のページ、すなわち商品展示ページであり、ナビゲーションページ自体は変化しないので、JavaScript変数は失われず、グローバルデータを格納するために使用されてもよい。その実現原理は以下の通りです。左側のページがlink.htmlであり、右側のページがshow.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title> New Document </title>
</head>
<frameset cols="20%,80%">
      <frame src="link.html" name="link" />
      <frame src="show.html" name="show" />
</frameset>
</html>
ショーで展示されている商品の隣には、「a href=「void(0)」onclick=「self.parent.link.addToOrders(32068)」という文があります。ショッピングカートに参加します。ここでlinkはナビゲーションフレームを表しています。arrOrders配列をクリックして商品を格納するidader Tordsを定義します。これは商品のIDを受信したパラメータです。例えば、idは32068の商品です。

<script language="JavaScript" type="text/javascript">
<!--
var arrOrders=new Array();
function addToOrders(id){
      arrOrders.push(id);
}
//-->
</script>
はこのようにして、決算ページやショッピングカートの閲覧ページで、arrOrdersを使ってすべての購入準備商品を取得することができます。フレームワークは、一つのページを機能の独立した複数のモジュールに分割することができ、各モジュール間は独立しているが、windowオブジェクトの参照によってリンクを確立することもでき、Web開発の重要なメカニズムである。