0

0

DOM属性方法及兼容性问题详解

巴扎黑

巴扎黑

发布时间:2017-08-09 14:05:41

|

1547人浏览过

|

来源于php中文网

原创

dom中element类型:(以下所有的属性仅仅是只读属性)

一、node.nodeType    以数字值返回指定节点的节点类型。

存在 12 种不同的节点类型,其中可能会有不同节点类型的子节点(前三个为重要):
这里写图片描述

if(ul.nodeType == Node.ELEMENT_NODE){
    alert(‘Node is an element’);  
 }  
上述代码,在标准浏览器下可以正常的运行,在非标准的浏览器(ie8之下)下不能正常的运行。
解决办法:
if(ul.nodeType ==1){   alert(‘Node is an element’);  } 使用nodeType属性与数字比较。

二、nodeName值为元素类型的标签名比如ul、 p等。
nodeValue值为null。
parentNode可能是document或者Element,子节点可能。Element,Text,Comment,ProcessingInstruction, CDATASection, EntityReference。

操作特性

一、HTML元素属性的方式获得特性

所有HTML元素通过HTMLElement类型或者它的子类型(HTMLDivElement 、HTMLImageElement)表示,HTMLElement类型是继承自Element类型,只不过多加了一些特有的属性,切子类型也有自己特有的属性和方法,比如img有src,title等特有属性。特别注意的是由于class是js中的关键字,要使用className获得class 的值。

对于获取和设置方式以及注意地地方在二三中通过对比的方式表述。

二、element.getAttribute(attributename)返回指定属性名的属性值。

这个方法传入一个属性名的字符串,不区分大小写。
比如ul.getAttribute(‘class’);由于参数为字符串,所以可以使用class不必使用className。通过这个方法可以获得自定义属性,在一些含有非关键字中使用的字符的属性名,用这个方法获得属性的值特别方便,比如在HTML5规范中,自定义属性前应该加上data-前缀以方便验证,其中包含了非法字符‘-’,可以使用ul.getAttribute(‘data-index’);获得。

特别的,当attributename为style时这个方法在IE7之前的版本返回的是一个对象,其他版本的浏览器返回的是CSS文本。当attributename为onclick这样的事件处理程序时这个方法在IE7之前的版本返回的是一个方法或者null,其他版本的浏览器返回的是函数代码字符串。

通过HTML元素属性的方式获得特性与getAttribute()差别比较大。
1、自定义属性访问上的差别:
解析html代码的时候,标准的浏览器不会将元素的自定义属性加入到DOM对象中,在js中通过属性的方式访问自定义属性是不存在的结果为undefined,非标准的浏览器会将这个自定义属性加入到DOM对象中,在js中会访问到结果。

                                    
  • 11111111
  • 22222222
  • 33333333
  • 44444444
123456789101112131415161718192021

2.当属性为style时,返回一个对象,当属性为处理事件时,返回被复制的函数。

综上所述,在操纵DOM对象属性的时候,一般情况下使用HTML元素属性的方式获得特性,只有在获得自定义属性的值和一些含有非法字符的属性名的值的时候使getAttribute方法。

.

三、element.setAttribute(attributename,attributevalue)添加指定的属性,并为其赋指定的值。

与HTML元素属性的方式设置特性的方式相比,这个方法可以添加一些没有的自定义属性并赋值,但通过HTML元素属性的方式设置特性不会被设置。同时这个方法在IE7之前的版本也存在异常,所以除了设置自定义属性外,其他方式通过HTML元素属性的方式设置特性。

四、RemoveAttribute()移除特性,但是不经常使用,IE6之前的版本不支持这个方法。

操作内容

一、childNodes:表示某个元素子节点的集合,返回NodeList 对象。

在标准浏览器下:返回的子节点中包含文本类型、元素类型、注释类型等,特别的包含文本类型中空文本即所谓的换行。
在非标准的浏览器下:返回的子节点中不包含文本类型中空文本,同时与节点位置、解析方式等也有关。

  • 22222
  • 111111
