dポイントプレゼントキャンペーン実施中!

QNo.4132708 複数のボタンに対するActionと動的hiddenについて
で皆様に色々とアドバイスを頂いたものです。

しかし根本的な解決には至らず、また、皆様のお知恵を頂きたく
思います。

現在の問題点としてはサブウィンドウ側でtarget属性とname属性の
削除をonload時に行おうとしていますが、Firefoxだとうまくいき、
IE6だとうまくいかないことまではわかりました。

IE6でもうまくいくようにするにはどうしたらよいか
お知恵をいただければ幸いです。

IEだとremoveChildがうまくいかないようなので、その他方法があれば
よろしくお願い致します。


=====================機能 ここから=====================
入力内容を確認する画面があり、その画面からは実際にデータを
書き込む機能(1)と一時的に書込み、その結果を別ウィンドウで出力
するプレビュー機能(2)を考えています。

(1)も(2)もAction先は同じCGIで、プレビューの場合のみあるhidden値を
持たせ、Action先のCGI側でそのhiddenが存在すればプレビュー機能(2)、
なければ通常登録機能(1)と処理を分けています。
=====================機能 ここから=====================


=====================画面 ここから=====================
※<>はHTMLタグを示す

<form>
         確認画面          
----------+---------------------------------+
|データ1 | 入力内容1 |
+-------------------------------------------+
|データ2 | 入力内容2 |
----------+---------------------------------+
|データ3 | 入力内容3 |
+-------------------------------------------+

+--------------+   +--------------+
| プレビュー |   |  登録   |
+--------------+   +--------------+
<input type="hidden" name="data1" value="入力内容1" />
<input type="hidden" name="data2" value="入力内容2" />
<input type="hidden" name="data3" value="入力内容3" />
</form>

※登録は以下で実行
 <input type="button" value="登録" onClick="javascript: run();" />
※プレビューは以下で実行
 <input type="button" onClick="javascript: preview('30');" value="プレビュー" />

=====================画面 ここまで=====================


=====================JS ここから=====================
function preview(id){
var q = document.createElement('input');
q.type = 'hidden';
q.name = 'name';
q.value = id;
newWindow =window.open("about:blank","preName","menubar=no,toolbar=no,location=no,status=no,scrollbars=yes,resizable=yes");
newWindow.focus();
document.forms[0].appendChild(q);
document.forms[0].target = 'preName';
document.forms[0].action = run.cgi;
document.forms[0].method = 'post';
document.forms[0].submit();
}
function run(){
document.forms[0].action = run.cgi;
document.forms[0].method = 'post';
document.forms[0].submit();
return;
}
=====================JS ここまで=====================

=====================サブウィンドウ側 ここから=====================
<body onLoad="opener.document.forms[0].removeChild(opener.document.forms[0].name);opener.document.forms[0].setAttribute('target', '');">
=====================サブウィンドウ側 ここまで=====================

A 回答 (9件)

少し整理してみた。



<form action="run.cgi" method="post">
↑actionやmethodを後でJavascriptで設定する意味がわからなかったので普通に書いておいた。

<input type="hidden" name="previewflg" alue="no" />
↑cgi側ではこの値が'yes'ならプレビューの動作をする。
<input type="button" value="登録" onClick="run(this.form);" />
<input type="button" value="プレビュー" onClick="preview(this.form);"/>

function run(F){
//以下2行によって、子画面onloadの処理は不要。
F.target = '_self';
F.preview.value='no';
F.submit();
}
function preview(F){
F.target = 'preName';
F.preview.value='yes';
newWindow = window.open("about:blank","preName","menubar=no,toolbar=no,location=no,status=no,scrollbars=yes,resizable=yes");
newWindow.focus();
}
F.submit();
}
    • good
    • 0

#8、間違えがありました。


F.preview.value='yes';
F.preview.value='no';

F.previewflg.value='yes';
F.previewflg.value='no';
    • good
    • 0

・ 最後を間違えました。



opener.document.forms[0].previewflg.value='YES';

です。
    • good
    • 0

・ 変わっているはずですが、親Windowで、プレビューの前後で


<input type="button" value="check hidden" onclick="alert(document.forms[0].name.value);" />
により、値をチェックしてみてください。

・ あと、心配なのは、登録run()をする前に、2度以上プレビューをしてしまい、
  何度もappendChild()してしまうことです。

・ フラグ形式を使うなら最初から、HIRSYU様も述べられているように、

<input type="hidden" name="previewflg" value="NO" />

を記述しておくほうがよいでしょう。そして、プレビューでの変更は、

opener.document.forms[0].name.value='YES';

です。

・ いずれにしても、1度整理しなおしたほうがすっきりします。
    • good
    • 0

ANo.3のような形がいいと思いますが、とりあえず名前のつけ方が悪い気がします。



q.name = 'name';
これを'name'以外の名前にした方がいいと思います。
たとえば、プレビューかどうかのフラグなので'previewflg'等。

でないと「opener.document.forms[0].name」の参照が、
<input name="name" />のinputタグに対する参照なのか、<form name="xxx" />のname属性"xxx"に対する参照なのか、ブラウザ次第で正しい参照を得られないような気がします。
    • good
    • 0

・ 削除マーク'deleted'は、<input>タグを消すのではなく単なるフラグ(目印)です。



・ CGI側で、"name"属性の値が、'name'か'deleted'かをチェックしてください。

この回答への補足

親ウィンドウ側のnameのvauleがプレビューをすることでdeleteに
書き換えられると思ったんですが、変わっていないようです。。。
プレビュー時のIDがそのまま渡ってしまいます。。。

なぜでしょう、、、

補足日時:2008/07/02 17:06
    • good
    • 0

・ こんにちは、



  hidden属性をもつ<input>タグは残して、値に削除マークを設定する方法もあります。とりあえず

opener.document.forms[0].name.value='deleted';

としてみたらどうでしょうか。

この回答への補足

お世話になっております。

うーーん、だめでした。

ちなみに以下だとtarget属性すら消えないようです。
nameもtargetも消えていないようです。
<body onLoad="opener.document.forms[0].name.value='delete';opener.document.forms[0].setAttribute('target', '');">

順番を変えると
targetは消えて、nameは消えていないようです。
<body onLoad="opener.document.forms[0].setAttribute('target', '');opener.document.forms[0].name.value='delete';">

補足日時:2008/07/02 15:41
    • good
    • 0

submitでデータが飛ばないようにするだけなら、disabledをtrueに


してやればよいでしょう

この回答への補足

value="登録" onClick="javascript: run()
を実行に
hiddenのname属性が存在すれば、値を書き換える、もしくは空にする、もしくは送信しない(disabled?)にするということは可能なのでしょうか

補足日時:2008/07/02 15:21
    • good
    • 0

removeChildじゃなく null や innerHTML="" で置き換える ってのはどう?

この回答への補足

サブウィンドウ側でnullにする、もしくはnameのvalueを空に
書き換えられれば、よいかと思うのですが、方法がわかりません。

教えていただけますでしょうか

初心者で恐縮です。

補足日時:2008/07/02 15:18
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!