ASP.NET 控件的 JavaScript getElementById 返回 null?

Posted

技术标签:

【中文标题】ASP.NET 控件的 JavaScript getElementById 返回 null?【英文标题】:JavaScript getElementById for ASP.NET Control returns null? 【发布时间】:2010-11-10 06:43:20 【问题描述】:

我使用 javascript,在执行过程中出现此错误:

Microsoft JScript runtime error: 'document.getElementById(...)' is null or not an object

这是我的代码:

<asp:Content ID="content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<script language="javascript" type="text/javascript">
    function ConfirmTransfere() 
        if (confirm("Syatem not allow negative inventory, would you like to continue ?") == true) 
            document.getElementById("btnAlelrt").click();

               

</script>
<asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>
    <asp:UpdatePanel ID="uxContainer" runat="server">
    <ContentTemplate>
 <table> 
<tr>
        <td>
        <asp:Button ID="uxTransfer" runat="server" Text="Transfer" OnClick="uxTransfer_Click" /> 
        <asp:Button ID="btnAlelrt" runat="server" Text="GetDetails" OnClick="btnAlelrt_Click" />       
        </td>
        </tr>
</table>
    </ContentTemplate>
<Triggers>
    <asp:PostBackTrigger ControlID="uxTransfer" />    
    </Triggers>
    </asp:UpdatePanel>

 </asp:Content>

【问题讨论】:

【参考方案1】:

这个:

function ConfirmTransfere() 
        if (confirm("Syatem not allow negative inventory, would you like to continue ?") == true) 
            document.getElementById("btnAlelrt").click();

               

必须是这样的:

function ConfirmTransfere() 
        if (confirm("Syatem not allow negative inventory, would you like to continue ?") == true) 
            document.getElementById('<%=btnAlert.ClientID%>').click();

             

问题在于您的按钮是一个 ASP.Net 控件,并且会生成它自己的客户端 ID,这与您指定的 ID 不同。输入代码&lt;%=btnAlert.ClientID%&gt; 会将生成的代码发布到浏览器。

【讨论】:

【参考方案2】:

你可以用这个:

document.getElementById('<%= btnAlelrt.ClientID %>').click()

从 ASP.NET 4.0 开始,您可以为您的元素使用 ClientIDMode 属性。如果您将其设置为Static,那么ClientID 的值将设置为ID 属性的值:

<asp:Label ID="Label1" runat="server" ClientIDMode="Static" />

会被渲染成这样的:

<span id="Label1" name="ctl00$MasterPageBody$ctl00$Label1" />

【讨论】:

谢谢,ClientIDMode="Static" 解决了我的问题,因为我无法在 javascript 中获取 div。【参考方案3】:

您为 asp:Button 提供的 ID 是 ASP.Net 在服务器上使用的 ID。它不是客户端脚本使用的 ID。

你应该使用:

document.getElementById("<%= btnAlelrt.ClientID %>").click();

【讨论】:

【参考方案4】:

如果您在生成的页面上查看源代码,您可能会发现该按钮不再具有 ID“btnAlelrt”。它可能有类似“ctl001_btnAlert”之类的东西,或其他生成的唯一性标识符。

这就是您的 javascript 找不到它的原因。

您需要按标签搜索,并检查 ID 以查看它们是否以 btnAlelrt 结尾,或者您必须在其周围放置一个 DIV 或 SPAN,并使用不会更改的 ID(即'没有 runat="server")。然后,您可以通过其 ID 找到该元素,然后获取其中的按钮。

如果可以,您可以使用 语法在您的 javascript 中插入正确的 ID。

(旁注:这应该是 btnAlert 吗?)

【讨论】:

【参考方案5】:

目前我找不到可以为您发布的代码示例,但我可以解释您遇到的问题。

ASP.NET 在将对象/元素/按钮写入页面时不使用您为其提供的 ID,而是为对象提供客户端 ID。

如果您在代码中执行 Msgbox(btnAlelrt.clientID),那么您将看到您的 javascript 应该使用的对象名称。

最好让 .NET 代码在 javascript 中将这些值写入页面,因为它们不是常量。

希望这会有所帮助。

詹姆斯

【讨论】:

【参考方案6】:

如果您查看呈现的页面,名为 btnAlelrt 的控件不再具有该名称...

如果添加“

【讨论】:

【参考方案7】:

尝试使用 ClientIDMode="Static"。这不会在运行时更改按钮 ID。

  <asp:Button ID="SendMessageButton" ClientIDMode="Static" runat="server" Text="Send Message" CssClass="buttonPositive"
            CausesValidation="True" OnClientClick="validate();" OnClick="SendMessageButton_Click" />

然后您可以使用下面的 jquery 来访问您的按钮。我希望这有帮助。

 var element = document.getElementById('SendMessageButton');

【讨论】:

以上是关于ASP.NET 控件的 JavaScript getElementById 返回 null?的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET 用户控件中的 Javascript 函数

如何将 javascript 与 asp.net 下拉列表控件一起使用?

asp.net c# javascript 控件集合无法修改,因为控件包含代码块(即<% ... %>)

ASP.NET 控件的 JavaScript getElementById 返回 null?

ASP.NET 在嵌套在更新面板中的用户控件中注入 javascript

Javascript 在 ASCX 中不起作用 – ASP NET 用户控件