文章目录
- 一 节点查找方法
- 二 增删改
- 三 操作样式
- 5. 操作节点
- 获取元素内容
- 2. 节点遍历
- 3. 类数组对象(基于DOM结构动态执行查询的结果,每当文档结构发生变化时,他们会得到更新)
- 表单
- 获取文本
一 节点查找方法
1. 获取元素节点
1. getElementById() 只能通过document调用
//通过id属性获取一个元素节点对象
document.getElementById("tag");
//当有其他标签的name也为tag 且在上面 会选错
//当多个标签id都为tag时 只选择最上面的那个
//修正方法
var getElementById = function(id){
var el=document.getElementById(id);
if(!+"\v1"){//判断是不是IE
if(el && el.id === id){
return el;
}else{
var els=document.all[id],
n=els.length;
for(var i=0;i<n;i++){
if(els[i].id === id)
return els[i];
}
}
}
return el;
}
2. getElementsByName() 只能通过document调用
//通过name属性获取一组元素节点对象 返回一个类数组对象
document.getElementsByName("name");
3. getElementsByTagName() 可不通过document调用
//通过标签名获取一组元素节点对象 返回一个类数组对象
//主要用于处理表单项
var li1=document.getElementsByTagName("li");
var li2=document.getElementsByTagName("Li");//大写也可以
var inputs=document.getElementsByTagName("Input");
var all=document.getElementsByTagName("*");//获得全部标签
console.log(li2.length);
console.log(inputs[0].value);
2. 获取元素子节点
1. getElementsByTagName()[仅此一个方法,其他都是属性]
var p=document.getElementById("ul");
var q=p.getElementsByTagName("li");
for(var i=0;i<q.length;i++){
alert(q[i].innerHTML)
}
2. childNodes
//获取当前元素的子结点
var p=document.getElementById("ul");
//IE8及其以上浏览器中,会将空白文本(标签之间的换行)也当成子结点,IE8及其以下不会
console.log(p.childNodes.length)//会多于标签个数
3. children [推荐使用]
//获取当前元素的子元素类数组(childNodes是返回节点)
var p=document.getElementById("ul");
console.log(p.children.length)
console.log(p.children.item(1))
console.log(p.children[1])
4. firstChild
//获取当前元素的第一个子结点(包括空白文本节点)
var p=document.getElementById("ul");
console.log(p.firstChild)
5. firstElementChild
//获取当前元素的第一个子元素
//不支持IE8及其以下的浏览器
var p=document.getElementById("ul");
console.log(p.firstElementChild)
6. lastChild
//获取当前元素的最后一个子结点(包括空白文本节点)
var p=document.getElementById("ul");
console.log(p.lastChild)
3. 获取父亲节点和兄弟节点
1. parentNode
//获取当前元素的父节点(但不会有空节点)
var p=document.getElementById("ul");
console.log(p.lastChild)
2. previousSibling
//获取当前节点的前一个兄弟节点(会获取空节点)
var p=document.getElementById("ul");
console.log(p.previousSibling)
3. previousElementSibling
//获取当前节点的前一个兄弟元素 IE8及其以下不支持
var p=document.getElementById("ul");
console.log(p.previousElementSibling)
4. nextSibling
//获取当前节点的后一个兄弟节点
var p=document.getElementById("ul");
console.log(p.nextSibling)
5. nextElementSibling
//获取当前节点的下一个兄弟元素 IE8及其以下不支持
var p=document.getElementById("ul");
console.log(p.nextElementSibling)
4. getElementsByClassName 可不通过document调用 H5新增
//IE8及其以下浏览器不支持
var ul=document.getElementById("ul");
var lis1=ul.getElementsByClassName("light");
var lis2=ul.getElementsByClassName("light dark");
//获得同时具有两个class的标签 class顺序可换
5. querySelector() 返回指定选择器的第一个元素对象 可不通过document调用 H5新增
//需要一个选择器的字符串作为参数,可以根据一个CSS选择器来查询一个元素节点对象
//IE8中虽然没有getElementsByClassName() 但是可以用querySelector()代替
var els=document.querySelector("div");
var els=document.querySelector(".box div");
//寻找.box 下的 div
var els=document.querySelector("div");
var ul=document.querySelector("#ul");
var li=document.querySelector(".li");
var lis=ul.querySelector("li:last-child");
var inp=document.querySelector("input,li");
//只能找到input 要找到多个得用 document.querySelectorAll()
var item=document.querySelector(".foo\\:bar");
//:等字符得转义
6. querySelectorAll() 返回指定选择器的所有元素对象 可不通过document调用 H5新增
//将符合条件的元素封装到一个类数组中返回
//即使符合条件的元素只有一个 也会返回类数组
//返回的是 StaticNodeList 和 getElementsByTagName不一样呢,不具动态性
document.querySelectorAll("div");
7. 获取特殊元素 body html all *
var bd=document.body;//获取body
var ht=document.documentElement;//获取html
var all=document.all;//获取页面所有元素
var all=document.getElementsByTagName('*');//获取页面所有元素
二 增删改
1. appendChild()
var ul=document.getElementById("ul");
var txt=document.createTextNode("4");
var li=document.createElement("li");
var first=ul.firstElementChild;
li.appendChild(txt);
ul.appendChild(li);
ul.appendChild(first);
//将第一个子节点移到最后
2. createElement与createTextNode
var ul=document.getElementById("list");
var li=document.createElement("li");//创建标签
var txt=document.createTextNode("文本内容");//创建文本节点
li.appendChild(txt);//将文本节点插入到li标签中
ul.appendChild(li);//将li标签插入到ul中
3. insertBefore
//将新节点插入到指定节点前面
// 语法 父节点.insertBefore(新节点,目标节点)
var ul=document.getElementById("list");
var obj=document.getElementById("obj");
//obj为ul的子节点
var nli=document.createElement("li");//创建标签
ul.insertBefore(nli,obj)
//注意 children.item()的使用
var li=ul.children.item(1);
ul.insertBefore(nli,li);
ul.insertBefore(nli,null);//添加到最后
4. replaceChild()
var ul=document.getElementById("list");
var obj=document.getElementById("obj");
//obj为ul的子节点
var nli=document.createElement("li");//创建标签
ul.replaceChild(nli,obj);
ul.replaceChild(nli,ul.children.item(2));
//replace有返回值 返回的是被替换的节点
var returnNode = ul.replaceChild(nli,obj);
5. removeChild()
var ul=document.getElementById("list");
var del=ul.removeChild(ul.childNodes[1]);
//childeNodes是伪数组,索引从0开始
//但是1才是第一个子标签,因为还有空白节点
var ul=document.getElementById("list");
var obj=document.getElementById("obj");
ul.removeChild(obj) //一种形式
obj.parentNode.remove(obj) //简单一点的形式
6. removeNode()
var ul=document.getElementById("list");
var remove=ul.removeNode(); //默认不删除子结点
var remove1=ul.removeNode(true);//子结点全部删除
7. innerHTML实现
var ul=document.getElementById("list");
ul.innerHTML += '<li>广州</li>' //添加一个标签
//但是不推荐这么做,因为这样相当于把原有的标签全部替换了一遍
//原来绑定在上面的时间会全部撤除
//故用下面的方式
var ul=document.getElementById("list");
var nli=document.createElement("li");//创建标签
nli.innerHTML = 'guangzhou'
ul.appenChild(li)
三 操作样式
1. style 读取内联样式
//通过style属性设置的样式是内联样式
//而内联样式有较高的优先级,所以通过JS修改的样式往往会立即显示
//但是如果在CSS样式中添加了!important,即使通过JS也不能覆盖该样式
//所以尽量不要为样式添加!important
var box=document.getElementById("div");
box.style.width = "300px";
box.style.height = "300px";
box.style.backgroundColor = "yellow";
//通过style属性设置和读取的都是内联样式,CSS样式表里的样式读不出来
console.log(box.style.width)
2. currentStyle 读取显示样式(只有IE支持)
//读取显示的样式,既不是特定读取CSS样式,也不是特定读取内联样式
//如果当前元素没有设置样式,则返回默认样式
var box=document.getElementById("div");
console.log(box.currentStyle.width)
3. getComputedStyle() 获取元素当前样式
//这个方法是window的方法,可直接使用
//需要传两个参数 一参:要获取样式的元素 二参:可以传递一个伪元素,一般传null
//该方法返回一个对象,对象中封装了当前元素对应的样式
//对于没有设置的样式,会获取到真实值,而不是默认值
//不像currentStyle对于未设置的width返回auto,该方法会获得一个实际的值
//该方法不支持IE8及其以下浏览器
var box = document.getElementById("div");
var obj = getComputedStyle(box,null);
console.log(obj.width)
4. 封装兼容的获取样式方法
//getComputedStyle()和currentStyle只能读取样式,不能设置样式,样式设置得用style
var box = document.getElementById("div");
console.log(getStyle(box,"width"))
function getStyle(obj,name){
//此处一定要加window 不加window是变量,寻找不到会报错,后面都不执行
//加window后是windos的一个属性,只看有没有
if(window.getComputedStyle){
return getComputedStyle(obj, null)[name]
}else{
return obj.currentStyle[name]
}
}
5. clientWidth ClientHeight
//返回可视区域的宽/高 如果有滚动条等会减去滚动条的宽高
//clientWidth和ClientHeight是只读属性,不能修改
//返回 内容区 + 内边距
var box = document.getElementById("div");
console.log(box.clientWidth)
console.log(box.ClientHeight)
6. offsetWidth offsetHeight
//offsetWidth offsetHeight 是只读属性,不能修改
//返回 内容区 + 内边距 + 边框
console.log(box.offsetWidth)
console.log(box.offsetHeight)
7. offsetLeft offsetTop
返回相对于其定位父元素的偏移量
8. offsetParent
//获取当前元素最近的开启定位的祖先元素
9. scrollWidth scrollHeight
获取元素整个滚动区域的宽度/高度
10. scrollTop scrollLeft
//获取元素滚动条滚动的距离
//当满足 scrollHeight - scrollTop == clientHeight
//说明滚动条滚动到底了
//可以用于协议阅读判断
- createComment与createDocumentFragment
var comment=document,createComment("A comment");//创建注释文档 var fragment=document.createDocumentFragment();//创建文档片段 var ul=document.getElementById("list"); var li=null; for(var i=0;i<3;i++){ li=document.createElement("li"); li.appendChild(document.createTextNode("item" + (i+1))); fragment.appendChild(li); } ul.appendChild(fragment); document.body.insertBefore(comment,document.body.firstChild);
5. 操作节点
- cloneNode()
var ul=document.getElementById("ul"); var nul=ul.cloneNode();//只克隆本身,不克隆子结点 var nul=ul.cloneNode(true);//克隆子结点
- normalize()
var div=document.createElement("div"); var textNode=document.createTextNode("DOM探索"); div.appendChild(textNode); var textNode2=document.createTextNode("后续"); div.appendChild(textNode2); document.body.appendChild(div); div.normalize();//使两个文本节点合并成一个
- splitText()
var div=document.createElement("div"); var textNode=document.createTextNode("DOM探索"); div.appendChild(textNode); document.body.appendChild(div); var n=div.firstChild.splitText(2); console.log(div.firstChild.nodeValue);//DO console.log(n);//DO后面的内容 console.log(div.childNodes.length);//2
获取元素内容
- innerHTML与innerText
//获取到元素内部HTML代码 对于自结束数标签没有意义
var content=document.getElementById('content');
console.log(content.innerHTML)//若有标签,标签也会被打印(识别)
console.log(content.innerText)//若有标签,标签会被去除
var str='<p>this is a <em>paragraph</em></p>'+
'<ur>' +
'<li>item1</li>' +
'<li>item2</li>' +
'</ur>';
content.innerHTML=str;
p.innerText=str;//<p>标签会被保留,不会创建
//innerHTML 识别html标签 W3C标准 保留空格和换行
//innerText 不识别html标签 非标准 不保留空格和换行
//打印属性 但是不能打印class属性 class属性要用 .className
console.log(content.value)
console.log(content.className)
2. 节点遍历
- 节点遍历方法
var ht=document.documentElement;//获得根元素html //var hd=ht.firstChild; 获得head //var hd=ht.childNodes[0]; var hd=ht.childNodes.item(0); var bd=ht.childNodes[1]; console.log(ht.tagName) //打印标签名 console.log(hd.parentNode == ht);//true console.log(bd.previousSibling == hd);//true console.log(hd.nextSibling == bd);//true var p=document.getElementById("pa"); console.log(p.ownerDocument == document);//true //ownerDocument找到根节点 console.log(p.hasChildNodes());//true //虽然p为最里面的节点 但还是可以有子结点 console.log(p.childNodes[0].hasChildNodes());//false
- 打印节点树
var s=""; function travel(space, node) { if(node.tagName){ s += space + node.tagName + '<br/>'; } var len=node.childNodes.length; for(var i=0;i<len;i++){ travel(space + '|-', node.childNodes[i]); } } travel("",document); document.write(s);
- 遍历去掉非标签节点(文本节点)
var box=document.getElementById("box"); for(var i=0,len=box.childNodes.length;i<len;i++){ if(box.childNodes[i].nodeType == 1){ console.log(box.childNodes[i]); } }
- 节点遍历新API(不包含空白文本节点,IE8以下不支持)
//firstElementChild lastElementChild //nextElementSibling previousElementSibling //children[] var box=document.getElementById("box"); for(var i=0,len=box.childElementCount;i<len;i++){ console.log(box.children[i]); }
3. 类数组对象(基于DOM结构动态执行查询的结果,每当文档结构发生变化时,他们会得到更新)
- NodeList
var box=document.getElementById("box"); var nodes=box.childNodes; console.log(nodes);//类数组 但没有push等方法 console.log(nodes[1]); console.log(nodes.item(1)); //类数组转数组 function ar(nodelist){ var arr=new Array(); for(var i=0,len=nodelist.length;i<len;i++){ arr.push(nodelist[i]); } return arr; } //简便方法(有兼容性问题) function arr(nodelist){ return Array.prototype.slice.call(nodelist); } //改进 function arrr(nodelist){ var arr=null; try{ return Array.prototype.slice.call(nodelist); }catch(e){ arr=new Array(); for(var i=0,len=nodelist.length;i<len;i++){ arr.push(nodelist[i]); } } return arr; }
- HTMLCollection
var scripts=document.scripts; var links=document.links; var cells=document.getElementById("tr").cells; var imgs=document.images; var forms=document.forms; var options=document.getElementById("select").options; var cla=document.getElementsByClassName("class"); //s var ps=document.getElementsByTagName("p"); console.log(cells.namedItem('td'));//先找id为td的标签,若没有找name为td的标签 //多个重复的只返回一个
- NamedNodeMap
var attrs=box.attributes; console.log(attrs);//返回box属性的类数组
表单
//表单里的type value checked selected disabled不能用innerHTML来操作
var btn=document.querySelector('button');
var inp=document.querySelector('input');
btn.onclick=function(){
inp.value='被点击了';
this.disabled=true;//or btn.disabled =true;
}
获取文本
//读取文本框的value属性值,就是文本框中的内容
var tx=document.getElementById('text')
console.log(tx.value)
tx.value = "haixing" //设置文本框内容
//获取元素的中的文本
console.log(tx.innerHTML)
console.log(tx.innerText) //没有子标签了
var text = tx.firstChild //文本节点作为标签的第一个子结点,此时获取的是节点 还未获取节点中的文本
console.log(text.nodeValue)
- 节点遍历方法
var ht=document.documentElement;//获得根元素html //var hd=ht.firstChild; 获得head //var hd=ht.childNodes[0]; var hd=ht.childNodes.item(0); var bd=ht.childNodes[1]; console.log(ht.tagName) //打印标签名 console.log(hd.parentNode == ht);//true console.log(bd.previousSibling == hd);//true console.log(hd.nextSibling == bd);//true var p=document.getElementById("pa"); console.log(p.ownerDocument == document);//true //ownerDocument找到根节点 console.log(p.hasChildNodes());//true //虽然p为最里面的节点 但还是可以有子结点 console.log(p.childNodes[0].hasChildNodes());//false
一 DOM
DOM 文档对象模型(Document Object Model)
- 文档 表示整个HTML网页文档
- 对象 表示将网页每个部分都转换为对象,方便属性操作
- 模型 使用模型表示对象之间关系,方便我们获取对象(DOM树)