親ウィンドウで動的に作成したhidden値をサブウィンドウから削除する方法とは?

このQ&Aのポイント
  • サブウィンドウ側でtarget属性とname属性の削除をonload時に行おうとしていますが、Firefoxだとうまくいき、IE6だとうまくいかないことまではわかりました。IE6でもうまくいくようにするにはどうしたらよいかお知恵をいただければ幸いです。
  • 入力内容を確認する画面があり、その画面からは実際にデータを書き込む機能(1)と一時的に書込み、その結果を別ウィンドウで出力するプレビュー機能(2)を考えています。 (1)も(2)もAction先は同じCGIで、プレビューの場合のみあるhidden値を持たせ、Action先のCGI側でそのhiddenが存在すればプレビュー機能(2)、なければ通常登録機能(1)と処理を分けています。
  • JavaScriptの関数`preview`はプレビュー機能を実現するためのものであり、`run`は通常の登録機能を実現するためのものです。サブウィンドウ側では、`onLoad`イベントで、親ウィンドウからtarget属性とname属性を削除しています。
回答を見る
  • ベストアンサー

親ウィンドウで動的に作成したhidden値をサブウィンドウから削除

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', '');"> =====================サブウィンドウ側 ここまで=====================

質問者が選んだベストアンサー

  • ベストアンサー
  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.8

少し整理してみた。 <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(); }

その他の回答 (8)

  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.9

#8、間違えがありました。 F.preview.value='yes'; F.preview.value='no'; ↓ F.previewflg.value='yes'; F.previewflg.value='no';

  • auty
  • ベストアンサー率58% (284/486)
回答No.7

・ 最後を間違えました。 opener.document.forms[0].previewflg.value='YES'; です。

  • auty
  • ベストアンサー率58% (284/486)
回答No.6

・ 変わっているはずですが、親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度整理しなおしたほうがすっきりします。

  • HIRSYU
  • ベストアンサー率51% (45/87)
回答No.5

ANo.3のような形がいいと思いますが、とりあえず名前のつけ方が悪い気がします。 q.name = 'name'; これを'name'以外の名前にした方がいいと思います。 たとえば、プレビューかどうかのフラグなので'previewflg'等。 でないと「opener.document.forms[0].name」の参照が、 <input name="name" />のinputタグに対する参照なのか、<form name="xxx" />のname属性"xxx"に対する参照なのか、ブラウザ次第で正しい参照を得られないような気がします。

  • auty
  • ベストアンサー率58% (284/486)
回答No.4

・ 削除マーク'deleted'は、<input>タグを消すのではなく単なるフラグ(目印)です。 ・ CGI側で、"name"属性の値が、'name'か'deleted'かをチェックしてください。

seseseseto
質問者

補足

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

  • auty
  • ベストアンサー率58% (284/486)
回答No.3

・ こんにちは、   hidden属性をもつ<input>タグは残して、値に削除マークを設定する方法もあります。とりあえず opener.document.forms[0].name.value='deleted'; としてみたらどうでしょうか。

seseseseto
質問者

補足

お世話になっております。 うーーん、だめでした。 ちなみに以下だと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';">

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

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

seseseseto
質問者

補足

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

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.1

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

seseseseto
質問者

補足

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

