2012-03-26 45 views
0

所以我使用onbeforeunload事件來關閉從我的父窗口打開的任何子窗口(圖像)。我正在使用的代碼是舊的,父窗口爲不同的操作做了很多後備,所以我跟蹤服務器端的圖像,並在需要時將onbeforeunload屬性添加到主體。使用onbeforeunload的不可靠結果

當要關閉窗口時,服務器端代碼將編寫一個腳本,該腳本只需使用字符串參數調用Javascript函數。 Javascript工作正常,問題是它並不總是受到打擊。

我的服務器端代碼如下所示:

private void CloseAllChildren() 
{ 
    // some code to retrieve image window names... 

    string script = "closeAllChildren('imagewindowname1,imagewindowname2,etc');"; 
    _body.Attributes.Add("onbeforeunload", script); 
} 

當被觸發close事件時調用close方法:

private void Close() 
{ 
    // A bunch of code... 

    // close the window after all folders have been routed 
    CloseAllChildren(); 
    this.Response.Write(FolderView.WindowClose); 
} 

我什麼都不知道了電腦是隨機的,但我的結果似乎沒有遵循任何形式。有時候它會碰到Javascript並且完美地工作,有時它在相同的測試條件下從不會碰到Javascript。我假設有某種競爭條件,但我不知道如何檢測或修復它。有沒有人有這方面的經驗或更好的方式?就像我說的,代碼是舊的,這是功能的一個小的補充,所以我不想改變任何當前的框架。

在此先感謝。

+0

你應該發佈JavaScript端的事件處理程序的樣子......哦,等等;我猜你是那樣做的。但那個「closeAllChildren」函數呢?這看起來像什麼(JavaScript版本,而不是創建對它的調用的服務器端代碼)。 – Pointy 2012-03-26 15:05:44

+0

Javascript只是關閉窗口的基礎上,告訴窗口'的功能closeAllChildren(names){ if(names!=「」)var openedWindows = names.split(','); while(openedWindows.length> 0){var _name = openedWindows.pop(); var win = window.open(winName,winName); win.close(); } } }'這不是問題,但如果這個方法被擊中,它的工作沒有失敗。我的問題在於它並不總是受到打擊。 – MGraffia 2012-03-26 16:09:52

+0

此外,我在這裏發佈相當新,我不知道如何在評論中添加代碼塊。 – MGraffia 2012-03-26 16:12:08

回答

0

在嘗試了上面的建議以及我自己的一些想法之後,似乎問題在於,在添加onbeforeunload屬性(因爲它正在動態寫入)之前,javacript將最終執行window.top.close()命令,這與我所期望的。我通過將window.top.close()更改爲setTimeout(function() {window.top.close();}, 100)而增加了半秒的暫停時間,它似乎修復了我所遇到的「隨機性」。

我很感激幫助,雖然我沒有最終使用其他解決方案,但他們幫助我找到了真正的問題。

1

JavaScript onbeforeunload事件觸發後,您的服務器端關閉事件很有可能發生。爲什麼有條件地將javascript函數調用添加到您的身體標記?爲什麼不隨時添加在你的JavaScript處理程序:

window.onbeforeunload = closeAllChildren('imagewindowname1,imagewindowname2,etc'); 

然後closeAllChildren將無論什麼樣的服務器是做調用。

+0

父頁面導致太多後貼片,所以如果我總是處理它,窗戶將不應該關閉。我還需要根據存儲在服務器端的名稱添加參數,這裏輸入的參數只是一個示例。 – MGraffia 2012-03-26 16:08:39

+0

@MGraffia [Page.IsPBackBack](http://msdn.microsoft.com/zh-cn/library/system.web.ui.page.ispostback.aspx#Y0) – jbabey 2012-03-26 17:08:05

+0

我不確定我是否理解這有何幫助。我理解onbeforeunload的方式是它在頁面卸載之前觸發,在回發的情況下就是在我能夠使用Page.IsPostBack捕獲任何東西之前。如果我錯了,請糾正我,但它看起來不像檢查是否有回傳將解決此問題。 – MGraffia 2012-03-26 17:19:19