JavaScript DOM 基础
javascript dom 基础
dom 即文档对象模型,是操作 html/xml 文档的一套方法。通过 dom 操作节点,使页面发生改变,是动态文档技术的核心内容
dom 的含义
-
dom 即 document object model,文档对象模型
-
javascript 中有三类对象
本地对象 native object
object function string number boolean error evalerror syntaxerror typeerror rageerror referenceerror urierror date regexp
内置对象 built-in object
global: 一类对象的统称,是虚拟的,代表全局 任何方法和属性都在对象之下 如 isnan()、parseint、number()、decodeurl() 等都是 global 下的方法 如 math、infinity、nan、undefined 等都是 global 下的属性 本地对象、内置对象是 ecmascript 的内部对象
宿主对象 host object
执行 js 的环境提供的对象,即浏览器对象 window 对象 -> bom,不同浏览器间没有固定规范 document 对象 -> dom,遵从 w3c 规范 document 是 window 下的对象,即 bom 包含 dom
-
dom 是通过浏览器提供的一套方法来操作 html 和 xml 文档
元素和节点
-
节点包含元素,元素是节点的一部分,即元素节点
-
节点分类
元素节点、属性节点、文本节点、注释节点、文档节点等
-
元素即元素对象,有 htmldivelement、htmlinputelement、htmlhtmlelement,继承自构造方法 htmlelement,htmlelement 继承自 node,node 即节点对象
-
document 继承自构造方法 htmldocument 的原型,htmldocument 继承自 document 的原型
document.__proto__ -> htmldocument.prototype htmldocument.prototype.__proto__ -> document.prototype
获取元素
-
通过 id 获取元素
document.getelementbyid(); // 返回对应的 htmlelement // 对于 getelementbyid(),ie8 及以下不区分大小写并且可以匹配 name
-
通过类名获取元素集合
document.getelementsbyclassname(); // 返回元素集合 htmlcollection // 兼容 ie8 及以上
-
通过标签名获取元素集合
document.getelementsbytagname(); // 返回元素集合 htmlcollection // 兼容 ie8 及以上
-
通过 name 获取元素
document.getelementsbyname(); // 返回元素集合 htmlcollection // 常用于表单元素
-
通过选择器获取对象
// 兼容 ie6 及以上,是 html5 新加入的 web api,但早就存在了 document.queryselector(); // 返回选择器选中的第一个节点对象 node document.queryselectorall(); // 返回选择器选中的节点列表 nodelist // queryselector、queryselectorall 性能低 // 使用 queryselectorall 返回节点列表,删除节点后,节点列表不变,不具有实时性
遍历节点树
-
parentnode
获取父节点
document.getelementsbytagname("html")[0].parentnode -> document // html 标签元素的 parentnode 是 document // *节点是 document,document 的父节点是 null
-
childnodes
获取子节点集合
document.getelementbyid("box").childnodes // 包括元素节点、文本节点、注释节点在内
-
firstchild、lastchild
获取第一个或最后一个子节点
document.getelementbyid("box").firstchild // 第一个子节点 document.getelementbyid("box").lastchild // 第二个子节点
-
nextsibling、previoussibling
获取上一个或下一个兄弟节点
document.getelementbyid("box").nextsibling // 上一个兄弟节点 document.getelementbyid("box").previoussibling // 下一个兄弟节点
-
getattributenode()
获取属性节点
document.getelementbyid("box").getattributenode("id") // 获取属性节点 id
遍历元素节点
-
parentelement
获取父元素节点,兼容 ie9 及以上
document.getelementsbytagname("html")[0].parentelement -> null // html 标签元素的 parentelement 是 null
-
children
获取子元素集合,兼容 ie8 及以上
document.getelementbyid("box").children // 只包含元素节点 document.getelementbyid("box").chilelementcount // children.length
-
firstelementchild、lastelementchild
获取第或最后一个子元素节点,兼容 ie9 及以上
document.getelementbyid("box").firstelementchild // 第一个子元素节点 document.getelementbyid("box").lastelementchild // 第二个子元素节点
-
nextelementsibling、previouselementsibling
获取下一个或上一个兄弟元素节点,兼容 ie9 及以上
document.getelementbyid("box").nextelementsibling // 上一个兄弟元素节点 document.getelementbyid("box").previouselementsibling // 下一个兄弟元素节点
节点的属性
-
nodename
返回节点名称、只读
元素节点,元素名称大写document.getelementbyid("box").nodename // div // 文本节点 -> #text // 注释节点 -> #comment document.nodename // #document // 文档节点 -> #document
-
nodevalue
返回节点内容,可读写
属性节点、文本节点、注释节点可用document.getelementbyid("box").getattributenode('id').nodevalue // box document.getelementbyid("box").getattributenode('id').value // 效果相同
-
nodetype
返回节点类型对应数字,只读
元素节点 1 属性节点 2 文本节点 3 注释节点 8 document 9 documentfragment 11
通过 nodetype 封装 childnodes,筛选出元素节点
function childelementarray(node) { var arr = [], nodes = node.childnodes; for (var i = 0; i < nodes.length; i++) { var item = nodes[i]; if (item.nodetype === 1) { arr.push(item); } } return arr; }
-
attibutes
返回元素节点的属性节点组成的类数组
document.getelementbyid("box").attributes[0].nodevalue // 获取第一个属性节点的 nodevalue
-
haschildnodes
返回是否有子节点的布尔值
dom 结构树
-
dom 结构树显示了构造方法的继承关系与原型链的走向
-
document 的原型被 htmldocument 继承,同样被 xmldocument 继承
-
characterdata 的原型是文本节点和注释节点的祖先
-
htmlelement 下有与标签对应的多种 html...element,用于构造元素节点
-
需要注意的方法
getelementbyid、getelementsbyname 只在 document 的原型上,只有 document 可以使用
queryselector、queryselectorall、getelementsbyclassname、getelementsbytagname 在 document 和 element 的原型上都有,即 document 和元素节点对象都可以使用
var box = document.getelementbyid("box"); box.getelementbyid("list"); // 报错
-
需要注意的属性
document.bady 、document.head、document.title 继承自 htmldocoment 的原型
document.documentelement 继承自 document 的原型
document.bady; // body 标签元素 document.head; // head 标签元素 document.title; // title 元素内文字节点 document.documentelement; // html 标签元素
节点相关操作
-
document.createelement()
创建元素节点
var div = document.createelement("div"); // 传入标签名
-
document.createtextnode()
创建文本节点
-
document.createcomment()
创建注释节点
-
document.createdocumentfragment()
创建一个文档碎片,向其中添加节点,再将文档碎片插入文档中,可以提高性能
-
appendchild()
在节点内部的最后添加子节点,并且具有剪切节点功能
var div = document.createelement("div"), text = document.creaettextnode("文本"); div.appendchild(text); document.body.appendchild(div);
-
insertbefore(a, b)
在节点内部 a 节点之前插入 b 节点
元素节点没有 insertafter 方法,可以进行封装
element.prototype.insertafter = function (target, origin) { var after = origin.nextelementsibling; if (after) { this.insertbefore(target, after); } else this.appendchild(target); } // 兼容 ie9 及以上
-
removechild()
从文档中删除子节点,但内存中依然保留空间占用
-
remove()
节点调用,删除自身,可以释放内存
-
replacechild(a, b)
用 a 节点替换子节点 b
-
innerhtml
可以取值,可以赋值,并且赋值可以解析 html 代码
-
innertext
可以取值,可以赋值,并且将赋值解析成文本节点,标签符号会被转码成字符实体
firefox 老版本不支持,可使用功能相同的 textcontent
-
setattribute(),getattribute()
设置、获取属性
var div = document.createelement("div"); div.setattribute('id', 'box'); div.getattribute('id'); // 返回 box
-
dataset
html5 中以命名
data-
开头的属性,可以通过 dataset 方法访问// <p data-name="jett" data-age="22"></p> document.getelementsbytagname("p")[0].dateset // {name: 'jett', age: '22'} // 兼容 ie9 及以上
上一篇: 实现接口幂等性的几种方案
下一篇: CSS设置DIV背景色渐变显示【转】
推荐阅读
-
js类的静态属性和实例属性的理解_javascript技巧
-
javascript - 在分享到Q空间的同时,如何实现同时执行另外一个操作?
-
计算机等级考试二级ACCESS数据库基础知识
-
javascript - 浏览器在访问链接时不要带上referer???
-
python基础教程之获取本机ip数据包示例
-
PHP Cookbook读书笔记 – 第08章web基础
-
Oracle基础教程:单行函数—null值处理函数
-
JavaScript中关于for循环删除数组元素内容时出现的问题
-
js实现简单选项卡与自动切换效果的方法_javascript技巧
-
如何用JavaScript去判断是否为微信扫码的方法