【问题标题】:IE9 doesn't accept this codeIE9 不接受此代码
【发布时间】:2012-07-10 03:46:40
【问题描述】:

我找到了这段代码,它是我问题的完美解决方案,但我发现它在 ie9 中不起作用。有谁知道如何重新编写此代码以在 IE9 中工作?这是它的javascript代码。

function showonlyonev2(thechosenone) {
    var newboxes = document.getElementsByTagName("div");
    for (var x = 0; x < newboxes.length; x++) {
        name = newboxes[x].getAttribute("class");
        if (name == 'newboxes-2') {
            if (newboxes[x].id == thechosenone) {
                if (newboxes[x].style.display == 'block') {
                    newboxes[x].style.display = 'none';
                }
                else {
                    newboxes[x].style.display = 'block';
                }
            } else {
                newboxes[x].style.display = 'none';
            }
        }
    }
}

我在 jsFiddle 中运行它并得到这个错误: 第 4 行字符 9 的问题:只读。

name = newboxes[x].getAttribute("class");

这里还有 HTML 部分(短版去掉了 head 和 body 标签):

<table>
   <tr>
      <td>
         <div style="border: 1px solid blue; background-color: #99CCFF; padding: 5px; width: 150px;">
            <a id="myHeader1" href="javascript:showonlyone('newboxes1');" >show this one only</a>
         </div>
         <div class="newboxes" id="newboxes1" style="border: 1px solid black; background-color: #CCCCCC; display: block;padding: 5px; width: 150px;">Div #1</div>
      </td>
      <td>
         <div style="border: 1px solid blue; background-color: #99CCFF; padding: 5px; width: 150px;">
            <a id="myHeader2" href="javascript:showonlyone('newboxes2');" >show this one only</a>
         </div>
         <div class="newboxes" id="newboxes2" style="border: 1px solid black; background-color: #CCCCCC; display: none;padding: 5px; width: 150px;">Div #2</div>
      </td>
      <td>
         <div style="border: 1px solid blue; background-color: #99CCFF; padding: 5px; width: 150px;">
            <a id="myHeader3" href="javascript:showonlyone('newboxes3');" >show this one only</a>
         </div>
         <div class="newboxes" id="newboxes3" style="border: 1px solid black; background-color: #CCCCCC; display: none;padding: 5px; width: 150px;">Div #3</div>
      </td>
   </tr>
</table>

这是我的 jsFiddle 视图 http://jsfiddle.net/Nuker_Viper/JvLDx/13/

【问题讨论】:

  • 首先,不要只发布一段代码。告诉我们您期望它做什么以及您实际看到的内容。其次,那是javascript,而不是java。我正在为你修复标签。

标签: javascript function cross-browser internet-explorer-9


【解决方案1】:

您的编辑使问题更清晰:

我在 jsFiddle 中运行它并收到此错误:第 4 行字符 9 处的问题:只读。

name = newboxes[x].getAttribute("class");

您尚未在任何地方声明 name,因此您在某些包含范围(可能是全局范围,例如 window.name)中使用了 name。显然 IE9 认为这是一个只读属性,尽管我找不到任何支持它的文档。

在任何情况下,您都不想与别人的变量混在一起。将var name; 放在函数的顶部,以便您使用自己的 变量。 :-)


当我们不得不猜测出了什么问题时的原始答案:

IE 有一个长期存在的错误,它认为class 属性称为className,即使在getAttribute 中也是如此。 IE9 在命名错误的“兼容性”模式中继续存在此错误。在标准模式下,它是正确的。

最好的办法是完全避免这个问题,因为class 属性不需要使用getAttribute;改用反射属性:

name = newboxes[x].className;

【讨论】:

  • “反射属性”是这类事情的正确术语吗?我还以为是expando类型的……呃……东西。
  • @asawyer:这是通常的术语。真的,只有“财产”就足够了,而且可能更好。 classNamehtmlForidtypevalue等,不是expandos。 Expandos 是您添加到元素的任意属性,而元素 always 具有由规范定义的这些属性(它们的值可能是空字符串,但它们具有它们)。 (其中一些属性有相当复杂的定义——例如value——其他基本上只是访问属性的另一种方式。)
猜你喜欢
  • 2012-12-30
  • 2017-01-10
  • 2016-06-05
  • 1970-01-01
  • 2011-07-04
  • 2016-11-24
  • 1970-01-01
  • 1970-01-01
  • 2019-12-08
相关资源
最近更新 更多