【问题标题】:ASP.Net LoadComplete event running before Page Load?ASP.Net LoadComplete 事件在页面加载之前运行?
【发布时间】:2011-08-05 16:19:57
【问题描述】:

我需要计算加载页面时与 UTC 时间的当前偏移量。我可以通过作为页面正文 onload 事件的一部分的 javascript 函数调用非常简单地做到这一点,如下所示:

<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 仅在页面完全加载后才被调用。

这怎么可能?

【问题讨论】:

  • 因为在页面从服务器完全渲染后,body onload 事件发生在客户端。此时服务器上发生的唯一事件是Unload。如果您希望在没有回发的情况下进行客户端到服务器的通信,则需要使用 ajax。

标签: javascript asp.net


【解决方案1】:

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

首先,服务器端代码(在您的情况下为 ASP.NET)运行完整。在这个循环中,发生了几件事,其中包括 LoadLoadComplete 事件。

当服务器确定应该呈现什么后,它开始向浏览器发送内容(通常是 HTML 和 JavaScript)。在浏览器端,另一个 load 事件被触发 - 页面上&lt;body&gt; 元素的事件。它们的名称相同,但它们是完全独立的。

要解决此问题,请在服务器端将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 库,您可以将其用于无穷无尽的事情,在这种特定情况下,这将使查找标签控件变得更加容易。

【讨论】:

  • 谢谢,很好的解释。不幸的是,jQuery 在这种情况下不起作用,因为我需要将偏移量用于各种不同的服务器端方法。想我会放一个后台工作人员来检查值何时可用并从服务器端使用它。
【解决方案2】:

ASP.Net 将在将 HTML 返回到浏览器之前完成对页面的处理,此时调用 onload 函数。

【讨论】:

  • 我可以理解,但是即使我在 SaveStateComplete 进行检查,该值也不可用。由于 SavedStateComplete 事件几乎是最后使用的事件,因此 Unload 除外,这意味着所有 asp.net 生命周期事件都发生在任何客户端加载事件之前。这是预期的行为吗??
  • 所有 ASP.Net 生命周期事件完成,然后呈现页面并将其发送到客户端。一旦页面被浏览器接收并加载,javascript 方法就会触发。
【解决方案3】:

请参阅以下链接以了解页面生命周期..

http://msdn.microsoft.com/en-us/library/ms178472.aspx

【讨论】:

    猜你喜欢
    • 2016-11-21
    • 2017-01-13
    • 1970-01-01
    • 2018-08-16
    • 2021-05-26
    • 2021-04-08
    • 2011-10-20
    • 1970-01-01
    相关资源
    最近更新 更多