2014-02-24 42 views
0

我試圖確定頁面加載的客戶端窗口大小,用於使用c#創建位圖。從閱讀SO和其他地方,我知道一種方法將是:在頁面加載時從客戶端獲取Javascript值

  1. 編寫一個Javascript函數以獲取相關的值;
  2. 將這些存儲在隱藏字段中;
  3. 使用後面的代碼(c#)讀取值,然後用它做東西。

但是,我被執行序列絆住了,它在任何Javascript之前運行代碼,儘管我已經設置了<body onload...來獲取和設置相關值。 (見下)

我知道我的代碼的其餘作品,因爲,當我執行時,頁面顯示單詞「by」和按鈕。然後,在點擊按鈕並重新加載頁面後,它現在可以突然讀取兩個隱藏值。

我的問題是,我如何才能讓我的C#的Page_Load代碼從客戶端得到這兩個隱藏價值,之前執行我的代碼的休息,而不需要像點擊一個按鈕,用戶操作?

我的頁面:

<body onload="getScreenSize()"> 
    <form id="form1" runat="server"> 

     <input type="hidden" name="hiddenW" ID="hiddenW" runat="server" /> 
     <input type="hidden" name="hiddenH" ID="hiddenH" runat="server" /> 
    <script> 
     function getScreenSize() { 
      var myW = document.getElementById("hiddenW"); 
      myW.value = window.innerWidth; 
      var myH = document.getElementById("hiddenH"); 
      myH.value = window.innerHeight; 
     } 
    </script> 
     <asp:Button ID="Button1" runat="server" Text="Button" /> 
    </form> 
</body> 

後面的代碼:

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     Response.Write(hiddenW.Value+" by " +hiddenH.Value); 
    } 

} 

在第一次運行時(我需要這些值),這表明

enter image description here

和我點擊後該按鈕,它證明了Javascript的工作原理:

enter image description here

的問題,然後,是怎麼做的,我得到我的Page_Load代碼的其餘部分運行,這樣我就可以直接進入生成和顯示我的形象之前,這些價值觀?

+0

使用domready中的事件,它觸發窗口加載之前,所有你需要的數據是可用的(窗口高度等)..更多關於此這裏:http://www.javascriptkit.com/ dhtmltutors/domready.shtml –

+0

請參閱我已更新我的答案以顯示如何使用JQuery執行此操作 – P5Coder

回答

2

在C#Page_Load()執行之前,您無法獲取客戶端窗口大小,因爲在C#代碼執行完成後,頁面呈現給客戶端。
窗口大小可能會在頁面加載過程中發生變化,因此您必須在頁面加載完成後才能獲取窗口大小。

解決方案
您可以使用Ajax的值發送給後端,在頁面完全加載後。
OR
您可以使用Java腳本,你得到正確的值後,引起後背部,這樣說:
JQuery的:

$(function() { 
    var width = window.innerWidth || 
      document.documentElement.clientWidth || 
      document.body.clientWidth; 
    var height = window.innerHeight || 
      document.documentElement.clientHeight || 
      document.body.clientHeight; 
    $('#hdn_width').val(width); 
    $('#hdn_height').val(height); 
    $('#your_form').submit(); 
}); 

C#:

protected void Page_Load(object sender, EventArgs e) 
{ 
    try 
    { 
     if (IsPostBack) 
     { 
      // Use hdn_width and hdn_height here 
     } 
    } 
    catch (Exception ex) 
    { 
    } 
} 
+0

好的,這很有道理。鑑於這個事實,有沒有辦法讓我等待直到頁面呈現,獲取相關的值,然後(沒有用戶操作)繼續執行一個C#代碼塊? – user2007841

1

使用IsPostBack財產

這將解決您的問題

For Example

if(!Page.IsPostBack) 
{ 
    //Control Initialization 
    //Your code goes here 
} 
+0

謝謝,但這需要用戶操作來引起回發,這是我不想要的。使用代碼導致它發生的最好方法是什麼? – user2007841

+0

ajax將是異步錯誤的選擇 –

相關問題