我需要计算加载页面时UTC时间的当前偏移量。这可以通过javascript函数调用非常简单地作为页面的body onload事件的一部分来完成,如下所示:
<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 ";
}
}
然而,一旦页面完全呈现,偏移确实可用,因为它的值现在显示在输入框中。所以对我来说,这看起来好像作为body onload事件的一部分调用的javascript只在Page完全加载后被调用。
这怎么可能?
答案 0 :(得分:8)
你在这里混淆了两个完全不同的“加载”事件。
首先,服务器端代码(在您的情况下为ASP.NET)完整地运行 。在此周期中,会发生一些事情,其中包括Load
和LoadComplete
事件。
当服务器完成应该呈现的内容时,它开始向浏览器发送内容(通常是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库,可以用于无数的东西,在这种特定的情况下,它可以更容易地找到标签控件。
答案 1 :(得分:2)
ASP.Net将在将HTML返回浏览器之前完成页面处理,此时调用onload函数。
答案 2 :(得分:0)
请参阅以下链接,了解页面生命周期..