【发布时间】:2013-10-25 03:39:09
【问题描述】:
我有一段 Javascript 代码可以定位 DOM 中的单个表,然后尝试操作它的第一个子表 thead(实际上,它迭代了该子表的子表 tr 条目,但事实并非如此对问题很重要)。执行此操作的代码是:
var tableNode = document.getElementById("table").firstChild;
这在 Firefox ESR (10/17/24) 和 IE9 中运行良好,但在 IE10 中失败,原因似乎是因为 IE10 插入了奇怪的 DOM 条目,这是我使用 firstChild 挑选的条目之一而不是所需的thead。我基于下面的 DOM 转储以及 tableNode.data 设置为字符串类型这一事实。
IE10 兼容模式下的 DOM(它也可以工作)如下所示:
您可以看到 DOM 确实看起来很合理。但是,在普通 IE10 模式下检查 DOM 会显示:
对于它的价值,Chrome 给了我:
FF17esr 给了我:
它们似乎都没有空文本元素。
现在,我可以在兼容模式下运行该网站,但必须告诉我们所有的客户,这很烦人。我也可以显然添加可怕的:
<meta http-equiv="X-UA-Compatible" content="IE=9">
我的输出,但我不完全确定可能有什么其他影响。
我想先了解为什么 IE10 会添加这些节点,而 IE9/FF/IE10compat 不会。我发现有一些讨论表明 HTML 中的空格可能是导致它的原因,但在我看来,这不应该导致创建随机节点,无论如何,我认为我没有 任何多余的空白。虽然我应该提到上面提到的tableNode.data的值作为字符串类型实际上是\n,这意味着行尾的换行符可能正在创建这个DOM条目。
但是,老实说,这似乎很可笑。据我所知,HTML 应该忽略标签之外的空格,或者至少将其折叠成一个元素。我很难相信这样的事情:
<tag>line 1</tag>
<tag>line 2</tag>
将导致 三个 DOM 条目,tag、empty node 和 tag,只是因为它们之间有一个换行符。
关于如何最好地解决这个问题的任何想法?我是否必须修改我的 Javascript 代码才能跳过这些 DOM 条目?
【问题讨论】:
-
我的回答中描述了解决此问题的方法。像 jQuery 和 YUI 这样的库以类似的方式解决它。除 IE9 及以下的所有浏览器都执行此操作。不要看 DOM 检查器,用 javascript 代码测试它。有关可以在各种浏览器上运行的测试 HTML 文件,请参阅我的答案。
标签: javascript dom internet-explorer-10