HTML加载完毕后会生成一个DOM树html
<div> <!-- 注释 -->text1 text2 <p>段落</p> </div>
假设父元素是div标记,则:java
<div>
后的换行
和制表符
被划分为一个文本节点(#text)<!-- 注释 -->
是一个注释节点(#comment)<!-- 注释 -->
后的text1
和换行
和制表符
和text2
和换行
被划分为一个文本节点<p>段落</p>
是一个元素节点<p>段落</p>
后的换行
是一个文本节点因此div一共有5个子节点node
//单个 document.getElementById(); //数组 document.getElementsByClassName(); document.getElementsByTagName();
元素节点.getAttributeNode(attributeName);
例:数组
<div id="d">this is a div<!-- 注释 --></div>
var d=document.getElementById("d"); console.log(d.firstChild);
输出:浏览器
nodeName: "#text" //节点名(文本节点) nodeType: 3 //节点类型(1:元素 2:属性 3:文本) nodeValue: "this is a div" //节点value parentNode: HTMLDivElement //父节点 parentElement: HTMLDivElement //父元素节点 previousSibling: null //上一个兄弟节点 nextSibling: Comment //下一个兄弟节点(注释) length: 13 //长度 ...
节点.parentNode
IE六、七、8仅支持firstChild
fireFox、Chrome、IE9+支持firstChild和firstElementChildapp
IE六、七、8中的firstChild指第一个子标签节点
fireFox、Chrome、IE9+中的firstChild指第一个子节点(包括换行、标签、空文档)
fireFox、Chrome、IE9+中的firstElementChild指第一个子标签节点this
因此考虑兼容性:spa
//IE 六、七、8 节点.firstChild //fireFox、Chrome、IE9+ 节点.firstElementChild
两个属性能够这样合并:code
var 第一个子节 = 点节点.firstElementChild || 节点.firstChild //优先使用firstElementChild,如果IE 六、七、8,由于不支持因此会用后者;而其余浏览器则会使用前者
同上具备兼容性问题,语句为:htm
节点.lastChild 节点.lastElementChild
标准属性:childNodes
IE六、七、8中的childNodes指全部子元素节点
fireFox、Chrome、IE9+中的childNodes指全部子节点(包括换行、标签、空文档)
非标准属性(虽不是标准属性,但几乎全部浏览器都支持):children
fireFox、Chrome、IE9+中的children指全部子元素节点
IE六、七、8中的children还包含了注释节点,要注意注释不要写操做节点里面
使用时建议用children(注意不要写注释节点)来达到多浏览器兼容
同获取第一个子节点同样具备兼容性问题,语句为:
节点.nextSibling 节点.nextElementSibling
同获取第一个子节点同样具备兼容性问题,语句为:
节点.previousSibling 节点.previousElementSibling
var a=document.createElement("div"); var b=document.createElement("abc"); console.log(a); //<div></div> console.log(b); //<abc></abc> console.log(typeof a); //object console.log(typeof b); //object
在指定节点内的最后插入
节点.appendChild(object)
在指定节点内的参考节点前插入,若找不到参考节点则按appendChild插到最后
节点.insertBefore(object,参考节点)
<div id="d1"> <p>1</p> </div> <div id="d2"> <p>2</p> </div>
var d1=document.getElementById("d1"); var p2=document.getElementById("d2").firstElementChild; d1.appendChild(p2); //p2移动到d1 d1.insertBefore(p2,d1.firstElementChild); //p2移到p1前面
格式:
父节点.removeChild(object)
若要删除本身,能够:
node.parentNode.removeChild(node)
格式:
节点.cloneNode(Boolean)
参数为false(默认为false)时,表示仅复制节点自己
参数为true时,表示复制还全部子节点
例:
<div> 111 <a>baidu</a> </div>
为true时复制所有
为false时仅复制:<div></div>
,任何子节点都不复制(不只只有元素节点)
例:
<img src="1.jpg" id="i1" class="imgs" alt="img1" /> var i1=document.getElementById("i1");
i1.src 或 i1["src"] --> http://localhost/test/1.jpg i1.className 或 i1["className"] --> imgs i1.alt 或 i1["alt"] --> img1 i1.width 或 i1["width"] --> 63
直接操做获取的src是绝对路径,由于直接读取的是系统属性
class要写为className,由于系统中存储的是className属性
获取width时虽然标签中没有声明,但由于是读取系统属性因此仍能够读出来
i1.getAttribute("src") --> 1.jpg i1.getAttribute("class") --> imgs i1.getAttribute("alt") --> img1 i1.getAttribute("width") --> null
使用getAttribute至关于直接读取html文档中的属性节点,不是读取系统属性
因此获取src和class时不用考虑系统属性名和系统中属性值是否与html文档相同的问题
读取width时由于标签中没有声明,因此找不到width,此时应该用直接操做
格式:
node.removeAttribute(attribute)
格式:
node.setAttribute(attribute,value)
直接操做操做的是系统中的属性,做为节点操做操做的是标签上的属性节点
例子:
i1.a="abc"; console.log(i1.a); //abc console.log(i1.getAttribute("a")); //null i1.setAttribute("b","def"); console.log(i1.b); //undefined console.log(i1.getAttribute("b")); //def
因此二者不可混用
<div id="d"> aaa <div> div2 </div> </div>
上面的HTML片断中,运行如下打码:
console.log(d1.innerText); // aaa div2 console.log(d1.innerHTML); //2-5行所有输出
d1.innerText="<p>text</p>"; //此时的 < > 被做为字符串被转换为 < > console.log(d1.innerHTML); //<p>text</p> //!在设置 文本节点 时同时覆盖了全部 其余节点 d1.innerHTML="<p>text</p>"; //p标签做为正常的元素节点,不会被转换
属性 | |
---|---|
document.title | 获取head里的title |
document.head | 获取head标签 |
document.body | 获取body标签 |
document.documentElement | 获取html标签(注意不是.html) |