getElementById在一个环境中工作,但在另一个环境中不工作

时间:2012-02-28 20:03:22

标签: javascript asp.net iis

我有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之外什么都不做。

4 个答案:

答案 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)

以下是针对某些可能出错并导致环境特定差异的一些建议,请注意:其中大多数并非仅针对您的问题。

  • 清除所有浏览器上的缓存。
  • 检查所有浏览器的版本。
  • 比较浏览器中的输出HTML。
  • 是否与登录的用户相同(或相关类似)。
  • 他们是否在同一页上?
  • 是相同的网址,还是相同代码的两个不同的托管副本?
    • 如果这是代码的不同副本,请确保它是相同的版本
  • 根据环境(以及应用程序的类型)执行IIS重置以确保加载正确的dll。
  • 您是否在其中一个环境中运行调试/发布版本?
  • 您是否在其中一个环境中运行IN调试?
  • 两种情况下DOM都满载吗? (竞争条件?)

答案 3 :(得分:0)

只有一种情况会在不同的机器上造成这种情况:

“在DOM尚未就绪时调用ClickAButtonForMe函数”