在标准浏览器下:得到的结果为5(li元素前的换行空文本,li元素,注释到之间这一段文本,注释,注释到的空白) 在非标准的浏览器下得到的结果为1 但是将
  • 22222
  • 111111互换位置之后得到的结果为2.1234567891011
    所以当运行下面代码的时候为出问题:                            
    • 11111111
    • 22222222
    • 33333333
    • 44444444
    原因很简单,就是因为在标准浏览器下childNodes返回的子节点中包含非元素类型的节点。12345678910111213141516171819202122232425

    解决上述问题的方式:
    通过nodeType属性判断子节点是否为元素类型:

    IE6-IE11兼容性问题列表及解决办法总结
    IE6-IE11兼容性问题列表及解决办法总结

    IE6-IE11兼容性问题列表及解决办法总结

    下载
    for(var i = 0; i

    在非法嵌套的html文档中由于解析方式不同,在标准和非标准浏览器下呈现的结果不同,这完全于浏览器内核的解析方式有关。比如:

                                    
    • 11111111
    • 22222222
    • 33333333
    • 44444444
    • 5555555

    1234567891011121314151617181920212223

    对于一些分标准的浏览器比如ie7 解析的时候他会把这种那个不符合语义的p元素放到最后一个li中,但对于其他的浏览器并不会这样。换句话说,在标准浏览器下p是ul的子节点,但是在非标准的浏览器下p是最后一个li的子节点,这完全和浏览器内核的系欸小方式有关。

    由此可以看出,对于在书写html文档的时候,结构化语义是多么的重要,至少能为添加js方便不少。

    二、element.childern仅仅返回元素类型的子节点集合,返回NodeList 对象。

    Children比childNodes要好得多,因为他仅仅获取那些为元素类型的子节点。但是还是不能免于非法嵌套带来的问题,这本身至于浏览器的近稀饭时有关,与用那种属性没有关系。

    三、element.firstChild(firstElementChild):获取第一个子点
     element.lastChild(lastElementChild):获取最后一个子节点
     element.nextSibling(nextElementSibling):获取相邻的下一个兄弟子节点
     element.previousSibling(previousElementSibling):获取相邻的上一个兄弟节点

    以firstChild为例说明一下性质,其他的大同小异。
    在标准情况下:返回的结果可能是文本类型(空文本)。
    在非标准的情况下:如果有元素子节点,那么一定返回第一个元素类型的子节点。

            
    • 11111111
    • 22222222
    • 33333333
    • 44444444
    123456789101112131415161718192021

    解决这种情况
    1是firstElementChild。
    firstElementChild仅仅是在标准浏览器下有效,在非标准的浏览器下是没有定义的。在标准浏览器下仅仅返回第一个元素类型的子节点,如果没有返回null。
    再js中加入:

    function firstChild(obj){                if(obj.firstElementChild === undefined){//检测是否为标准浏览器                    return obj.firstChild;//不是标准浏览器,用firstChild返回第一个元素子节点,可能为null
                    }else{                    return obj.firstElementChild;//是标准浏览器,用firstElementChild返回第一个元素子节点,可能为null
                    }
                }            var oFirst = firstChild(oul);            if(oFirst){//判断有没有第一个元素子节点排除空节点的情况
                    oFirst.style.backgroundColor = 'orange';
                }else{
                    alert('没有第一个元素');
                }123456789101112131415

    2直接用children:推荐

    if(oul.children[0]){
                    oul.children[0].style.backgroundColor = 'orange';
                }else{
                    alert('没有第一个元素');
                }123456

    四、element.parentNode: 当前节点的父级节点,无兼容性问题。

    Eg:点击隐藏将这个列表隐藏无标题文档    123456789101112131415161718192021222324252627

    五、element.offsetParent : 只读 属性 离当前元素最近的一个有定位属性的父节点

    非ie7以下的浏览器:  
    如果没有定位父级    offsetParent 为body
    如果有定位父级    offsetParent 为定位父级
    Ie7以下的浏览器:
    如果没有定位父级    自身没有定位 offsetParent 为body,自身有定位的话 为html
                       如果当前元素的某个父级触发了layout,那么offsetParent就会被指向到这个触发了layout特性的父节点上。

    如果有定位父级    offsetParent 为定位父级

    无标题文档    
    1234567891011121314151617181920212223242526272829

    Div2 zoom:1;属性触发layout,并且div3没有定位,所以在ie7一下的版本父元素div2,同时,div2相对定位,在其他浏览器中父元素为div2。解决了兼容性问题。

    六、element.offsetLeft[Top] : 只读 属性
     当前元素到定位父级的距离(偏移值)(或者说,到当前元素的offsetParent的距离)

    非ie7以下的浏览器:
    如果没有定位父级    offsetLeft [top]是到html的距离。
    如果有定位父级      是到定位父级的距离。
    ie7以下:
    如果自己没有定位,无论是否有没有父级定位offsetLeft[Top]是到body的距离
    如果自己有定位,那么就是到定位父级的距离(没有父级定位情况下是到html的距离)。

    无标题文档    
    123456789101112131415161718192021222324252627
    例子:获得任意一个元素的相对
    于页面的位置                                    
    12345678910111213141516171819202122232425262728293031323334353637383940414243444546

    七、长高:
    element.style.width :  样式宽    =   width
    element.clientWidth : 可视区宽  =   width + padding
    element.offsetWidth:  占位宽   =   width + padding + border

    八、
    node.appendChild(node)
    node.insertBefore(newnode,existingnode)
    node.removeChild(node)
    node.replaceChild(newnode,oldnode) node为oldnode的父节点
    这几个函数既能操作已有的节点,也能操作动态创建的节点(createElement())
    node.insertBefore(newnode,existingnode)当existingnode当null时在ie下会报错解决的方式就是:用if判断如果为null执行什么操作,否则执行什么操作。

    简单的留言板:                
    123456789101112131415161718192021222324252627282930313233343536373839404142434445464748

    热门AI工具

    更多
    DeepSeek
    DeepSeek

    幻方量化公司旗下的开源大模型平台

    豆包大模型
    豆包大模型

    字节跳动自主研发的一系列大型语言模型

    通义千问
    通义千问

    阿里巴巴推出的全能AI助手

    腾讯元宝
    腾讯元宝

    腾讯混元平台推出的AI助手

    文心一言
    文心一言

    文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

    讯飞写作
    讯飞写作

    基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

    即梦AI
    即梦AI

    一站式AI创作平台,免费AI图片和视频生成。

    ChatGPT
    ChatGPT

    最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

    相关专题

    更多
    Golang处理数据库错误教程合集
    Golang处理数据库错误教程合集

    本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

    2

    2026.02.06

    java多线程方法汇总
    java多线程方法汇总

    本专题整合了java多线程面试题、实现函数、执行并发相关内容,阅读专题下面的文章了解更多详细内容。

    0

    2026.02.06

    1688阿里巴巴货源平台入口与批发采购指南
    1688阿里巴巴货源平台入口与批发采购指南

    本专题整理了1688阿里巴巴批发进货平台的最新入口地址与在线采购指南,帮助用户快速找到官方网站入口,了解如何进行批发采购、货源选择以及厂家直销等功能,提升采购效率与平台使用体验。

    90

    2026.02.06

    快手网页版入口与电脑端使用指南 快手官方短视频观看入口
    快手网页版入口与电脑端使用指南 快手官方短视频观看入口

    本专题汇总了快手网页版的最新入口地址和电脑版使用方法,详细提供快手官网直接访问链接、网页端操作教程,以及如何无需下载安装直接观看短视频的方式,帮助用户轻松浏览和观看快手短视频内容。

    15

    2026.02.06

    C# 多线程与异步编程
    C# 多线程与异步编程

    本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

    10

    2026.02.06

    Python 微服务架构与 FastAPI 框架
    Python 微服务架构与 FastAPI 框架

    本专题系统讲解 Python 微服务架构设计与 FastAPI 框架应用,涵盖 FastAPI 的快速开发、路由与依赖注入、数据模型验证、API 文档自动生成、OAuth2 与 JWT 身份验证、异步支持、部署与扩展等。通过实际案例,帮助学习者掌握 使用 FastAPI 构建高效、可扩展的微服务应用,提高服务响应速度与系统可维护性。

    6

    2026.02.06

    JavaScript 异步编程与事件驱动架构
    JavaScript 异步编程与事件驱动架构

    本专题深入讲解 JavaScript 异步编程与事件驱动架构,涵盖 Promise、async/await、事件循环机制、回调函数、任务队列与微任务队列、以及如何设计高效的异步应用架构。通过多个实际示例,帮助开发者掌握 如何处理复杂异步操作,并利用事件驱动设计模式构建高效、响应式应用。

    7

    2026.02.06

    java连接字符串方法汇总
    java连接字符串方法汇总

    本专题整合了java连接字符串教程合集,阅读专题下面的文章了解更多详细操作。

    25

    2026.02.05

    java中fail含义
    java中fail含义

    本专题整合了java中fail的含义、作用相关内容,阅读专题下面的文章了解更多详细内容。

    28

    2026.02.05

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    如何进行WebSocket调试
    如何进行WebSocket调试

    共1课时 | 0.1万人学习

    HTML 中文开发手册
    HTML 中文开发手册

    共0课时 | 0人学习

    传智播客AJAX视频教程
    传智播客AJAX视频教程

    共31课时 | 6.1万人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号