2011-04-14 141 views
1

我需要在加载页面计算当前从UTC时间偏移。这是我可以做的非常简单的通过一个JavaScript函数调用,页面主体onload事件的一部分,如下所示:ASP.Net LoadComplete事件在页面加载之前运行?

<script type="text/javascript" language="javascript"> 

    function getOffset() { 
     var curUTCDate = new Date(); 
     var iMins = curUTCDate.getTimezoneOffset(); 
     return iMins; 
    } 
</script> 

<body id="bodymain" onload="javascript:document.forms[0]['hdnOffset'].value=getOffset();"> 
<form id="form1" runat="server"> 

    <input id="hdnOffset" runat="server"/> 
    <asp:Label ID="lblText" runat="server"></asp:Label> 

然而,当我尝试使用在代码中这个值落后于Page_LoadComplete的一部分在服务器端如下图所示

protected void Page_LoadComplete(object sender, EventArgs e) 
    { 
     if (!String.IsNullOrEmpty(hdnOffset.Value)) 
     { 
      lblText.Text = hdnOffset.Value + " value set"; 
     } 
     else 
     { 
      lblText.Text = " value not set "; 
     } 
    } 

但是偏移确实可用作为它的值现在显示在输入框中一旦页面完全呈现偏移值尚未确定。所以对我来说,这看起来好像被称为身体onload事件的一部分的JavaScript只在Page完全加载后被调用。

这怎么可能?

+0

因为在客户端发生身体onload事件后的页面已经完全从服务器上呈现。此时服务器上唯一发生的事件是'Unload'。如果您希望客户端到服务器的通信没有回传,您需要使用ajax。 – 2011-04-14 16:12:34

回答

8

你在这里混淆了两个完全不同的“加载”事件。

首先,服务器端代码(在您的情况下ASP.NET)运行的整体。在这个循环中,有一对夫妇的事情发生,以及它们之间是LoadLoadComplete事件。

当服务器完成后,确定应该渲染什么,它开始向浏览器发送东西(通常是HTML和JavaScript)。在浏览器端,触发另一个load事件 - 即在页面上<body>元素。他们的名字相同,但他们完全独立。

要修复此问题,请在服务器端将lblText.Text设置为"value not set",并在更改偏移指示符时将其更改为JavaScript。

服务器端:

protected void Page_LoadComplete(object sender, EventArgs e) 
{ 
    // Possibly even better to do this in the properties of the control... 
    lblText.Text = "value not set..."; 
} 

客户端:

<script type="text/javascript" language="javascript"> 
    function setOffset() { 
     var curUTCDate = new Date(); 
     var iMins = curUTCDate.getTimezoneOffset(); 
     document.forms[0]['hdnOffset'].value = iMins; 
     document.getElementById('lblText').innerHtml = 'value set'; 
    } 
</script> 

<body id="bodymain" onload="javascript:setOffset();"> 

如果你不使用ASP.NET 4,你在哪里给在你控制的客户端ID的全面控制,你应该看看jQuery。这是一个JavaScript库,您可以使用它来处理大量的事情,在这种情况下,可以更轻松地找到标签控件。

+0

+1,非常好的解释。 – Town 2011-04-14 16:14:34

+0

谢谢,很好的解释。不幸的是,jQuery在这种情况下不起作用,因为我需要使用各种不同的服务器端方法的偏移量。想想我只是放入一个后台工作人员来检查值何时可用并从服务器端使用它。 – Johnv2020 2011-04-14 16:21:14

2

的ASP.Net将处理完该页面返回HTML以此时的onload函数调用浏览器之前。

+0

我可以理解,但是即使我在SaveStateComplete中执行检查,该值也不可用。由于SavedStateComplete事件几乎是最后一个使用的事件,除了Unload以外,这意味着所有的asp。净生命周期事件发生在任何客户端负载事件之前。这是预期的行为? – Johnv2020 2011-04-14 16:14:05

+0

所有ASP.Net生命周期事件完成,然后页面呈现并发送到客户端。一旦页面被浏览器接收并加载,javascript方法就会触发。 – tomasmcguinness 2011-04-15 08:22:34

相关问题