Javascript 自定义控件的HTMLDocument getElementById返回null,原因是什么,是否有其他访问方式?

Javascript 自定义控件的HTMLDocument getElementById返回null,原因是什么,是否有其他访问方式?,javascript,asp.net,Javascript,Asp.net,我在aspx页面的body标签中有以下内容: <form id="Form1" method="post" runat="server"> <customControl:menu id="Menu1" runat="server"> </customControl:menu> </form> 从另一个aspx页面,我有一个javascript函数: <script type="text/javascript"> functi

我在aspx页面的body标签中有以下内容:

<form id="Form1" method="post" runat="server">
 <customControl:menu id="Menu1" runat="server">
 </customControl:menu>
</form>

从另一个aspx页面,我有一个javascript函数:

<script type="text/javascript">
 function testFunction(args, name) {
  alert(top.frames[0].document);      //gives me [object HTMLDocument]
  alert(top.frames[0].document.getElementById("Form1"));  //gives me [object HTMLFormElement]
  alert(top.frames[0].document.getElementById("Menu1"));      //gives me [null]
 }
</script>

函数testFunction(参数、名称){
警报(top.frames[0].document);//给我[object HTMLDocument]
警报(top.frames[0].document.getElementById(“Form1”);//给我[object HTMLFormElement]
警报(top.frames[0].document.getElementById(“Menu1”);//给我[null]
}
为什么第三个警报给我空值?(
菜单
是一个扩展名为
ascx
的控件)

谢谢,
Voodoo

asp.net输出的
id
可能不是
Menu1
-asp.net通常将容器名称连接到控件
id
,以避免页面中重复的
id
s

使用该属性获取将输出到浏览器的
id

alert(top.frames[0].document.getElementById("<%:Menu1.ClientId%>")); // .NET 4 syntax
alert(top.frames[0].document.getElementById("<%=Menu1.ClientId%>")); // .NET 2/3/3.5 syntax
警报(top.frames[0].document.getElementById(“”);/。NET4语法
警报(top.frames[0].document.getElementById(“”);/。NET 2/3/3.5语法

asp.net输出的
id
可能不是
Menu1
-asp.net通常将容器名称连接到控件
id
,以避免在页面中重复
id

使用该属性获取将输出到浏览器的
id

alert(top.frames[0].document.getElementById("<%:Menu1.ClientId%>")); // .NET 4 syntax
alert(top.frames[0].document.getElementById("<%=Menu1.ClientId%>")); // .NET 2/3/3.5 syntax
警报(top.frames[0].document.getElementById(“”);/。NET4语法
警报(top.frames[0].document.getElementById(“”);/。NET 2/3/3.5语法
试试这个

 alert(top.frames[0].document.getElementById("<% = Menu1.ClientID %>"));
强制ID保持不变

试试这个

 alert(top.frames[0].document.getElementById("<% = Menu1.ClientID %>"));
强制ID保持不变


当元素位于自定义控件或其他此类容器(例如母版页)内时,ASPX会创建一个id,以便元素在页面上具有唯一的id(通过将容器名称添加到元素id等)。因此,您不能使用javascript中为元素提供的id;它的实际id将不同


在aspx代码中,您可以使用ClientId属性访问该运行时id。或者,您可以使用jQuery并使用其他选择器(例如名称、类等)来标识元素。

当元素位于自定义控件或其他此类容器(例如母版页)内时,ASPX会创建一个id,以便该元素在页面上具有唯一的id(通过将容器名称添加到元素id等)。因此,您不能使用javascript中为元素提供的id;它的实际id将不同


在aspx代码中,您可以使用ClientId属性访问该运行时id。或者,您可以使用jQuery和其他选择器(例如名称、类等)来标识元素。

让我引用我最近写的一篇文章:

中的每个服务器端Web控件 ASP.NET Web窗体应用程序具有 标识Web的ID属性 控件的名称,并且是 在中访问Web控件 代码隐藏类。当呈现为 在HTML中,Web控件将 将服务器端ID值转换为 客户端id属性。理想的, 会有一对一的 价值的对应关系 服务器端ID属性和 已生成客户端id,但在 现实情况并非如此简单。通过 默认情况下,呈现的客户端id 通过使用Web控件的 ID属性,并在其前面加上 其命名的ID属性 容器。简而言之,Web控件 如果ID为txtName,则可以渲染 使用 客户端id-like ctl00\u main content\u txtName

此默认翻译来自 服务器端ID属性值 渲染的客户端id属性可以 在尝试解决问题时引入挑战 通过JavaScript访问HTML元素, 这通常由id完成,如 页面开发人员构建网页 而编写JavaScript并不需要 了解渲染对象的id值 Web控件将在设计时启用

Web控件的客户端id值可以在运行时通过Web控件的ClientID属性确定。这就是为什么其他人建议使用硬编码的id名称来代替

如果使用ASP.NET 4.0,则可以更好地控制Web控件如何通过客户端将其ID属性呈现为客户端ID。也就是说,您可以将菜单的ClientIDMode属性设置为Static,以确保服务器端ID属性和客户端ID属性之间存在一对一的对应关系(但使用这种方法时必须小心)

有关更多信息,请参阅:


快乐编程

让我引用我最近写的一篇文章:

中的每个服务器端Web控件 ASP.NET Web窗体应用程序具有 标识Web的ID属性 控件的名称,并且是 在中访问Web控件 代码隐藏类。当呈现为 在HTML中,Web控件将 将服务器端ID值转换为 客户端id属性。理想的, 会有一对一的 价值的对应关系 服务器端ID属性和 已生成客户端id,但在 现实情况并非如此简单。通过 默认情况下,呈现的客户端id 通过使用Web控件的 ID属性,并在其前面加上 其命名的ID属性 容器。简而言之,Web控件 如果ID为txtName,则可以渲染 使用 客户端id-like ctl00\u main content\u txtName

此默认翻译来自 服务器端ID属性值 渲染的客户端id属性可以 在尝试解决问题时引入挑战 通过JavaScript访问HTML元素, 这通常由id完成,如 页面开发人员构建网页 而编写JavaScript并不需要