WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:親フレーム全体を書き換える方法

0:[投稿] あいこ [2002/12/25 16:00 ][環境:IE5.5 Apache]

//******************
// testParent.html
//******************
<html>
<head>
</head>
<frameset cols="75,*" >
   <frame src="testChild1.html" name="Child1" scrolling="YES">
   <frame src="testChild2.html" name="Child2" scrolling="YES">
    <noframes>
    <body>
    </body>    
    </noframes>
</frameset>
</html>

フレーム分けした画面で
testChild1.htmlのキャンセルボタンを押すと
testParent.html全体がキャンセル画面となるような画面を作成したいのですが、
どのように記述すればよいでしょうか?


キャンセルボタン押下後

function cancelBtn()
{
    var url=cancelWin.html;

    document.fm.target = window.top;    // ←この書き方が分かりません。

    document.fm.action = url;
    document.fm.method = "POST";
    document.fm.submit();
}


window.top
parent
top
等色々試してみたのですが、新規OPENウィンドウがキャンセル画面となってしまいます。

どなたかご教授ください。
よろしくお願いします。


1:[回答] ごだっち [MAIL] [2002/12/25 16:28 ]

"_top" ですかね?


ただ、書かれているように「親フレームをキャンセル画面にする」だけであれば、
function calcelBtn(){
window.top.location.href="calcelWin.html";
}
でも良いような?


2:[回答] ごだっち [MAIL] [2002/12/25 16:32 ]


ファイル名間違えた...

誤)="calcelWin.html";

正)="cancelWin.html";

以上


3:[回答] ごだっち [MAIL] [2002/12/25 16:33 ]

あきゃ、関数名もだ...m(_._)m


4:[回答] あいこ [2002/12/26 10:21 ]

ありがとうございます。
上記の方法で試したところ正常に動作いたしました。

少し疑問なのが
document.fm.target = window.top;
だとなぜうまくいかないか、なのですが…

target属性は使えないのでしょうか?


5:[回答] gun [2002/12/26 10:42 ]

document.fm.target = "_top";

で、どうでしょ?(未確認)


6:[回答] ma-to [2002/12/26 14:57 ]


'_top' が上手く動作することは >>1 で分かったが、top ではどうして別窓が開くのか分からない、ということだろう。以下に浅知恵を書いてみる。

一体どのような値がセットされたのか、試しにゲットしてみればよい。
    document.fm.target=top;
    alert(document.fm.target);
戻り値は JScript では「[object]」、JavaScript では「[object Window]」である。文脈から、暗黙の型変換が行われている。即ち、左辺を読んだ時点で、セットに必要な引数 (右辺) は文字列に変換されるから、セット以前に、
    String(右辺)
が暗黙に実行されていると仮定しても、考え方としては間違いではない。
    <form target="[object]" ..>
    <form target="[object Window]" ..>
というふうに、属性値をスクリプトで書き換えた (属性値については、与えた、と言うと厳密には正しくない) ことになる。本来、半角アルファベットで始まらなければならないし、「[」とか「]」とか「 」とかが使われた時点で無効だが、正しく実装するつもりはないようで、有効な窓名として処理された結果、別窓が開く。


7:[関連] あいこ [2003/01/10 16:13 ]

testChild1をさらにフレーム分けして、

testChild1_child1
testChild1_child2

という画面を作ったとします。

そのとき、testChild1_child1のキャンセルボタンを押すと
testChild1全体がキャンセル画面になるような画面を作成したいです。

function calcelBtn()
{
    window.top["testChild1"].location.href="cancelWin.html";
}

だとtestChild1全体がキャンセル画面になるのですが、

キャンセル画面にPOST値を渡したいためにform送信をしたいのです。

function calcelBtn()
{

   var url=cancelWin.html;

   document.fm.target = _top;    // ←この書き方が分かりません。

   document.fm.action = url;
   document.fm.method = "POST";
   document.fm.submit();
}

と書くと画面全体が( testChild1,testChild2の親画面 )キャンセル画面となってしまいます。

  document.fm.target = _top["testChild1"];    

とすると、新たなWindowが開かれてしまうし…

最悪、
window.top["testChild1"].location.href="CancelWinPostSet.html";


