2012-02-28 96 views
2

我有点击一个按钮给我的JavaScript代码。 它在机器1上托管时工作,但托管在机器2上时,.GetElementByID调用返回Null。getElementById在一个环境中工作,但不在另一个环境中

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

你想按钮做什么?有些方法不依赖于抓取元素ID。 – 2012-02-28 20:08:06

+0

机器1和机器2有什么不同?另外,这只是意味着在IE中工作? 'click()'是特定于IE的。 – 2012-02-28 20:08:19

+0

@Diodeus - 更大的图片是屏幕上有两个TreeView控件。单击该按钮可将选定节点从左侧的树中滑入右侧的树中。我试图通过在用户点击树本身时触发这个动作来自动滑动它们。该功能在我的本地机器上运行 - 但不在部署机器上运行。 – JosephStyons 2012-02-28 20:16:54

回答

1

确保“<%= btnReset.ClientID%>”表达式在两种情况下都会生成相同的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

这是奇怪的。 你有没有试图改变的ClientIDMode为“静态”,并改变这个:

'<%= btnReset.ClientID %>' 

只是:

btnReset 

一次的ClientIDMode是“静态”,ASP不向控制标识添加任何东西,离开它,因为你命名它。

根据我的经验,当'<%='不起作用时,我尝试使用'<%#'(不是散列标签)。但是,这可能会解决一台机器上的问题,并在另一台机器上创建它。所以试试我的第一个建议,看看它是否有帮助。

0

只是一个方案将导致不同的机器上这样的情况:

“你叫ClickAButtonForMe功能,而DOM还没有准备好”

+0

这很有道理,但这是用户发起的操作,在页面完成后几秒钟发生洛阿丁。有什么可能导致DOM长时间保持未准备好吗? – JosephStyons 2012-02-29 05:04:50

1

这里有一些事情可能出错,并导致环境的具体差异的一些建议,请注意:其中大部分并不仅限于您的问题。

  • 清除所有浏览器上的缓存。
  • 检查所有浏览器的版本。
  • 比较浏览器中的输出HTML。
  • 用户登录是否相同(或相关类似)
  • 它们是否在同一页?
  • 它是相同的url,还是两个不同的代码相同的宿主副本?
    • 如果是这种代码的不同副本,确保它是相同的版本
  • 根据环境(和应用程序的类型)做一个IIS复位,以确保正确的dll被加载。
  • 您是否在其中一个环境中运行调试/发行版本?
  • 你在一个环境中运行IN调试吗?
  • 在这两种情况下DOM是否完全加载? (竞赛条件?)
相关问题