Javascript 自定义控件的HTMLDocument getElementById返回null,原因是什么,是否有其他访问方式?
我在aspx页面的body标签中有以下内容: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
<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
的控件)
谢谢,
Voodooasp.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并不需要