`

HTML DOM节点在各浏览器中的识别差异

阅读更多
  在IE浏览器及其它浏览器下对于HTML DOM的识别并非任何情况下都是一致的,主要是IE和非IE两个阵营的表现异同。

  如有以下这样一段代码:

<div id="test">
  <p>文字</p>
  <p>文字</p>
  <p>文字</p>
</div>


  单从HTML结构表象来看,ID test 一共有3个P元素子节点。其实,在IE下,这种表象就是实质,而在非IE下,表象的外衣将顷刻被撕开。

  为了看出这种区别,我们可以遍历test的子节点,并将其节点个数及节点类型都打印出来:

<script type="text/javascript">
var x = document.getElementById("test");
var xc = x.childNodes;
var xcl = xc.length;
for(var i=0;i<xcl;i++){
  document.write("nodeName = " + xc[i].nodeName + "; nodeType = " + xc[i].nodeType + "<br />");
</script>


  IE的打印结果为:

nodeName = P; nodeType = 1
nodeName = P; nodeType = 1
nodeName = P; nodeType = 1

  非IE的打印结果为:

nodeName = #text; nodeType = 3
nodeName = P; nodeType = 1
nodeName = #text; nodeType = 3
nodeName = P; nodeType = 1
nodeName = #text; nodeType = 3
nodeName = P; nodeType = 1
nodeName = #text; nodeType = 3


  显而易见,IE的打印结果和我们所说的表象一样:有3个子节点,并且都为P元素;而非IE则表现出极大的差异:居然打印出了7个子节点,当然也包括3个P元素子节点在内,除此之外还多了4个nodeType=3的子节点,我们都知道节点类型为3的节点属于文本节点,但从那段HTML中可以看P与P之间并无其它的内容出现,那这4个文本节点是怎样凭空出现的呢?

  在这种情况下,唯一有可能的原因就是在HTML的书写上,因为这段HTML并不是连续的书写,而是每个节点间都用回车换行了,并且正好出现了4次换行,也许非IE把换行也当成了一个节点。

  为了测试,我们可以将那段HTML改写为:

<div id="test"><p>文字</p><p>文字</p><p>文字</p></div>


  IE的打印结果为:

nodeName = P; nodeType = 1
nodeName = P; nodeType = 1
nodeName = P; nodeType = 1


  非IE的打印结果为:

nodeName = P; nodeType = 1
nodeName = P; nodeType = 1
nodeName = P; nodeType = 1


  预想中的情况出现了,这回不论什么浏览器打印出来的都只是3个P子节点。

  原因是找到了,但正是这个原因才让人郁闷。因为这个差异,那要写一段可读性强的HTML也不那么简单了。想想看,不换行的代码那将是多么恐怖的东西啊- -!
分享到:
评论

相关推荐

    html-parser-and-analyzer:HTML 解析器,用于识别呈现页面中可用的节点并列出属性和内容。 用于 UI 自动化以识别节点并分析差异(如果有)

    2. **节点识别**:在DOM树中,每个HTML标签都对应一个节点。解析器会遍历DOM树,识别出如div、span、a等元素节点,以及文本节点、注释节点等其他类型的节点。 3. **属性解析**:每个节点都有零个或多个属性,比如id...

    DOM Scripting Web Design with JavaScript and the Document Object Model

    8. 跨浏览器兼容性:解决不同浏览器对DOM和JavaScript API支持上的差异,可能涉及polyfills、feature detection等技巧。 9. JavaScript面向对象编程:介绍如何在JavaScript中实现面向对象的编程模式,包含继承、...

    Algorithm-nanomorph.zip

    DOM节点的修改通常涉及到大量的计算和浏览器渲染,这对性能有直接影响。传统的DOM更新策略可能会导致整颗树的重新渲染,而nanomorph算法则试图最小化这种影响。它通过对DOM结构进行深度比较,精确地识别出需要变动的...

    局部刷新的两种实现方式大家看看啊

    - 识别影响区域:确定哪些DOM节点需要更新,这可能涉及到遍历数据结构和比较新旧值。 - 更新DOM:利用JavaScript的DOM API,如`innerHTML`、`appendChild`、`removeChild`等,对相关DOM节点进行修改。 - 渲染:...

    javascript读取文本节点方法小结

    - 节点类型识别:不同浏览器在解析节点时可能产生差异,例如某些浏览器会将空白节点也作为一个文本节点,所以在遍历节点时需要特别注意。 - 跨浏览器兼容性:不同浏览器对DOM方法的支持程度可能不同,开发者在使用时...

    让GridView中CheckBox列支持FireFox

    2. **创建自定义函数以获取CheckBox对象**:编写`GetCheckBoxObj`函数,用于在任意DOM节点中查找CheckBox。这一步对于确保跨浏览器兼容性至关重要。 3. **更新CheckBox状态**:在遍历每一行时,使用`GetCheckBoxObj`...

    虚拟dom && diff算法

    - 虚拟DOM是一个对象表示形式,它保存了DOM节点的结构和属性,但并不直接对应浏览器中的真实DOM节点。这种对象模型可以在内存中快速创建和修改,避免了频繁地与实际DOM交互。 - 它的主要作用在于提供了一个抽象层...

    JavaScript王者归来part.1 总数2

     12.5 访问和操纵DOM节点   12.5.1 打开每一个盒子--遍历节点   12.5.2 弄清层级关系--父子与兄弟   12.5.3 如何搜索特定节点   12.5.4 克隆节点--一个使用cloneNode()复制表格的例子   12.5.5 移动节点...

    JS获取节点的兄弟,父级,子级元素的方法

    在理解了如何使用原生JavaScript和jQuery来获取和操作DOM节点后,接下来我们将讨论这些方法的实际应用。例如,当我们需要动态修改页面上的元素内容时,获取这些元素的节点是第一步。了解如何精确获取元素的兄弟节点...

    jQuery轻量级树状菜单插件代码.zip

    此外,开发者还需要关注CSS样式在不同浏览器间的差异,确保菜单在所有支持的浏览器中都能呈现出一致的视觉效果。 在实际应用中,这款插件可以通过简单的配置参数进行定制。例如,你可以设置菜单默认的展开级别、...

    innerxhtml-vc:以适合于使用基于行的diff进行版本控制的格式,从HTML DOM渲染XHTML字符串

    在HTML和XHTML中,元素、属性和文本节点以嵌套的方式组织,而基于行的差异算法无法很好地处理这种结构。InnerXHTML-vc库通过将DOM树序列化为一种特殊的XHTML字符串,这个字符串的每一行都尽可能地代表了一个独立的可...

    剖析 Vue.js 内部运行机制.pdf

    - **Optimize(优化):** 在这一阶段,Vue 会对 AST 进行优化处理,例如识别静态节点并对其进行标记。在后续更新过程中,这些静态节点将被忽略,以提高渲染效率。 - **Generate(生成):** 最终,将 AST 转换...

    vdom:ITSA的虚拟DOM

    - `VNode`:代表虚拟DOM节点,包含了元素类型、属性、子节点等信息。 - `Diff算法`:ITSA可能会有优化后的算法来高效地找出两个VNode树的差异。 - `Patcher`:负责将计算出的补丁应用到真实DOM上,更新页面视图。...

    wedge:一个客户端 JavaScript 库,专注于通过实现 W3 规范来修复浏览器兼容性

    在开发过程中,开发者经常会遇到各种浏览器差异,比如CSS样式、DOM操作、事件处理等方面的不一致性,而Wedge库就是为了应对这些问题而诞生的。 ### Wedge的主要功能 1. **CSS和HTML兼容性增强**: - **CSS前缀...

    移动端可触摸的轮播图(纯js插件)

    3. **DOM操作**:JavaScript插件需要能够动态地修改HTML元素,包括创建、删除和更新DOM节点。在轮播图中,这涉及到图片元素的添加、隐藏和显示。 4. **定时器与自动播放**:许多轮播图插件支持自动播放功能,该插件...

    JS实现自定义模板树解析

    JavaScript是一种广泛应用于网页和网络应用开发的脚本语言,它在浏览器端运行,为用户提供动态交互体验。在本文中,我们将深入探讨如何使用JavaScript来实现自定义模板树解析,这是一项核心技能,对于构建复杂的前端...

    文本下拉框自动匹配

    6. **兼容性与浏览器差异**:考虑到不同浏览器的行为差异和兼容性问题,开发者需要对跨浏览器的实现进行测试和适配,确保在主流浏览器上都能正常工作。 7. **安全性考虑**:处理用户输入时,还需要防止XSS攻击,...

Global site tag (gtag.js) - Google Analytics