页面加载后控件的空引用

Null reference from control after page loads

本文关键字:引用 控件 加载      更新时间:2023-09-26

我正在尝试在页面加载后运行一段javascript:

    protected void Page_LoadComplete(object sender, EventArgs e)
    {
        if (IsPostBack)
        {
            string controlName = getPostBackControlName();
            if (controlName == "btnSubmit" || controlName == "ddlSalary")
            {
                Page.ClientScript.RegisterStartupScript(GetType(), "myAlertScript", "onLoadDisplay(this)", true);
            }
        }
    }

以下是引用的javascript:

    function onLoadDisplay(sender) {
        PerDiemClicked(sender);
    }
    function PerDiemClicked(sender) {
        if (document.getElementById('<%= chkbxPerDiem.ClientID %>').checked == true) {
            document.getElementById("PerDiemDisplay").style.display = 'inline';
        }
        else {
            document.getElementById("PerDiemDisplay").style.display = 'none';
        }
    }

我收到此错误:

0x800a138f - JavaScript 运行时错误:无法获取属性 "已检查"未定义或空引用

我不明白为什么检查返回 null,因为我正在等待页面在检查之前完成回发。如何检查此控件并正确运行上述代码?

编辑:这是复选框:

<asp:CheckBox ID="chkbxPerDiem" runat="server" Checked="false" onclick="PerDiemClicked(this)" />

您的脚本可能在将chkbxPerDiem添加到 DOM 之前执行。 在窗口加载事件中执行脚本:

window.addEventListener("load", function() {
    onLoadDisplay(this);
});

试试这个:

Page.ClientScript.RegisterStartupScript(GetType(), "myAlertScript", @"        
window.addEventListener('load', function() {
    onLoadDisplay(this);
});", true);

查看此答案

这是我解决它的方法。

此代码实际上在页面加载后发布:

    protected void Page_LoadComplete(object sender, EventArgs e)
    {
        if (IsPostBack)
        {
            string controlName = getPostBackControlName();
            if (controlName == "btnSubmit" || controlName == "ddlSalary")
            {
                Page.ClientScript.RegisterStartupScript(GetType(), "myAlertScript", "window.addEventListener('load', function() { onLoadDisplay(this); });", true);
            }
        }
    }

我必须修改javascript函数以检查它是否存在,然后再检查它是否被选中:

    function PerDiemClicked(sender) {
        if (document.getElementById('<%= chkbxPerDiem.ClientID %>') != null) {
            if (document.getElementById('<%= chkbxPerDiem.ClientID %>').checked == true) {
                document.getElementById("PerDiemDisplay").style.display = 'inline';
            }
            else {
                document.getElementById("PerDiemDisplay").style.display = 'none';
            }
        }
    }

谢谢大家。

>Page_LoadComplete服务器端事件,所有服务器端事件都将在页面发送到浏览器之前运行。请记住,这些服务器端事件与构建页面有关。您需要在浏览器构建、提供和完全加载页面后运行 JavaScript。这意味着 Page_LoadComplete 事件早在 JavaScript 代码运行之前就运行了。

Page.ClientScript.RegisterStartupScript(GetType(), "myAlertScript", "onLoadDisplay(this)", true);

上面的代码注册了对 JavaScript 加载函数的调用。但它会在页面顶部插入对该函数的调用。因此,它将在加载页面的其余部分之前运行。

您需要查看 ASP.NET 事件的工作原理。同样,所有服务器端事件甚至在页面发送到浏览器之前运行。JavaScript 应该在浏览器收到并加载页面之前运行。