HTML加载完毕后会生成一个DOM树
DOM document html head body a href='http://www.xxx.com' innerText html、head、body、a等节点称为元素节点href等节点称为属性节点innerHTML等节点称为文本节点假设父元素是div标记,则:
第一行<div>后的换行和制表符被划分为一个文本节点(#text)第二行的<!-- 注释 -->是一个注释节点(#comment)第二行<!-- 注释 -->后的text1和换行和制表符和text2和换行被划分为一个文本节点第三行的<p>段落</p>是一个元素节点第三行的<p>段落</p>后的换行是一个文本节点所以div一共有5个子节点
例:
<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 //长度 ...注意:指的是下一级子节点,不是所有级
IE6、7、8仅支持firstChild fireFox、Chrome、IE9+支持firstChild和firstElementChild
IE6、7、8中的firstChild指第一个子标签节点 fireFox、Chrome、IE9+中的firstChild指第一个子节点(包括换行、标签、空文档) fireFox、Chrome、IE9+中的firstElementChild指第一个子标签节点
所以考虑兼容性:
//IE 6、7、8 节点.firstChild //fireFox、Chrome、IE9+ 节点.firstElementChild两个属性可以这样合并:
var 第一个子节 = 点节点.firstElementChild || 节点.firstChild //优先使用firstElementChild,若是IE 6、7、8,因为不支持所以会用后者;而其他浏览器则会使用前者同上具有兼容性问题,语句为:
节点.lastChild 节点.lastElementChild标准属性:childNodes
IE6、7、8中的childNodes指所有子元素节点 fireFox、Chrome、IE9+中的childNodes指所有子节点(包括换行、标签、空文档)
非标准属性(虽不是标准属性,但几乎所有浏览器都支持):children
fireFox、Chrome、IE9+中的children指所有子元素节点 IE6、7、8中的children还包含了注释节点,要注意注释不要写操作节点里面
使用时建议用children(注意不要写注释节点)来达到多浏览器兼容
同获取第一个子节点一样具有兼容性问题,语句为:
节点.nextSibling 节点.nextElementSibling同获取第一个子节点一样具有兼容性问题,语句为:
节点.previousSibling 节点.previousElementSibling在指定节点内的最后插入
节点.appendChild(object)在指定节点内的参考节点前插入,若找不到参考节点则按appendChild插到最后
节点.insertBefore(object,参考节点)格式:
父节点.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");直接操作获取的src是绝对路径,因为直接读取的是系统属性 class要写为className,因为系统中存储的是className属性 获取width时虽然标签中没有声明,但因为是读取系统属性所以仍可以读出来
使用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所以两者不可混用
上面的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标签作为正常的元素节点,不会被转换