我继承了一个项目,其中包含一些依赖于硬编码对象id的讨厌的JavaScript 即有很多地方可以做这样的事情
var magazine = document.getElementById('repModuleDisplay__ctl3_chkCats_0');
当页面在我的UAT环境中呈现时,HTML看起来像这样,一切正常。
<input id="repModuleDisplay__ctl3_chkCats_0"
type="checkbox" name="repModuleDisplay:_ctl3:chkCats:0"
... etc
然而,当我把它放在我的生产环境中时,HTML突然就像这样:
<input id="repModuleDisplay_ctl03_chkCats_0"
type="checkbox" name="repModuleDisplay$ctl03$chkCats$0"
... etc
ids的差异意味着JavaScript无法找到Element,并且失败。
在一个理想的世界中,我会删除错误的JavaScript并再次正确地执行它,但为了快速解决问题,我想知道是什么导致了两种环境之间渲染的差异。
有没有人有任何想法?
谢谢, 尼尔
答案 0 :(得分:7)
我能想到的最快最简单的修复 - 如果代码遍布整个地方可能不是特别快速或简单 - 是使用控件的实际ClientID
属性而不是尝试猜猜生成的id可能是什么:
// i've assumed that the control is named chkCats
var magazine = document.getElementById('<%= chkCats.ClientID %>');
答案 1 :(得分:4)
您必须将clientID用于asp.net控件。
'<%=mycontrol.ClientID %>'
答案 2 :(得分:2)
使用.NET4并在要与js一起使用的控件上设置ClientIDMode属性。
EG;
<asp:TextBox ID="txtComment" runat="server" CssClass="myClass"
ClientIDMode="Static" MaxLength="1024"></asp:TextBox>
答案 3 :(得分:1)
This link简要介绍了ASP.NET如何创建ID,所有其他海报都推荐使用控件的ClientID的正确解决方案。
如果你想避开ASP样式标签,那么另一种选择是在PreRender期间向你的页面发出一些js:
StringBuilder sb = new StringBuilder();
sb.AppendLine(string.Format("var myTextBox = document.getElementById('{0}');", MyTextBox.ClientID));
if (!Page.ClientScript.IsClientScriptBlockRegistered(this.GetType(), "myElementDefinitions"))
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "myElementDefinitions", sb.ToString());
然后在您的javascript代码中,您只需使用名称 myTextBox 来引用它。此选项可能不适合您,取决于您的代码以及使用ASP标记引用相同控件ID的频率。