で、間に画面をひとつ挟み、"CancelWinPostSet.html"内で、
必要なPOST値をセットして

function calcelBtn()
{

   var url=cancelWin.html;

//    document.fm.target = _top;    // ←この書き方が分かりません。

   document.fm.action = url;
   document.fm.method = "POST";
   document.fm.submit();
}

を実行しようかと思っているのですが…

他に何か良い案がありましたら、ご教授していただきたいです。
よろしくお願いします。


8:[回答] Malic [2003/01/10 17:07 ]

とりあえず・・・ _top はコーテーション(ダブルでも良い)でくくりましょう。

targetに代入するときの _top は文字列です。
コーテーションで括らないと、変数名の扱いに・・・ そして普通_topという変数名は使用していないでしょうから、エラーかヌルかundefindになります。(ブラウザによって異なると思います)


9:[回答] Malic [2003/01/10 17:19 ]

マトさんの回答見落としてた。オブジェクトになるんですか。


10:[回答] gun [2003/01/10 17:30 ]

a. >>0 のフレームHTMLの中にフレームHTMLを呼び出す
b. >>0 のフレームHTMLのフレーム分割を増やす

の、どちらの方式にするのかによって、回答が変わりそうです。


11:[質問] あいこ [2003/01/10 18:11 ]

testChild1.htmlソースを

<html>
<head>
</head>
<frameset cols="75,*" >
  <frame src="testChild1_child1 .html" name="testChild1_child1" scrolling="YES">
  <frame src="testChild1_child2 .html" name="testChild1_child2 " scrolling="YES">
   <noframes>
   <body>
   </body>    
   </noframes>
</frameset>
</html>


のようにさらに分割するという感じです。

ということはaですかね?

よろしくお願いしますm(_ _)m


12:[関連] ma-to [2003/01/11 01:34 ]


>>9

理解されていないように感じられる。伝わらないのは大概の場合送る側に手落ちがある。

    alert(typeof top);//object
    htmlFrameElement.target = top;//左辺には文字列に変換 (という言葉はしっくりこないが) された top がセットされる。
    alert(typeof htmlFrameElement.target);//string

と書けば分かりやすかっただろうか。具体的にどういった文字列になったかが >>6 に書かれている。


13:[回答] gun [2003/01/11 01:38 ]

document.fm.target = "testChild1";

でどうしょう?(未確認)


14:[回答] 波平 [2003/01/11 09:03 ]

>>13
document.fm.target = "_parent" ;
でもOK。

>>12
ma-toさんとMalicさんの話が食い違ってるのは
ma-toさんが「top」の話をしていて
Malicさんが「_top」の話をしているので。
云ってることは両者とも正しいかと。(前者は存在するObjectだし、後者は未定義の変数)


15:[質問] あいこ [2003/01/14 13:32 ]

gunさん、波平の書かれているとおり、

document.fm.target = "testChild1";
document.fm.target = "_parent";

両方とも正常に動作いたしました。ありがとうございます。

ついでと言ってはなんなのですが、少し質問が…
"top"と"_top"の違いが微妙に分かりません。

"top"は画面のオブジェクトで
"_top"はフレーム名を指す(?)と認識してよいのでしょうか?

そのあたりの資料が不足していて…

なにか良いサイト等ありましたら教えていただけないでしょうか?
重ね重ね申し訳ないです。m(_ _)m
しっかり理解しておかないと応用がきかない気がして。


16:[回答] Malic [2003/01/14 14:09 ]

target にはウインドウ名を設定しますが、以下のものは特殊な意味があります。
_parent :親 (今回使用しています)
_top :ウインドウ全体
_self :現在のフレーム、ウインドウ(代入しなおす時に使用したりします)
などがあります。

top はウインドウ内で最初に作成されたフレームのオブジェクト。

>>12 理解していないのではなく、6の
document.fm.target=top;

document.fm.target=_top;
だと勘違いしていました・・・すいません。

8で、未定義エラーのような扱いになる、と書いた後6の回答を見間違えて、9のアホ回答をしてしまいました。


17:[完了] あいこ [2003/01/16 16:37 ]

なるほど。

とても勉強になりました。

ありがとうございました。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World