送信ボタンを押すとtargetの値をとれず、javascriptエラーになります。
「引数は無効です」と表示されます。
SUBMITした時にmake_newwin(f)を動作しようとしているのですが、
うまくtargetが取れません。
targetには、親ウィンドウ名を書き込みたいのです。
何か良い方法ありましたら、教えて下さい。
<script language="javascript" type="text/javascript">
<!--
function make_newwin(f) {
alert(f) …ここで内容を表示したところ[object]と表示されました。
var w = window.open('about:blank', f.target);
w.focus();
window.close();
}
<FORM name="test" action="/cgi-bin/test.cgi" method="post" target="" onSubmit="make_newwin(this);">
<input name = "aaa" type = "hidden" value ="10000" >
:
</FORM>
</BODY>
<script>
document.test.target=opener.window.top.name;
</script>
</HTML>
No.4ベストアンサー
- 回答日時:
> ■親ウィンドウのHTMLで、target="ko"と限定して
> ありますよね。もし、親ウィンドウも2つ表示されて
> いて、子ウィンドウも2つ表示されている場合、
> それぞれの処理をさせるためには、どうしたら
> 良いでしょうか?今の状態ですと、子ウィンドウ
> が、上書きされてしまいます。
そのような場合、それぞれの親が自分の子に、他の子とは違う名前を付けなければなりません。となると HTML では対処できないので、JavaScript で設定するようにします。
また、No.3 のサンプルでは親の名前も固定なので、このままでは子から親への送信にも問題があるかも知れません。ですから、親の名前もウィンドウごとにユニーク(一意的)な名前になるようにした方が良さそうです。
ユニークな名前を作るには、ミリ秒単位で値が変わる Date オブジェクトを利用するとよいでしょう。Date オブジェクトの getTime メソッドは、1970年1月1日0時0分0秒からの経過時間(ミリ秒)を返します。
以上を踏まえ、No.3 の親ウィンドウのサンプルを書き換えてみます。
■親ウィンドウのHTML(その2)
<html>
<head>
<title>親</title>
<script type="text/javascript">
<!--
// 自分に名前を付ける
window.name = (new Date()).getTime(); ★変更:親の名前設定
// FORM送信で開くウィンドウのスタイルを指定するための関数
function make_newwin(f) {
f.target = window.name + "_ko"; ★追加:子の名前設定※
var w = window.open("about:blank", f.target, "スタイル設定");
w.focus();
}
//-->
</script>
</head>
<body>
<form action="/cgi-bin/test-check.cgi" method="post" onSubmit="make_newwin(this)"> ★削除:target="ko" は不要
<input type="submit">
</form>
</body>
</html>
※親の名前がユニークなので、「親の名前+"_ko"」とするだけで子もユニークになります。
子の名前も親と同じように Date オブジェクトで設定してもよかったのですが、こちらの方が簡単かつ安全なのでこのようにしました。
この回答への補足
丁寧でわかりやすい回答有難うございます。
教えていただいた方法で行ってみたところ、
うまく動作することができました。
原因は、ENTERキーを無効にしたくて、
<input type="submit">と記述していなくて、
<input type="button" onclick="subm()">
として、SUBMITをjavascriptで動かそうとして
いたので、うまくいきませんでした。
また、まだうまく言ってないところが
ありまして、上記の部分でやはり、ENTERキーで
SUBMITするのをやめたいのですが、それは
無理な話でしょうか?
それと、「引数が無効」のエラーは発生します。
なぜかというと、教えていただいたとおり、
親ウィンドウのURLと子ウィンドウのURLで、
ドメインが違うので、どうしてもエラーが発生
します。解決する方法があれば、教えて下さい。
とてもわかり易い回答を書いていただき、有難うございました。
先程、補足した件ですが、私の勘違いでうまくいきませんでしたが、
無事、できるようになりました。有難うございました。
No.3
- 回答日時:
> なぜ、window.openを使用しなければならないのかというと、
> 以下で質問した際に、この方法でうまくいきました。
それぞれの質問を読みましたが、親→子、子→親の両方の質問が混じってますよね?
質問される際は、どちらのどの処理で困っているのか明記されるとよいと思います。
で、親から子を開く時には、ウィンドウスタイルの指定などのために window.open することはありますが、子から親に向けて送信する時には、既にウィンドウがあるので window.open は必要ありません。
今、質問されているのは、子ウィンドウから親ウィンドウへの送信ですよね?ということは window.open を使う必要はないということです。
なお、やはり私が試した限りでは「引数が無効」のエラーは発生しません。
親ウィンドウのURLと子ウィンドウのURLで、ドメインが違うということはありませんか?
本件については未確認ですが、異なるドメインのウィンドウを操作しようとすると、エラーとなることがあります。
ちなみに、
> <FORM>で、渡している項目数が多すぎて、このような結果になりました。
「渡す項目」って INPUT とか SELECT とかのことですよね?これの数が多すぎて問題になるということは、通常あり得ません。
どこか別のところに問題があると考えて間違いないでしょう。
それと、q=990988 の方でちょっと気になったことがあり、そちらにも書き込みましたのでご確認ください。
No.3 の補足で挙げられた質問などから考えられる、全体のサンプルを簡単に書いてみましたので、ご参考ください。
■親ウィンドウのHTML
<html>
<head>
<title>親</title>
<script type="text/javascript">
<!--
// 自分に名前を付ける
window.name = "oya";
// FORM送信で開くウィンドウのスタイルを指定するための関数
function make_newwin(f) {
var w = window.open("about:blank", f.target, "スタイル設定");
w.focus();
}
//-->
</script>
</head>
<body>
<form action="/cgi-bin/test-check.cgi" method="post" target="ko" onSubmit="make_newwin(this)">
<input type="submit">
</form>
</body>
</html>
■子ウィンドウのHTML(test-check.cgiで出力)
<html>
<head>
<title>子</title>
<script type="text/javascript">
<!--
// 親ウィンドウに対して送信し、自分は閉じるための関数
function send2opener(f) {
if (!opener || opener.closed)
f.target = '_blank';
else if (opener.top.name)
f.target = opener.top.name;
else
f.target = opener.top.name = 'dummy_name';
f.submit();
window.close();
return false;
}
//-->
</script>
</head>
<body>
<form action="/cgi-bin/test_new.cgi" method="post" onSubmit="return send2opener(this)">
<input type="submit">
</form>
</body>
</html>
※JavaScriptコードのインデントに全角スペースを使用していますので、コピーして試される場合はタブなどに置き換えてください。
この回答への補足
回答有難うございます。サンプルのソースまで
書いていただいて、大変助かります。
説明のつじつまが合わなくて、本当申し訳ありません。上のソースでうまくいったのですが、
あと1つ教えていただきたいのです。
■親ウィンドウのHTMLで、target="ko"と限定して
ありますよね。もし、親ウィンドウも2つ表示されて
いて、子ウィンドウも2つ表示されている場合、
それぞれの処理をさせるためには、どうしたら
良いでしょうか?今の状態ですと、子ウィンドウ
が、上書きされてしまいます。
教えて下さい。
No.2
- 回答日時:
> 親 → 子 → 親(更新)と言う形で処理をしたいのですが、
> この記述は、子 → 親(更新)に作成したものですが。
はい、私もそのつもりで回答したのですが・・・。
# それともどこか認識のずれがあるでしょうか?
> 以下のように、targetを表示してみたところ、うまく表示できていました。
> alert(f.target)
そうですよね、f.target は
document.test.target=opener.window.top.name;
で取得しているので、これがちゃんと表示されないと“それ以前の問題”ということになってしまいます。
> var w = window.open('about:blank', f.target);
> の行で、「引数が無効です」と表示されます。
> 解決する方法はないでしょうか?
これなんですが、私の環境(WinXP+IE6)ではエラーが起きないんですよ。
で、どうせ f.target である親ウィンドウは既に開いているのだから、わざわざ window.open せずに、FORM の target のみを変更する方法を No.1 で書いたわけです。
# というか、targetは指定してあるのだから、単純に window.open しないだけで解決するような気もします。
もし No.1 の方法を試されていないのでしたら、一度試してみてもらえますか?それでもエラーが出るようでしたら、再度補足ください。
また、もし質問の make_newwin のコードが主要部の抜粋だとすれば、全容を示してもらえると何か分かるかも知れません。
この回答への補足
回答有難うございます。
とても、わかりにくい説明で申し訳ありません。
なぜ、window.openを使用しなければならないのかというと、
以下で質問した際に、この方法でうまくいきました。
http://oshiete1.goo.ne.jp/kotaeru.php3?q=949297
http://oshiete1.goo.ne.jp/kotaeru.php3?q=975293
ここまでは、ウィンドウ名を固定にしていたので、
うまくいっていたのですが、この質問をしたところ、
難しくなり、今質問させていただいてる件に至ります。
http://oshiete1.goo.ne.jp/kotaeru.php3?q=990988
<FORM>で、渡している項目数が多すぎて、このような結果に
なりました。
説明不足でもうしわけありません。
良かったら教えて下さい。
No.1
- 回答日時:
要するに、opener.top(opener.window.top と同じ)に対して送信したい、ということですよね?
だったら送信時に name を取得して target に設定すればよいだけで、事前に取得したり、window.open したりする必要はありません。
<script type="text/javascript">
<!--
function setTarget(f) {
// このHTMLが直接開かれた場合(openerがundefined)や
// 親ウィンドウが既に閉じられた場合には _blank にする。
if (!opener || opener.closed)
f.target = '_blank';
// opener.top.name が設定されていればそれを使う。
// ※topウィンドウの場合、普通は設定されていない。
else if (opener.top.name)
f.target = opener.top.name;
// name が設定されていない場合は、強制的に設定する。
else
f.target = opener.top.name = 'dummy_name';
close();
}
// -->
</script>
<FORM action="/cgi-bin/test.cgi" method="post" onSubmit="setTarget(this)">
※下記の部分は必要ありません。
<script>
document.test.target=opener.window.top.name;
</script>
この回答への補足
素早い回答、感謝しております。
親 → 子 → 親(更新)と言う形で処理をしたいのですが、
この記述は、子 → 親(更新)に作成したものですが。
以下のように、targetを表示してみたところ、うまく表示できていました。
var w = window.open('about:blank', f.target);
の行で、「引数が無効です」と表示されます。
解決する方法はないでしょうか?
function make_newwin(f) {
alert("送信しました。" + document.test.target)
alert(f.target)
var w = window.open('about:blank', f.target);
w.focus();
window.close();
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- JavaScript javascript作成してます。ラジオボタンで判定するコードを書いてます。 1 2023/07/18 11:03
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- JavaScript switch文のswitch(n)の部分を複数の値にするか、if文に変えてほしいです。 1 2022/07/27 17:18
- JavaScript セレクトボックスを2つ設けて選択して初めてメッセを表示 1 2022/07/27 12:15
- JavaScript javascriptのちょっとした動作不良(原因は突き止めたのですが) 1 2023/06/15 19:58
- JavaScript jqueryを使ったスムーススクロールのコードを書いたのですが、HTMLコード内にある、a butt 2 2022/04/14 10:59
- JavaScript sessionStorageを調べています。 1 2023/06/20 12:41
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
閉じるボタンを押すときに表示...
-
タイトルバーのウインドを閉じ...
-
window.openで同画面遷移しない
-
window.open()の複数の使用
-
特定のウィンドウ名を持つウィ...
-
親タブから子タブ開いて親タブ...
-
window.open でExcelファイルを...
-
<a href="#" …>の意味を教えて...
-
bodyにidをつける理由は何ですか?
-
別ファイルのfunctionの読み込み方
-
複数のJavascriptを1つのscrip...
-
base64encodeでの文字化けについて
-
javascriptでalertの文字列をコ...
-
ウインドウの後ろに隠れている...
-
cssにjavascriptを入れる?呼び...
-
Vbscriptで自分自身のウィンド...
-
複数のページ(html)のvalueを...
-
文字を入れ替わり表示させたい...
-
document.getElementById
-
【SSI】include file、include ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
window.open でExcelファイルを...
-
ポップアップウィンドウの位置
-
JavaScript <a>タグで開いた画...
-
window.openで同画面遷移しない
-
特定のウィンドウ名を持つウィ...
-
ウィンドウ名の設定
-
入力したテキストボックスのデ...
-
javascriptからウィンドウを開...
-
openerの関係が崩れてしまった...
-
親ウィンドウから子ウィンドウ...
-
JavaScriptで開いている別ウィ...
-
親タブから子タブ開いて親タブ...
-
window.openで
-
Ajaxでウインドウ出力について
-
小さなウインドウ開いて自動閉...
-
ウィンドウを最大化したい!
-
サブウィンドウから親ウィンド...
-
open()したウィンドウを見せな...
-
ポップアップウインドウを開い...
-
<FORM>タグのtargetに値を書込...
おすすめ情報