Category Archives: javascript

[InternetExplorer]親切じゃないJavascriptのalert(e)

ここ数日、Javascriptだったのですが・・・。
先日のエントリの「こ、これでいい?サブ画面の存在判定方法」を次の日にDEBUGしてalert(e)でエラーの内容をIE7で出力してみたところ、

[object error]

とだけ教えてくれました。
・・・

気を取り直して、Firefox3で試そうとしたとき、思い出しました。それは、このWEBシステムがすごい作りになっていたことです。
簡単にいうと、以下のようなソースになっちゃってる。

<html>
  <html>
    hogehoge
  </html>
  <html>
    hogehoge
  </html>
</html>

おそらくですが、Strutsの便利機能「Tiles」の使い方が間違ってる・・・。なので、Firefoxでは画面の表示すらできません。
orz

Firefoxで動作させた感じでは、アラートメッセージが表示されなかったのでエラーにはならないんですね。IE限定かと。

こ、これでいい?サブ画面の存在判定方法

今日も恥・・・ではなく、ソースコード晒し。
昨日のJavaScriptですが、思うような動きにならなかったので修正。

■"開くサブ画面はひとつだけ"を実現したい
やりたいことがこれ。

  • 画面A → サブ画面
  • 画面A上のリンクをクリック。onclickイベントでJavaScriptを呼び、その読んだ先でwindow.opne('','hogehoge");でサブ画面を生成して、メイン画面からフォームをサブミットして、そのターゲットにサブ画面を設定する。こんな流れを実装しました。

しかし、このパターンだと、すでにサブ画面が存在する場合は、サブミットしてもすでにある画面が表示されるだけで、サーバーへリクエストが送信されませんでした。
で、サブ画面がすでに存在していたらとにかくCloseすることで対応することにしました。

でやったのが、これ。

var subwin; //サブ画面生成時の戻り値

function opneWindow(){
 subwin = window.open('','hogehoge');
 try{
  //①サブ画面にフォーカスする
  subwin.focus();
 }catch(e){
  //エラーをcatchしたら、サブ画面をクローズ
  subwin.close();
 }
//ターゲットを設定して、サブミット
form.target = 'hogehoge';
form.action = 'hogeAction';
form.submit;
}

catchしたときの例外内容を確認忘れたw
こんなロジックを組みました。

  • 画面A → 画面B → サブ画面
  • 画面AとBの間を行ったりきたりします。画面Bから開くサブ画面はひとつにしたい。これ、どう実現したらいいのかまるでわかりませんでした。いったん画面Aに戻ってしまったら、サブ画面は宇宙の果て・・・的な位置づけで、再度画面Bに遷移したとき、見つけることが・・・できませんよね。

    こんな感じで画面を移動
    =============================
    ①回目 画面A → 画面B → サブ画面
    ~~画面Aに戻る~~
    ②回目 画面A → 画面B → サブ画面
    =============================

で、いろいろ試してできたのが、上のコードです。
1回目のサブ画面が存在している状態で、
2回目 画面B → サブ画面 のとき subwin.focus()はエラーになります。
window.open('','hogehoge');で画面を開く場合、同名のwindowがあると名前の衝突が発生する?のでしょうか・・・。

明日、subwin.focus();で発生する例外の内容を確認しようと思います。

独習JavaScript 独習JavaScript
高橋 和也 竹添 直樹 里見 知宏

翔泳社 2008-11-20
売り上げランキング : 30122

Amazonで詳しく見る by G-Tools

JavaScriptでサブウィンドウの存在をチェックしながら、window.openする方法

自分メモ。できたできた。

タイトルのとおり。
毎回同じwindowめがけてSubmitしたいのですが、すでにTargetととなるサブウィンドウが存在している場合、JspからActionクラスを経由しない症状に困っており、今回のような方法を思いつき、やってみましたよ!

※前回ソースに追記してます。
» クリックのあと、3秒間リンクを無効にするJavaScript

<html>
 <head>
  <script type="text/javascript">
  <!--
  //windowオブジェクト
  var winobj;

  function openSubWindow(){
   //サブウィンドウの存在チェック
   if(!winobj || winobj.closed || typeof winobj != "undefined"){
    //何もしない
   }else{
    //存在する場合、閉じる
    winobj.close();
   }
   //新規作成
   winobj = window.open('file:///C:/Users/hse9212/Desktop/test2.html', 'new_window');
   winobj.focus();

   return true;
  }

  //書き換え前HTML
  var beforeLinkAreaHtml;

  //一定時間リンク無効化
  function disableLinkArea(){
   //書き換え前を保持
   beforeLinkAreaHtml = document.getElementById("linkarea").innerHTML;

   //対象のDIV要素内のHTMLを書き換える
   document.getElementById("linkarea").innerHTML = "enjoy tricks";

   //タイマー処理で、3秒後にHTMLを書き戻す
   setTimeout(function(){document.getElementById("linkarea").innerHTML = beforeLinkAreaHtml;},"3000")

   //return false;
  }
 // -->
 </script>
</head>
<body>
 <div id="linkarea">
  <a href="#" onclick="disableLinkArea(); return openSubWindow();">enjoy tricks</a>
 </div>
</body>
</html>

ちなみにIE限定を想定しています。サブウィンドウの状態チェックで

window.Closed

はIEの場合、正しい値を返却しないバグあるようですが、これでもうまくいってるのは、あとの条件が聞いてるからでしょうか・・・。実はそのあたり微妙加減はあるのですが、実装。

あとはStrutsとの兼ね合いがうまくいけばいいのですが・・・。

■参考
» JavaScriptで,グローバル変数の存在判定をする3つの方法 ("window"の定義状況を確認したい)

クリックのあと、3秒間リンクを無効にするJavaScript

仕様を無茶振りされたので、その対応に無茶実装返し。

"クリックされたあと、3秒間は無効になるリンク"というものを実現すべく、見よう見まねで実装したのが、以下のJavaScriptです。

<html>
 <head>
  <script type="text/javascript"><!--
   //書き換え前HTML
   var beforeLinkAreaHtml;

   //一定時間リンク無効化
   function disableLinkArea(){
     //書き換え前を保持
     beforeLinkAreaHtml = document.getElementById("linkarea").innerHTML;
     //対象のDIV要素内のHTMLを書き換える
     document.getElementById("linkarea").innerHTML = "enjoy tricks";

     //タイマー処理で、3秒後にHTMLを書き戻す
     setTimeout(function(){document.getElementById("linkarea").innerHTML = beforeLinkAreaHtml;},"3000")

      return false;
      }
  // -->
 </script>
 </head>
 <body>
   <div id="linkarea">
    <a href="http://enjoytricks.com" target="new_window" onclick="return disableLinkArea();">enjoy tricks</a>
   </div>
 </body>
</html>

jQueryのプラグインで同じような3秒ルールをFormのSubmitボタンに適応するというものがあったので、それを真似してみました。

とにかく、できました。