- PR -

親画面(フレーム有り)遷移後も、子が親の情報を覚えておくには

投稿者投稿内容
MI
常連さん
会議室デビュー日: 2007/01/30
投稿数: 30
投稿日時: 2007-03-13 12:14
お知恵を拝借させて下さい。

ASP.Net1.1+ VB.net でIEのWebアプリを作成しております。

親(フレーム)→子と開いて、子を閉じる際に親を更新させております。
子画面からDB保存作業→Response.Write(JavaScript)で親画面を
操作しておりますが、JavaScriptの部分で希望する操作の記述が分かりません。

親には target="_parent"の検索画面等も含まれているため
ユーザーによるフレームを崩した画面遷移も予想されるのですが、
フレームの場合、フレームを崩して遷移した後操作しようとすると
Object.Errorになってしまいます。
Try〜Cathで捕まえても、
ステータスバーに「'親画面'を開きます」と出るものの遷移しません。

parentの書き方が間違っているのでしょうか。
またTryCatch以外に適した記述がありましたら、ご教授いただけたら嬉しいです。

以下テスト用のソースを掲載いたします。
長くなって申し訳ございませんが、どうぞよろしくお願いいたします。

=====framgepage.html===========================================
<HTML>
<FRAMESET COLS="50%,*" FRAMEBORDER=1>
<FRAME NAME="left" SRC="leht.html">
<FRAME NAME="right" SRC="right.html">
</FRAMESET>
</HTML>
=====leht.html================================================
<HTML><BODY><FORM>
<input type="button" value="1:子画面を開く" onClick="window.open('newpage.html');">
</FORM></BODY></HTML>
=====right.html===============================================
<HTML><BODY></BODY> </HTML>
=====newpage.html=============================================
<HTML>
<HEAD>
<SCRIPT language="JavaScript">

function subRefresh(newpage){
if (window.opener.closed) {
window.open('framepage.html');
window.alert("親画面が閉じていました");
} else {
opener.parent.frames['left'].location.href = newpage;
window.alert("親画面のフレーム[左]を更新しました")
}}

function CathErr(newpage){
try {
subRefresh(newpage);
}catch(myError){
window.alert(myError + "画面が遷移していたので元に戻します");
opener.location.href = 'framepage.html';
}}

//-->
</SCRIPT>
</HEAD>

<BODY>
<form><input type="button" value="2:親画面左を遷移" onClick='CathErr("http://www.yahoo.co.jp/");'></form>
<form><input type="button" value="3:親画面をフレームを崩して遷移" onClick="opener.parent.location.href= 'http://www.yahoo.co.jp/'"></form>(ユーザー操作想定)<br>
<form><input type="button" value="4:親画面を戻す" onClick='CathErr("http://www.yahoo.co.jp/");'></form>
</BODY></HTML>
MI
常連さん
会議室デビュー日: 2007/01/30
投稿数: 30
投稿日時: 2007-03-13 12:18
すみません、訂正です
=====framgepage.html===========================================

=====framepage.html===========================================
でした。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2007-03-13 14:35
引用:
フレームの場合、フレームを崩して遷移した後操作しようとすると
Object.Errorになってしまいます。

だって、読み込んでいるyahooのページにframes['left']はないですよね?
MI
常連さん
会議室デビュー日: 2007/01/30
投稿数: 30
投稿日時: 2007-03-13 15:54
引用:

べるさんの書き込み (2007-03-13 14:35) より:
引用:
フレームの場合、フレームを崩して遷移した後操作しようとすると
Object.Errorになってしまいます。

だって、読み込んでいるyahooのページにframes['left']はないですよね?


ご回答ありがとうございます。
仰るとおりframesはないのでエラーが起こりますが、そのエラーCatchの
>opener.location.href = 'framepage.html';
が遷移してくれないのはどうしてなのかと困っております。
opener.parent.location.href = 'framepage.html';
としても同じでした。

この’opener’という情報がフレームを崩した時点で破棄されているのかなと想像しているのですが
勉強不足のため対処方法が分かりません。

恐れ入りますが、引き続き教えて頂けたら嬉しいです。
He
大ベテラン
会議室デビュー日: 2002/12/18
投稿数: 141
投稿日時: 2007-03-13 16:10
ドメインが異なるwindowにはアクセスできません。
予めフレームセットのウィンドウに名前を付けておき、子ウィンドウにおいたダミーのform(targetをフレームセットのウィンドウに設定)をサブミットさせるなどで回避可能かと。
MI
常連さん
会議室デビュー日: 2007/01/30
投稿数: 30
投稿日時: 2007-03-13 16:38
引用:

Heさんの書き込み (2007-03-13 16:10) より:
ドメインが異なるwindowにはアクセスできません。
予めフレームセットのウィンドウに名前を付けておき、子ウィンドウにおいたダミーのform(targetをフレームセットのウィンドウに設定)をサブミットさせるなどで回避可能かと。



ご回答ありがとうございます。

そのような回避方法があるのですね!

>targetをフレームセットのウィンドウに設定
はなんとなく想像がつくのですが、
>子ウィンドウにおいたダミーのformをサブミットさせる
をちょっと勉強して参りますので、
すみませんが、ご提示頂いた方法についてお返事少々遅くなります。ほんとにすみません。
He
大ベテラン
会議室デビュー日: 2002/12/18
投稿数: 141
投稿日時: 2007-03-13 18:49
Heです。

先ほどの投稿はケータイからだったので、言葉足らずでわかりにくところがありましたね。すみません。
ご自分で勉強される意欲がお有りのようなので敢えてコードを示すことはしませんが、おこがましくもヒントじみたものを。

「予めフレームセットのウィンドウに名前を付ける」が達成できれば、
あとは、そのウィンドウをtargetにしたリクエストがだせれば良いわけです。
「ダミーのformをサブミットさせる」でも「アンカー(A要素)をクリックさせる」でもかまいません。いずれにしてもスクリプトでの操作になります。
また、任意の要素をスクリプトから参照する際は、要素にIDを設定しておくと楽です。

IEのDHTMLリファレンスは以下です。参考にしてください。
http://msdn.microsoft.com/workshop/author/dhtml/reference/dhtml_reference_entry.asp
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-03-14 10:40
引用:
親には target="_parent"の検索画面等も含まれているため


 そもそも、他のドメインへいくのに、フレームの中で遷移するのが間違っているのでは?
target="_top" にすれば、子画面もなくなるので問題なし!!とか。

引用:
子画面からDB保存作業→Response.Write(JavaScript)で親画面を


ダウト。
RegisterClientScriptBlock とか、 RegisterStartupScript とかを使いましょう。

_________________

スキルアップ/キャリアアップ(JOB@IT)