• ベストアンサー

window.closedについて

ウィンドウが開いているかどうかを確認するため、window.closedを使用しております。(ソースは下記参照) しかし、w1=window.open("","Page2");が一度も実行されていない場合は、w1オブジェクトが存在しないためエラーになってしまいます。 対応方法として、 1、HTML、またはcookieに、Page2を開いたことがあるかどうかフラグを持たせる。 ことを考えていますが、どうもスマートではなく納得がいきません。 その他、対応方法がございましたらご教授ください。 宜しくお願い致します。 ---------------ソース--------------------------- ○Javascript funciton test(){ if(w1.closed){ w1=window.open("","Page2"); } document.frm1.submit(); } ○HTML <a herf="javascript:void(0)" onclick="test();">実行</a> <form method="post" name="frm1" action="#" target="Page2"> <input type="hidden" name="id" value="1115" /> </form>

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

  • ベストアンサー
  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.5

if (w1 != null && w1 != undefined){ 部分がうまく働いておりません。 >> うーん。うちの環境だと 定義してない(w1=window.openを実行していない)と w1は"undefined"になっているんですけどねえ。 if (typeof w1 != 'undefined'){ でも一緒ですけど。

mori1115
質問者

補足

いろいろありがとうございます。 typeof w1 != 'undefined' でうまく働きました。 もう一つご教授ください。 w1はページがreloadされると消えてしまいますが、これを生かしておく方法はあるのでしょうか?サーバーサイドに逃がしたりする方法とかあるのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.4

<w1のスコープはどうなるのでしょうか?> funciton test(){ if (w1 != null && w1 != undefined){ w1.close(); }else{ w1=window.open("","Page2"); } document.frm1.submit(); } のように関数内でvarを付けないと、自動的に グローバル変数になります。 var w1; function test(){ ---- } と同じです。 一方、 funciton test(){ if (w1 != null && w1 != undefined){ w1.close(); }else{ var w1=window.open("","Page2"); } document.frm1.submit(); } 関数内でvar付きで宣言すると、宣言している位置にかかわらず、 関数先頭で宣言された事になり、その関数内でのみ参照可能な ローカル変数になります。この場合、関数が呼ばれるたびに w1が初期化されますから、いつも'undefime'のはずです。

mori1115
質問者

補足

たびたびすいません、もう一つ教えてください。 w1 != null && w1 != undefined 部分がうまく働いておりません。 w1を定義せずに使った場合、w1を捕まえるには何を使えばよいのでしょうか? w1==null でも w1==undefinedでもうまくいきません。 宜しくお願い致します。

全文を見る
すると、全ての回答が全文表示されます。
回答No.3

こういうことでしょうか? var w1; if(!w1||w1.closed){ w1=open("","Page2"); }else{ w1.location.href="Page2"; } 通常は同じtargetを指定しておけば同じウインドウで表示するはずですので、closedを使うことはほとんどないと思います。 w1=open("page2", "Page2"); > 1、HTML、またはcookieに、Page2を開いたことがあるかどうかフラグを持たせる。 > ことを考えていますが、どうもスマートではなく納得がいきません。 よくわかりませんが、たとえば昨日アクセスしたときにPage2を開いたのも履歴として持たせたいなら、cookieしか方法はないと思います。 (HTML5のデータベースや、サーバーにアカウント情報として履歴を残すのは別)

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

いや~てまえみそで はずかしい はなしなのだけれど undefined はグローバルで undefined = true; もできるってさぁ。 このあいだおしえてもらいました。 だから typeof w1 != 'undefined'

全文を見る
すると、全ての回答が全文表示されます。
  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.1

意図がよくわからないけど、普通は var w1; if (w1 != null && w1 != undefined){ w1.close(); }else{ w1=window.open("","Page2"); } でしょ。

mori1115
質問者

補足

早速のご回答ありがとうございます。 変なことを聞くかもしれませんが、教えてください。 w1のスコープはどうなるのでしょうか? 上記関数を実行後、また同じ関数を実行された場合、w1は初期化されないのですか? 同様に、上記関数実行後、別関数で同じくw1を調べることは可能ですか? w1をグローバルに持たせておいて、イベントハンドラごとにw1の中を調べたいと考えております。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 閉じた後のwindow.closed検知

    javascriptでwindow.closed()と関数の実行順序についての質問です。 以下のようなことを実現したいです。なお、(2)ではuserAgentではなく、画面が閉じているかどうかを検知してポップアップを出したいです。 --- (1)自画面の閉じるボタンで関数呼んでwindow.close()実行 (2)同じ関数内で、window.closeでは閉じない場合のみ検知してポップアップを出す --- 一つの関数では(もしくは複数関数を入れ子にしても)、window.closeのあとwindow.closed()の判定などを行おうとすると、window.closeで閉じるはずのブラウザで画面が閉じてくれません。 (window.closeで閉じるブラウザでは、そもそも(2)は実行されないのでは?と思ったり…) 初歩的な質問で申し訳ありませんが、とても困っています。 どうぞよろしくお願いいたします。

  • htaについて。親画面子画面を認識したい

    現在ローカルPC内で本番環境をさわる前のシュミレーション用にhtaを使って擬似環境を作っています。 htaで親画面子画面での値の受渡しやopenerを使って親画面を最前面に表示をしたいと思います。 以下のhtmlだとうまく値を受渡し後、親画面を最前面に表示できたのですがhtaにhtmlを切り替えて 同じように動かそうとすると以下のエラーがでました。 [window.opener.frm1はNullまたはオブジェクトではありません。] ネットで調べてみましたがhtaでopenerを使う方法などがうまく見つかりません。 どなたかご教授願います。宜しくお願いいたします。 *テストした内容 --親window(test1.html)-- <HTML> <HEAD> <META HTTP-EQUIV="Content-Language"CONETNT="ja"> <META HTTP-EQUIV="Content-Type"CONTENT="text/html;CHARSET=shift_jis"> <TITLE><練習用>エリア応対支援</TITLE> <Script Language="JavaScript"> resizeTo(400,400); function wopen4(){ window.open('test2.html','_blank'); } </SCRIPT> </HEAD> <BODY> <FORM name="frm1"> <input type ="button" onClick="wopen4()" value="子オープン"><br> <input ="text" NAME="text1"> </FORM> </BODY> </HTML> --子window(test2.html)-- <HTML> <HEAD> <META HTTP-EQUIV="Content-Language"CONETNT="ja"> <META HTTP-EQUIV="Content-Type"CONTENT="text/html;CHARSET=shift_jis"> <TITLE>子ウィンドウ</TITLE> <Script Language="JavaScript"> resizeTo(300,400); function w_od(){ window.opener.frm1.text1.value=frm2.text2.value; } function w4cus(){ window.opener.focus(); } </SCRIPT> </HEAD> <BODY> <FORM name="frm2"> <input ="text" class="inset2" NAME="text2"> <input type="button" class="outset4" onclick="w_od();w4cus()" value="設定" > </FORM> </BODY> </HTML>

    • ベストアンサー
    • HTML
  • window openについて

    こんにちは、例えば以下のようなスクリプトがあったとします。 <html> <form name = serchform> <input type=text name=id><br> <input type=submit value=ID検索 onclick="openwin()"> <a href="javascript:open(1);"><Img Src="1.bmp"></a><br> <a href="javascript:open(2);"><Img Src="2.bmp"></a><br> <script type="text/javascript"><!-- function openwin() { a = document.serchform.id.value; url = "http://10.8.2.166/test/syuhou_kensaku.php?id="+a; mywin = window.open(url,"","width=1120,height=500"); } function open(select) { if(aa == 1){ alert("Test") url2="http://10.8.2.166/test/kensaku.php?msg="+Testです; mywin2 = window.open(url2,"",""); } } //--></script> このソースを実行すると、ID検索ボタンをクリックしても何も反応せず 1.bmpをクリックすると、Testとメッセージが表示され、画面左下に 警告マークが表示され、何も反応しません。 しかし、function open(select)を削除し、ID検索ボタンをクリック すると命令した処理を実行してくれます。 function openwin()を削除したらその逆も起きるのかと考えやって みたのですが、これについては上記と同じエラーでした。 なぜこのようになるのか原因が分かりません。 どなたかご存知の方がいらっしゃいましたら、アドバイスよろしく お願い致します。

  • open.window(javascript) を使わないで、新規windowを3つ開く方法

    JavaScpript の open.window を使うと、値がGET で渡ってしまいます。 POST でデータを渡したいので、FORM で window を 3つ開く方法って ないでしょうか? <FORM method=POST name=form1 target="window1" ACTION="/cgi-bin/search1.pl"> <input type="text" name="searchword1"> </form> <FORM method=POST name=form1 target="window2" ACTION="/cgi-bin/search2.pl"> <input type="text" name="searchword2"> </form> <FORM method=POST name=form1 target="window3" ACTION="/cgi-bin/search3.pl"> <input type="text" name="searchword3"> </form> の 3 つのフォームを 1 つの <input type="submit" name="Search" value=" 検索 "> で起動させるってことです。 (または、open.windows で値を渡すとき、POST で渡したい) よろしくお願いします。

    • ベストアンサー
    • CGI
  • IE7でのwindow.close後のwindow.openについて

    javascriptで、ボタンクリックでウィンドウを開くときに、同じ名前のウィンドウが既に開いていたら一回閉じで、開き直すというロジックを書いてます。 これはIE6では正常に動いているのですが、IE7になると、ウィンドウが閉じたまま、開き直さないで何も表示されなくなってしまいます。たまに開くときもあるのですが。 ボタンクリック後のコードを載せます。 ちゃんと開く方法はないでしょうか? function openwindow(){ var newWindow = window.open("test.html", "test"); if(newWindow.name == "test") { newWindow.close(); } oneScdWindow=window.open("test.html", "test"); }

  • window.open()で開いたウィンドウにパラメータを渡す。

    まずは下記のHTMLファイルをご覧下さい。 ------------------------------------------------- <HTML> <HEAD> <TITLE>TEST01</TEST> <ScriptLanguage="JavaScript"> <!-- function new_win() { window.open("new_win1.cgi","POPUP", "scrollbars=1,status=0,location=0,toolbar=0,menubar=0,resize=1,height=450,width=300"); } //--> </script> </HEAD> <BODY> <FORM NAME="SEND_DATA"> <INPUT TYPE="hidden" NAME="par01" VALUE="aaaa"> <INPUT TYPE="hidden" NAME="par02" VALUE="bbbb"> <INPUT TYPE="hidden" NAME="par03" VALUE="cccc"> <INPUT TYPE="button" NAME="btn01" VALUE="SEND" onClick="new_win()"> </FORM> </BODY> </HTML> ------------------------------------------------ 以上です。このHTMLファイルを動かすとボタンだけが表示されます。 そしてそこのボタンをクリックしますと、新しいウィンドウが 出力され、そこには"new_win1.cgi"の処理結果が表示されます。 そこで、そのCGIを動かす時に"SEND_DATA"というフォーム内の データも一緒に送信したいのですが、どのようにやればよろしいのでしょうか?

    • ベストアンサー
    • HTML
  • <FORM>タグのtargetに値を書込む方法を教えて下さい

    送信ボタンを押すと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>

  • 別windowを開いて同じ関数を走らせたい

    別windowを開いて同じ関数を走らせたい 今回のスクリプトではブックマークレットAの形式で、あるページ(http://www.aaa?page=1&a=b)で実行すると同ドメインのpage=2,page=3・・・とブックマークレットAに定義した関数を実行しようとしています。firebugで開発をしています。 まずは、次のページ(page=今のページ+1)を開いて次のページで前のページで実行したブックマークレットAのスクリプトに定義された関数(と同じ効果のものでもOK)を実行させたいと思っています。 ---ブックマークレットAとして実行するスクリプト--- *試したコード1 function findUser(){(略)} var w=window.open(getXXXURL(++currentPage)); w.focus(); setTimeout("findUser(searchID,currentPage)",3000); →元のページでfindUserしてしまう(新しいページに適用したい) *試したコード2 function findUser(){(略)} var w=window.open(getXXXURL(++currentPage)); w.focus(); findUser(searchID,currentPage); →元のページでfindUserしてしまう(新しいページに適用したい) *試したコード3 function findUser(){(略)} var w=window.open(getXXXURL(++currentPage)); w.focus(); w.setTimeout("findUser(searchID,currentPage)",3000); →新しいページでfindUserが定義されてないのでエラー *試したコード4 function findUser(){(略)} var w=window.open(getComURL(++currentPage)); w.focus(); w.setTimeout("window.opener.findUser(window.opener.searchID,window.opener.currentPage)",3000); →元のページでfindUserしてしまう(新しいページに適用したい) このようにいろいろと試したのですが、どうにもうまくいきませんでした。 良いアイデア、例など、あなたのご意見、お待ちしております。

  • ENTERキーを無効にしたいのですが教えて下さい

    ENTERキーを無効にしたいのですが、SUBMITボタンでjavascriptを動かしています。 SUBMITを押した瞬間に、別ウィンドウにデータを渡しているのですが、 どの部分にどのようなスクリプトを追加すれば良いでしょうか? 良かったら教えて下さい。 ■親ウィンドウのHTML <html> <head> <title>親</title> <script type="text/javascript"> <!-- window.name = (new Date()).getTime();    function make_newwin(f) {   f.target = window.name + "_ko";   var w = window.open("about:blank", f.target, "スタイル設定");   w.focus(); } //--> </script> </head> <body> <form name="test" action="/cgi-bin/test-check.cgi" method="post" onSubmit="make_newwin(this)"> <input type="submit"> </form> </body> </html>

  • windowのクローズについて

    javascriptを以下のように利用する方法として より良い方法を教えてください。 現在、1つのフォームに2つのボタン(b1,b2)を利用して ・b1 を押すと新しいウィンドウ(w1)を作成(立ち上げる) ・b2 を押すとウィンドウ(w1)をクローズする というものを作成しています。 b1実行時の処理として w1 = window.open("about:blank","w1"); document.forms[0].target="w1"; retun true; b2実行時の処理として document.forms[0].target="_top"; if(!w1.closed)w1.close(); return true; このようにした場合、 一度、b1を実行してウィンドウ(w1)を立ち上げてから b2を実行すれば何も問題なくウィンドウ(w1)は閉じます。 しかし、b1を実行していない場合や、 ユーザが自分でウィンドウ(w1)を閉じた場合、b2実行時に IEで「ランタイムエラー w1が宣言されていません」 とエラーが出ます。 (エラーが出るだけで処理自体は問題ないようです) どのように記述すればエラーになりませんか?

このQ&Aのポイント
  • 経験がない状況での選任電気主任技術者の仕事についての不安や挑戦をまとめました。
  • 電気室やキュービクルの巡視点検が主な仕事であり、故障時の対応も必要です。
  • 人身事故や火災時には責任を取らなければならないことがあり、経験者のコメントを求めています。
回答を見る

専門家に質問してみよう