我有javascript代码,为我点击一个按钮。 它在机器1上托管时有效,但在机器2上托管时,.GetElementByID调用返回Null。
js代码如下所示:
function ClickAButtonForMe() {
var btn = null;
var btnClientID = '<%= btnReset.ClientID %>';
//this comes back with a valid clientID on **both** machines
alert("btnClientID=/" + btnClientID + "/, nodevalue=/" + nodeValue + "/");
if (0 < btnClientID.length) {
btn = document.getElementById(btnClientID);
}
if (btn != null) {
//on machine 1, this works as expected
btn.click();
}
else {
//on machine 2, i come here
alert("button not found");
}
}
我的ascx文件中的按钮声明如下所示:
<div id="div_Reset" class="eventManagementButtonWrapper" runat="server">
<div>
<asp:Button class="eventManagementButton" ID="btnReset" ValidationGroup="None" runat="server"
Text="Reset" />
</div>
</div>
换句话说,我可以在两个环境中获得我的按钮的clientid。但是当我尝试实际抓住按钮时,它在机器2上失败了。
在找出造成这种差异的原因时,有人会建议可以考虑的事情吗?我已经尝试将ClientIDMode更改为“Static”,除了在第一个调试消息中更改clientID之外什么都不做。
答案 0 :(得分:1)
确保“&lt;%= btnReset.ClientID%&gt; ”表达式在两种情况下都生成相同的ClientID值。看起来您在WebUserControl中使用此标记,其ID(以及按钮的ClientID也是相应的)也是如此计算的。
作为通用解决方案,您可以使用this主题中的方法:
<asp:Button ... ID="btnReset" OnInit="btnReset_Init" />
protected void btnReset_Init(object sender, EventArgs e) {
Button btn = (Button)sender;
string script = string.Format("var _{0} = document.getElementById('{1}');", btn.ID, btn.ClientID);
Page.ClientScript.RegisterStartupScript(Page.GetType(), "ANY_KEY", script, true);
}
<script language="javascript" type="text/javascript">
function ClickAButtonForMe() {
//alert(_btnReset);
_btnReset.click();
}
</script>
答案 1 :(得分:1)
这很奇怪。 您是否尝试将ClientIDMode更改为“静态”并更改此内容:
'<%= btnReset.ClientID %>'
只是:
btnReset
一旦ClientIDMode为“Static”,asp就不会向控件ID添加任何内容,并在命名时将其保留。
根据我的经验,当'&lt;%='不起作用时,我尝试使用'&lt;%#'(不是哈希标记)。但是,这可能会将问题解决在一台计算机上并在另一台计算机上创建。所以,试试我的第一个建议,看看它是否有帮助。
答案 2 :(得分:1)
以下是针对某些可能出错并导致环境特定差异的一些建议,请注意:其中大多数并非仅针对您的问题。
答案 3 :(得分:0)
只有一种情况会在不同的机器上造成这种情况:
“在DOM尚未就绪时调用ClickAButtonForMe函数”