我有一些可以在IE7和8中运行的代码,但在9中却没有

var table = document.getElementById('RadGrid_ctl01').childNodes[2];


在IE9中不起作用,现在我确实读到IE9会计算空格,因此索引将与IE7和IE8中的不一样,所以当我将索引从2更改为4时,我调试并找到了相同的值,如下所示:

var table = document.getElementById('RadGrid_ctl01').childNodes[4];


但是,当我稍后尝试使用此代码访问表对象时

var editor = table.childNodes[i].childNodes[j].childeNodes[0]


变量编辑器将在IE7和IE8中获得期望的值,但是在IE9中,由于childNodes [j]没有任何子代,它变为空。我不知道是什么原因造成的。
i和j都从0开始。

有人知道我在做什么错吗?

最佳答案

IE9的行为是正确的,较低的版本是错误的。
问题是由两个html标记之间的空白引起的,该空白应导致进入文本节点。

更新:添加了示例

<ul><li>Foo</li><li>Bar</li></ul>

<ul>
    <li>Foo</li>
    <li>Bar</li>
</ul>


看起来几乎一样,不是吗?但是,生成的DOM不同。
第一个示例将导致:

- ul
-- li
--- (text)Foo
-- li
---(text)Bar


第二个标记导致了这一点:

- ul
-- (text)
-- li
--- (text)Foo
-- (text)
-- li
--- (text)Bar
-- (text)


而且由于文本节点不能有任何子节点,所以这会导致Javascript静默失败。

可能的解决方案

一种解决方案是去除空的文本节点。我曾经为此问题写过gist

更新:

Node.normalize()似乎是一个更可靠的解决方案,但我没有检查它是否具有浏览器兼容性。

关于javascript - childNodes []无法像IE7和8一样在IE9中工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14900805/

10-12 12:38
查看更多