2014-02-24 41 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将是异步错误的选择 –

相关问题