当要查找的元素 has 时,我们有几种情况$get('foo')
或document.getElementById('foo')
失败style="display:none;"
。这似乎在某些浏览器中有效,但在其他浏览器中无效;特别是下面显示的情况在具有兼容模式的 IE9 中可以正常工作,但在关闭兼容模式时会失败。
谁能解释为什么会发生这种情况,以及我们如何解决它?下面是一个例子。
我们的 ASPX 页面包含
<span id="JobAddressCheckBoxWrapper" style="display: none;">
<asp:CheckBox ID="JobAddressCheckBox" CssClass="DefaultTextCell" runat="server" Text="__Job address"
Style="margin-right: 2em;" onclick="ShowJobAddress();" />
</span>
<span id="PredefinedReplyCheckBoxWrapper">
<asp:CheckBox ID="PredefinedReplyCheckBox" CssClass="DefaultTextCell" runat="server"
Text="__Pre-defined reply" onclick="ShowReplies()" AutoPostBack="false" Style="margin-right: 2em;" />
</span>
这导致生成的 HTML
<span style="display: none;" id="JobAddressCheckBoxWrapper">
<span style="margin-right: 2em;" class="DefaultTextCell">
<input id="JobAddressCheckBox" onclick="ShowJobAddress();" name="JobAddressCheckBox" type="checkbox">
<label for="JobAddressCheckBox">Job address</label>
</span>
</span>
<span id="PredefinedReplyCheckBoxWrapper">
<span style="margin-right: 2em;" class="DefaultTextCell">
<input id="PredefinedReplyCheckBox" onclick="ShowReplies();" name="PredefinedReplyCheckBox" type="checkbox">
<label for="PredefinedReplyCheckBox">Predefined reply</label>
</span>
</span>
以下 Javascript 语句应导致包装器变量包含对象,但在某些浏览器或 IE9 的兼容模式中,jobAddressWrapper 的值为 null。预定义ReplyWrapper 的值永远不会为空。它们之间的唯一区别是 JobAddressCheckboxWrapper 具有style="display:none;"
.
var jobAddressWrapper = $get('JobAddressCheckboxWrapper');
var predefinedReplyWrapper = $get('PredefinedReplyCheckBoxWrapper');
或者
var jobAddressWrapper = document.getElementById('JobAddressCheckboxWrapper');
var jobAddressWrapper = document.getElementById('PredefinedReplyCheckBoxWrapper');
元素被 span 包裹的 HTML 模式是不相关的;在其他情况下,元素没有被 span 包裹,但如果有style="display:none;"
.
更新(回应评论等):
- $get 提供了 Sys.UI.DomElement 类的 getElementById 方法的快捷方式。更多信息在这里
- 这些调用是在从 onload 调用和响应用户交互的函数中进行的。在任何一种情况下都会出现问题。