Dom深入浅出
Dom1级提供了一个Node接口,该接口将由Dom中所有节点类型(包括元素节点、文本节点、属性节点等12种)实现,而js是作为Node类型来实现的,js中的所有节点类型的继承自Node类型,
所以它们拥有一些相同的基本属性和方法。(备注:12种类型节点中并不是所有节点都受到Web浏览器的支持,开发人员最常用的就是元素和文本节点)
如nodeType、nodeName、nodeValue属性(备注nodeName、nodeValue这两个属性值完全取决于节点类型,对元素节点来说,前者显示标签名,后者始终未null)。
节点关系:和家谱相似
每个节点都有一个childNodes属性,返回一个NodeList对象,该对象长的和数组一样.别且也有length属性返回子元素个数,访问子元素的方法有两种:[index]或者.item(index)
这里有一个坑需要注意:childNodes返回的是所有节点,包括文本节点,最坑爹的是空格也算是文本节点。所以不要使用这个属性。建议用children属性,只返回子元素节点。
Node类型:
1、nodeType、nodeName、nodeValue属性:不同节点类型的这几个属性的值都不一样。
2、节点关系(下面这些都是属性,相当于关系指针):
childNodes(所有子节点,可能不是元素节点,NodeList类型,可以用[索引]和item(索引)来访问);
parentNode(父节点,一般为元素节点);
previousSibling(上一个同胞节点)
nextSibling(下一个同胞节点)
firstChild(第一个孩子节点)
lastChild(最后一个孩子节点)
3、操作节点:
appendChild(dom对象) 如;fatherNode.appendChild(sonNode)
insertBefore(newNode,nowNode) //在nowNode节点前插入一个newNode节点
replaceChild(nowNode,oldNode) //将oldNode节点(Dom对象)替换成newNode节点
removeChild(node) //移除node节点
(备注:上面这些方法都是由父节点调用的,并且如果新增的节点是页面原有的只会移动不会新增(同一个指针或节点不可能出现在页面的多个地方)移动后相对关系改变)
4、其它方法
cloneNode() //接受Boolen类型值 true表示深复制(后代节点也复制) false表示浅复制(只复制当前节点)
normalize() 处理文本节点用的 空文本节点删除 相邻的文本节点合并
节点类型共有12中(都继承自Node类型),这里介绍几种常用的节点类型:
Document类型
document(是HtmlDocument的实例,该类型继承自Document)表示整个文档,是dom树中的根节点,也是window对象的一个属性,所以可以当做全局变量使用
(特点:nodeType:9 nodeName:#document nodeValue:null parentNode:null)
document.documentElement属性始终指向:html元素节点
document.body指向body
文档信息:
document.title指向title的内容(字符串类型,可修改)
document.URL 当前页面完整的URL
document.domain当前页面的域名
查找元素:
getElementById("id") //返回指定id的Dom对象
getElementsByTagNmae("div") // 返回指定标签名的HTMLCollection对象(和NodeList对象差不多),*表示所有元素。
getElementsByName("name值") //HTMLCollection对象
getElementsByClassName("className") //(扩展的方法)HTMLCollection对象
文档写入:
document.write("哈哈哈")
document.writeln("呵呵"); //有换行
Element类型:
特征:ndoeType:1 nodeName:元素的标签名 nodeValue:null parentNode:document或Element
Html元素:HTMLElement类型(继承自Element类型)对象,HTMLElement类型添加了一些属性(每个html元素都存在的特性):id title lang dir className
取得特性:setAttribute("data-name","lxf") 设置特性:p.getAttribute("data-name") 移除特性:p.removeAttribute("data-name") 特性可以是标准的也可以是自定义的。
attributes属性(Element节点才拥有的):返回的NamedNodeMap类型(和NodeList差不多)对象,(该对象有一些方法,在此不细说)
创建元素节点:vat div=document.createElement("div"); //返回一个Elemen类型节点的Dom对象
此时,还可以设置新创建元素的特性:div.id="" div.className="" 。要将新创建的元素添加到Dom树中,可以使用操作节点的方法:appendChild insertBefore等
元素的子节点:childNodes属性(可能是元素 文本 注释等节点)。备注:元素节点也是支持 隔天ElementsByTagName("li") 方法的 在后代元素中寻找相同标签名的元素
Text类型:
特征:nodeType:3 ndoeName:#text nodeValue:节点包含的文本(和这个属性等价的是data属性) parentNode:是一个Element 不支持(没有)子节点
操作节点中文本的方法有:
appendData(text) //将text添加到节点的末尾
deleteData(start,count) //start位置开始,删除count个字符
insetData(start,text) //在start位置插入text
replaceData(start,count,text) //用text替换从start开始到start+count为止 的字符
。。。
文本节点的length属性 保存着文本节点字符长度(和nodeValue.length、data.length的值相等)
创建文本节点:var txtNode=document.createTextNode("还好啊"); 将创建的文本节点添加到Element节点中去:var divNode=document.createElement("div"); divNode.appendChild(txtNode); document.body.appendChild(divNode);
规范化文本节点:elementNode.normalize();
Comment类型:
特征:ndoeType:8 ndoeName:#comment nodeValue:注释的内容 parentNode:Document或Element
Comment类型与Text继承自相同的基类,用法同Text类型节点。
Dom扩展:
选择器Api:
.querySelector("css选择器") //返回匹配的第一个元素 如果没有匹配元素 返回null
.querySelectorAll("css选择器") //返回匹配的所有元素 NodeList对象
元素遍历(防止空格当做文本节点):
childElementCount //返回子元素的个数
firstElementChild //第一个子元素 firstChild的元素版 firstChild是节点版
lastElementChild //最后一个子元素 lastChild的元素版
previousElementSibing //指向前一个同辈元素 previousSibing元素版
nextElementSibing //指向下一个同辈元素 nextSibing元素版
Html5中扩展的js APi:
getElementsByClassName("clssName")
classList属性(DomTokenList类型 和NodeList差不多):该类型对象拥有下面一些方法:
add(value) 添加类型 如果已经存在就不添加啦
contains(value) 判断是否包含该类型 包含返回true 否则返回false
remove(value) //去除每个class
toggle(value) //有 删除;无 添加
焦点管理:
document.activeElement始终指向页面中获得焦点的Dom对象 默认是 body哦
元素获得焦点的方式一般有:页面加载、用户输入、在代码中调用focus();
自定义数据属性:以 data- 开头 随便命名
<p id="hh" class="gg" name="ss" data-name="苏州" data-id="123">我也是p3333</p>
可以通过Dom对象的dataset属性访问,var p=document.getElementById("hh"); p.dataset-name //苏州 p.dataset.id //123 注意没有data- 前缀
插入标记:innerHtml innerText
专用扩展:
children 属性 返回的是 子元素
contains()方法 调用该方法的是祖先节点 参数是后台节点 判断一个节点是不是在某个节点下面 是返回true
补充:
对于最常用的元素节点类型来说(即 我们一般获取到的Dom元素对象):它们 都是继承自HTMLElement或通过其他更具体的子类间接继承。
所以所有的dom元素对象都共拥有一些属性(HTMLElement类型的):id、title、className、dir、lang
<div class="test" title="i am title" id="tId" dir="ltr" lang="en"></div>
var test=document.getElementById("tId");
var title=test.title
var id=test.id
var className=test.className
...
当然某些Dom元素对象拥有一些其它Dom元素对象没有的属性:
如:
img标签的 Dom对象 继承自HtmlImageElement这个具体的类型。
所以它具有src属性 <img src="1.jpg" id='img1'/>
var src=document.getElemenetById("img1").src; // 1.jpg
再如:input 继承自HtmlInputElement类型 具有checked属性
<input type="radio" name="sex" id="meal" value="男">男
var isMeal=document.getElementById("meal").checked; // true or false
原因:每种元素的 公认特性会被添加到Dom对象的属性中,私有特性除外。
Dom深入浅出的更多相关文章
- DOM 事件深入浅出(二)
在DOM事件深入浅出(一)中,我主要给大家讲解了不同DOM级别下的事件处理程序,同时介绍了事件冒泡和捕获的触发原理和方法.本文将继续介绍DOM事件中的知识点,主要侧重于DOM事件中Event对象的属性 ...
- DOM 事件深入浅出(一)
在项目开发时,我们时常需要考虑用户在使用产品时产生的各种各样的交互事件,比如鼠标点击事件.敲击键盘事件等.这样的事件行为都是前端DOM事件的组成部分,不同的DOM事件会有不同的触发条件和触发效果.本文 ...
- 深入浅出DOM基础——《DOM探索之基础详解篇》学习笔记
来源于:https://github.com/jawil/blog/issues/9 之前通过深入学习DOM的相关知识,看了慕课网DOM探索之基础详解篇这个视频(在最近看第三遍的时候,准备记录一点东西 ...
- 【深入浅出jQuery】源码浅析--整体架构
最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...
- 虚拟dom与diff算法 分析
好文集合: 深入浅出React(四):虚拟DOM Diff算法解析 全面理解虚拟DOM,实现虚拟DOM
- 【深入浅出jQuery】源码浅析2--奇技淫巧
最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...
- 推荐--《Android深入浅出》
基本信息 书名:Android深入浅出 作者:张旸 著 页数: 661 出版社: 机械工业出版社; 第1版 (2014年4月17日) 语种: 简体中文 ASIN: B00JR3P8X0 品牌: 北京华 ...
- 深入浅出jsonp
前言 第一次听说jsonp,其实早在2年之前.当时在做一个活动页面的抽奖模块,要从服务端get一个概率,当时什么都不懂,同事说用ajax,我就用ajax,同事说dataType改成jsonp,我就改成 ...
- 深入浅出 React Native:使用 JavaScript 构建原生应用
深入浅出 React Native:使用 JavaScript 构建原生应用 链接:https://zhuanlan.zhihu.com/p/19996445 原文:Introducing React ...
随机推荐
- SQLite入门与分析(四)---Page Cache之事务处理(3)
写在前面:由于内容较多,所以断续没有写完的内容. 11.删除日志文件(Deleting The Rollback Journal)一旦更改写入设备,日志文件将会被删除,这是事务真正提交的时刻.如果在这 ...
- 使用QGridLayout布局实现翻页效果
http://blog.csdn.net/u013704336/article/details/51474942
- 性能优化工具 MVC Mini Profiler
性能优化工具 MVC Mini Profiler MVC MiniProfiler是Stack Overflow团队设计的一款对ASP.NET MVC.WebForm 以及WCF 的性能分析的小程 ...
- CSS+DIV布局初练—DIV元素必须成对出现?
一直做C/S开发的工作,但是很少做和布局相关的工作,往往都是同事将界面设计好,自己填写代码而已,对于B/S的工作,做过,但是很少没有像C/S这么多,界面布局的话,更无从谈起. 日子就这么过,一天一个样 ...
- ubuntu查看命令
以非root用户更新系统 sudo: sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等.这样不仅减少了root用 ...
- poj3270Cow Sorting(置换)
链接 对于组合数学是一点也不了解 讲解 重要一点 要知道一个循环里最少的交换次数是m-1次 . #include <iostream> #include<cstdio> #in ...
- 嵌入式linux市场份额
来自华清远见2014年度的调查统计数据显示,在嵌入式产品研发的软件开发平台的选择上,嵌入式Linux以55%的市场份额遥遥领先于其他嵌入式开发软件发平台,比去年增长了13个百分比,这已经是连续4年比例 ...
- 算法的时间复杂度(大O表示法)
定义:如果一个问题的规模是n,解这一问题的某一算法所需要的时间为T(n),它是n的某一函数 T(n)称为这一算法的“时间复杂性”. 当输入量n逐渐加大时,时间复杂性的极限情形称为算法的“渐近时间复杂性 ...
- jquery自动焦点图
效果预览:http://runjs.cn/detail/vydinibc 带左右箭头的自动焦点图:http://runjs.cn/detail/wr1d1keh html: <div clas ...
- Android样式——Styles
说明 样式(style)是属性的集合,用来指定View或者Window的外观和格式. 这些属性可以是height(高度).padding(内边距).font size(字体颜色)等. 样式定义在另一个 ...