2010-03-02 24 views
2

我注意到window.onunload事件在page_load事件之後觸發,這沒有任何意義。Javascript window.onunload在頁面加載後關閉Page_Load

這種行爲正在爲我創建一個問題 - 在我的unonload中,我清除了會話,因此如果Page_Load第一次在onunload之前,在顯示的頁面上有錯誤。

我希望javascript onunload在引導Page_Load之前啓動....是正確的假設嗎?

要澄清: 讓我們假設我在頁面test.aspx,然後我點擊鏈接到同一個頁面(說我點擊菜單),我觀察到的是,Page_Load首先觸發,然後onunload起火。 根本沒有意義。

+0

這個問題並沒有太大的意義,因爲它是目前措詞。爲什麼你會期望頁面在加載之前卸載? – EricLaw 2010-03-02 00:16:56

+0

請參閱我的說明 – sarsnake 2010-03-02 00:30:04

+0

是否有任何特殊原因要清除用戶onunload事件的會話。 – azamsharp 2010-03-02 02:05:44

回答

1

這是一個特定於瀏覽器的行爲。Chrome和FF會在發送onunload之前發送一個GET請求,IE8將首先執行onunload。不確定,其他瀏覽器如何處理它。最好不要依賴這個功能。

0

我會猜測是window.unload實際上只有射擊時,你將不得不呈現新頁面,您導航到(又名老DOM代替一些新的HTML被拆掉)。瀏覽器不知道要呈現什麼內容,直到響應從服務器返回並顯示HTML。在頁面生命週期完成之前不會生成HTML,其中包括Page_Load。因此,window.unload之前的page_load?

在任何情況下,如果您可以在window.unload期間清除會話,爲什麼不僅僅是爲了響應某些用戶交互而清除它,並且對它進行更明確一點?

編輯:你也可以嘗試window.onbeforeunload?

+0

問題是我無法控制用戶。用戶可以選擇點擊他們想要的地方。所以如果他們點擊一個菜單,我會希望window.onunload將首先觸發,清除會話,然後page_load將會觸發。並非如此。 – sarsnake 2010-03-02 00:32:55

+0

我編輯了我的答案 - window.onbeforeunload幫助你的事業嗎? – Eric 2010-03-02 00:37:50

+0

謝謝,但onbeforeunload實際上會產生更多問題 - 它會彈出一個程序員無法手動訪問的對話框。我不想讓對話彈出,我只想要清除會話,然後加載新頁面。 Arggg,顯然要求太高。 – sarsnake 2010-03-02 00:45:07

0

onunload事件在將新頁面的請求發送到服務器之前會觸發,所以在服務器上運行Page_Load方法之前,它肯定會觸發。

問題很可能是您從onunload事件向服務器發送了另一個請求。由於IIS只能從每個用戶一次處理一個請求,因此該請求將在新頁面的請求之後排隊並執行。

+0

我給onunload裏面的服務器發送了請求,在Page_Load內部放置了斷點。儘管如此,Page_Load首先執行,然後從window.unonload中發出警報消息......給出了什麼? window.unonload事件的關鍵是什麼,然後如果它在新頁面加載後執行。 – sarsnake 2010-03-02 01:04:14

+0

有沒有一種方法可以在加載新頁面之前真正清除會話?我完全失去了和沮喪。 – sarsnake 2010-03-02 01:20:19

+0

@guffa - 我只是寫了一個小測試應用程序,我不認爲onunload在請求到服務器之前觸發。我很懷疑自己 - 但測試應用程序不會撒謊。 – Eric 2010-03-02 01:54:46

0

您可以編寫一個實用程序函數,該函數將處理刪除會話變量,然後在相應的菜單單擊事件中調用該函數。這應該是更簡單的使用,因爲窗口卸載只會在頁面加載後觸發。

1

您是否考慮過爲您的頁面使用通用基類,如果請求不是回發(我假設您使用會話進行回發),那麼請清除會話中的會話?

public class BasePage : System.Web.UI.WebControls.Page { 
    protected override OnPreInit (EventArgs e) { 
    // Get in nice and early, however you could use OnInit if you prefer 
    if (!Page.IsPostBack) { 
     Session.Clear(); 
    }   
} 

然後頁面都需要清除會話可以聲明爲:

public class SpecialPage : BasePage { 
    // Your page logic goes here. 
    // Note that if you need to do work in OnPreInit here you should call 
    // base.OnPreInit(e) first. 
} 
0

這聽起來像你正在使用的會話保存從頁面切換到頁面的臨時變量。我認爲會議並不適合這種情況。更好的解決方案是使用Httpcontext的Item集合,該集合僅在每個請求的基礎上作用。在存儲數據時它與Session一樣工作。

Context.Items["myvariable"] = "some data"; 

,因爲它是唯一的作用域在每個請求的基礎上,就沒有必要使用JavaScript來清除已存儲在每個頁面請求的項目。