関連するQ&A

  • 複数のボタンに対するActionと動的hiddenについて

    JavaScript初心者です。 入力内容を確認する画面があり、その画面からは実際にデータを 書き込む機能(1)と一時的に書込み、その結果を別ウィンドウで出力 するプレビュー機能(2)を考えています。 (1)も(2)もAction先は同じCGIで、プレビューの場合のみあるhidden値を 持たせ、Action先のCGI側でそのhiddenが存在すればプレビュー機能(2)、 なければ通常登録機能(1)と処理を分けています。 今問題となっているのはプレビュー実行後、登録を実行した場合、なぜか プレビューと同じ動作になってしまうという点です。 (別ウィンドウが立ちあがり、hidden属性もAction先へ渡ってしまっている) 初心者である為、解決方法がわからず、悩んでおります。 よいアドバイスをお願い致します。 =====================画面 ここから===================== ※<>は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 ここまで=====================

  • サブウィンドウと、親ウィンドウについて

    これは、データベース絡みでの質問になると思いますがよろしくお願いします。 ここの前の質問でも同じようなものがあり、流用できたらと試してみましたがうまくいきません。それは、以下の手順によってデータを操作しようと考えているのですが・・・ (1)親ウィンドウにサブウィンドウを呼び出すボタンを設置する。 (2)呼び出されたサブウィンドウにデータを入力すると親ウィンドウのデータも一緒にデータベースに登録される。 と、いう手順でしたいと考えており、サブウィンドウ側に、 function copy(){ document.form1.text1.value = opener.parent.left.document.form2.text1.value; } とし、サブウィンドウに親ウィンドウからデータを持ってくるために <input type="hidden" name="text1" onChange="copy()"> という隠しフィールドを設け、親からデータを格納させています。 また、上にある、「left」は親をフレームわけしているのでフレーム名です。(持ってくるデータは、form1にあり、そこにボタンを設置しています)説明不足でしたら補足いたしますので、よろしくお願いします。考え方でも結構です。

  • フレームを使ったサブウィンドウから親ウィンドウへのデータセット

    下記のソースをフレームを使わないサブウィンドウから実行すると うまく親ウィンドウの該当項目へセットできますが、 フレームをつかったサブウィンドウからだとうまくセットできません。 ご存知の方おりませんか? よろしくお願いします。 function setData(theData) { window.opener.document.MAIN_FORM.DATA0.value = theData[0]; window.opener.document.MAIN_FORM.DATA1.value = theData[1]; window.opener.document.MAIN_FORM.DATA2.value = theData[2]; window.opener.document.MAIN_FORM.DATA3.value = theData[3]; window.opener.document.MAIN_FORM.DATA4.value = theData[4]; } <input type="button" onClick="setData(Array('000','111','222','333','444'))" value="選択">

  • サブウィンドウを開くタイミングで親ウィンドウからデータを渡す

    親ウィンドウ、サブウィンドウを両方開いた状態でデータを受け渡す方法は見かけるのですが、 サブウィンドウを初めて開くタイミングで親ウィンドウからデータを渡す方法はありますでしょうか? 現在以下のように書いています。 親ウィンドウ function openLicense(sub, index){ w = window.open('', 'publish', 'toolbar=no,); w.document.open(); w.document.form.password_index.value=index; document.form.submit(); w.focus(); } サブウィンドウ <input name="password_index" type="HIDDEN" value=""> が、「w.document.form.password_indexはnullまたはオブジェクトではありません」 とエラーになります。何かいい方法はないでしょうか。

  • フォームのPOSTデータをサブウィンドウに渡したいです。

    フォームのPOSTデータをサブウィンドウに渡したいです。 <form action="sample.html" method="post"> <input type="checkbox" name="test[]" value="0">0 <input type="checkbox" name="test[]" value="1">1 <input type="checkbox" name="test[]" value="2">2 <input type="checkbox" name="test[]" value="3">3 <input type="checkbox" name="test[]" value="4">4 </form> 上記のフォームの値を、サブミットボタンを押したときにサブウィンドウをひらき、そのサブウィンドウに渡したいのですが、いまいち上手くいきません。 window.openでサブウィンドウを開いてもデータが受け渡せずにいます。 このような場合、どうしたら値を渡せるのでしょうか。 理想はPOSTで渡したいのですが、引数で渡す方法でもかまいません。

  • hiddenのvalueの値を変えたい

    おはようございます。 教えていただきたいことがあります。 HTMLのほうに <input type="hidden" name="btn" value=""> と書きます。 それでJavaSctiptのfunctionの中で document.forms[0].btn.value=funcitonの引数; とやっているのですが、hiddenのvalueの中に値が入っていないようです。 どうしてでしょうか? こういう使い方ってできないものなのでしょうか? 宜しくお願いします。

  • サブウィンドウから親ウィンドウのフォームへの書き込み

    よろしくお願いします。 やりたい事は サブウィンドウを開いて サブウィンドウのテキストボックスに入力した内容を 親ウィンドウのテキストボックスに書き込みたいのです。 以下親ウィンドウ(oya.html) <html> <head> <script type="text/javascript"> <!-- function search(){ window.open( 'sub.html' ,'childwin', "width=350,height=250,location=no,menubar=no,toolbar=no,resizable=yes,scrollbars=yes" ); } --> </script> </head> <body> <form name="mainform" method="POST" action="hoge.php"> <TABLE border="1"> <TR> <TD>A:<INPUT type="text" name="A" id="A"></TD> </TR> <TR> <TD>B:<INPUT type="text" name="B" id="B"></TD> </TR> <TR> <TD><input type="button" onclick="search();return false;" value="サブウィンドウ"></TD> </TR> <TR> <TD><center><input type="submit" name="exec" value="確認"></center></TD> </TR> </TABLE> </form> </body> </html> 以下サブウィンドウ(sub.html) <html> <head> <script type="text/javascript"> <!-- --> </script> </head> <body> <form name="subform"> <TABLE border="1"> <TR> <TD>A:<INPUT type="text" name="A" id="A"></TD> </TR> <TR> <TD>B:<INPUT type="text" name="B" id="B"></TD> </TR> <TR> <TD><input type="button" value="入力"></TD> </TR> </TABLE> </form> </body> </html> 以上です。親ウィンドウの中にformが入れ子状態になってしまうため javascriptで対応できないのかと思い質問させて頂きました。 ご教示お願いいたします。

  • 『`』がテキストタイプのvalueにある場合にhiddenを追加すると表示が崩れる

    言葉では説明できないためコードを記載致しました。 下記のコードでボタンを押下した場合に表示が崩れるのは何故でしょうか?(IE6,IE7で確認) 又、対策としてはどのような事が考えられるでしょうか?(『`』を入力禁止以外でお願い致します。) 尚、innerHTMLをalertで出すとうまく追加されていないようです。。。 よろしくお願い致します。 <html> <head> <script> function createhidden( name, value, formname ){ str = '<input type="hidden" name="aaa" value="bbb"/>'; document.forms[0].innerHTML += str; } </script> </head> <body> <form action="" name="form1"> <input type="text" name="b"value="`"/><br><br> <input type="button" value="CREATE HIDDEN" onclick="createhidden()"/> <input type="text" name="a"value="`"/><br><br> </form> </body> </html>

  • 同じnameのhiddenで別々の内容のvalueを送りたい

    同じnameのhiddenで別々の内容のvalueを送りたい <form action="" name="MyForm" method="post"> <input type="hidden" name="rm" value="×××.txt">テスト1 <input type="button" value="閲 覧" onClick="MyForm.action='rm.cgi';MyForm.submit();"> <input type="button" value="削 除" onClick="MyForm.action='delete.cgi';MyForm.submit();"> <input type="hidden" name="rm" value="○○○.txt">テスト2 <input type="button" value="閲 覧" onClick="MyForm.action='rm.cgi';MyForm.submit();"> <input type="button" value="削 除" onClick="MyForm.action='delete.cgi';MyForm.submit();"> <input type="hidden" name="rm" value="△△△.txt">テスト3 <input type="button" value="閲 覧" onClick="MyForm.action='rm.cgi';MyForm.submit();"> <input type="button" value="削 除" onClick="MyForm.action='delete.cgi';MyForm.submit();"> 別のcgiでform送信すると、txtファイルが生成され、上記の繰り返しの部分に追加されていく様なイメージです。 閲覧・削除ボタンを押すと直前のhiddenを送信したいのですが、現状では一番最初のhiddenが送信されてしまいます。 方法がわかる方いらっしゃいましたら、御回答お願い致します。

    • ベストアンサー
    • HTML
  • formのfileの値をhiddenでも持ちたい

    お疲れ様です。いつもお世話になっております。 on~~イベントで値をコピーするやり方でいけるのかもと思いつつ、 うまくイメージがまとまらないので質問させてください。 <input type="file">で、ファイルが選択されたら、その値(ファイルのパス)を同じフォーム内のhiddenにも持ちたいのです。 もっと具体的にいうと hiddenに持った時、ファイル名の拡張子にかかわらず、拡張子を落として、[ファイル名]_thumnail.jpgとつけて、submitしたいのです。 <form action="xxx.php" method="post" enctype="multipart/form-data" name="myForm"> <input type="file" name="upfile" /> <input type="hidden" name="thumnail" /> </form> document.myForm.upfile.value=document.myForm.thumnail.value; みたいな感じでできるのでしょうか。 よろしくお願いします。

専門家に質問してみよう