2017-05-17 1 views
0

ページの親ウィンドウがいくつかの子ウィンドウクローズイベントをリッスンしています。子ウィンドウが閉じている場合、そのページはグリッドビューでポストバックを行います。したがって、親ページは再ロードされず、window_dictionaryは 'リセット'されません。次のコードでは、ウィンドウオブジェクトをグローバルJavaScript辞書に値として追加します。オブジェクトにはキー(「clickedRow」+レコードidの組み合わせ)が含まれ、値はウィンドウオブジェクトです。複数の子ウィンドウのクローズイベントをリッスンし、複数の子ウィンドウが閉じられたかどうかを確認することはできません。

最初のウィンドウクローズイベントでは正常に動作しますが、次のウィンドウクローズイベントでは正常に動作します。たとえば、2つの子ウィンドウを開くと、最初のウィンドウを閉じることができ、__dopostback()メソッドが呼び出されますが、残りのウィンドウを閉じると__dopostback()は呼び出されません。

setInterval呼び出しに問題があると想定します。しかしながら;私はしばらくの間立ち往生しており、これが期待どおりに動作することはできません。

すべてのウィンドウが閉じているため、私はポストバックを行いたいと思います。

コード

var openedWindows = {}; 

    setInterval(checkIfWindowIsClose, 40); 

    function openThisWindow(popLoc, attributes, id) { 
     var winInst = window.open(popLoc, attributes, id); 
     openedWindows["clickedRow" + id] = winInst; 
    } 

    function checkIfWindowIsClose() { 
     var id = ""; 
     for (var i in openedWindows) { 

      if (openedWindows[i].closed) { 
       // i is the id of your window and here you know that your window with id i has been closed 
       // here remove also the window from the object otherwise you will keep also the instance of the closed one 
       console.log(i); 
       delete openedWindows[i]; 
       id = (' ' + i).slice(1); 
       id = id.replace("clickedRow", ""); 

      } 
     } 
     if (id !== "") { 

      __doPostBack('upInspectionList.UniqueID', id.toString()); 
      id = ""; 
     } 

    } 

+0

checkChildは何も返さないので、timerの値は何でしょうか。 –

+0

@manikantgautam、私は質問の目標を理解しているか分からない。辞書の1つのウィンドウについてのみ聞くことができるので、JavaScript辞書の追加されたすべてのウィンドウを聴くことができますか? –

答えて

1

はあなたの開いた窓を保存するオブジェクトを作成します。ありがとうございます。 ウィンドウが閉じられているかどうかを検出するために、オブジェクト内にインターバルサイクルを設定します。 私はそれを試してみましたが、うまく動作します。もちろん、この例を必要に応じて変更してください。 この方法では、毎回新しいタイマーを作成するのではなく、ただ1つのタイマーが必要です。

HTML:

<div> 
    <button id="button-1" onclick="openThisWindow(this);">Button 1</button> 
    <button id="button-2" onclick="openThisWindow(this);">Button 2</button> 
    <button id="button-3" onclick="openThisWindow(this);">Button 3</button> 
</div> 

JS:

var openedWindows = {}; 

setInterval(checkIfWindowIsClose, 4); 

function openThisWindow(el) { 
    var winInst = window.open("http://www.google.it"); 
    openedWindows[el.id] = winInst; 
} 

function checkIfWindowIsClose() { 
    for (var i in openedWindows) { 
     if (openedWindows[i].closed) { 
      // i is the id of your window and here you know that your window with id i has been closed 
      // here remove also the window from the object otherwise you will keep also the instance of the closed one 
      console.log(i); 
      delete openedWindows[i]; 
     } 
    } 
} 

それは理にかなっていますか?

+0

はい、ただし、複数の子ウィンドウがあることを覚えておいてください。そのため、これらのオブジェクトをグローバル辞書に追加しています。最初の投稿にJQueryを追加するべきではないので、私はお詫びします。しかしながら;子ウィンドウが毎秒更新されるので、あなたの提案された解決策は機能しません.... –

+0

いいえ、私はあなたのタイマーを完全に削除することを意味します。このソリューションを使用すると、開いたすべてのウィンドウにアンロードイベントが発生します。これにより、ポストが正しい名前を渡します。 しかし、メインの子ウィンドウがカスケードで他の子ウィンドウを開く可能性がありますか? – quirimmo

+0

p.s.更新されたjQueryの削除 – quirimmo

関連する問題