js-09 DOM
一、DOM
DOM (document object model) 文档对象模型,是W3C组织推荐的处理可扩展标记语言的标准编程接口;node(节点);
元素节点(标签) 文本节点(换行或者文字) 注释节点(注释)
二、获取子节点:
父元素.children;(常用)(非标准属性)获取只有元素节点;类数组父元素.childNodes;(标准属性)所有子节点,包括文本、空格、标签、注释;
类数组:有长度,可以通过下标获取元素,但是不能使用数组的方法;
三、节点类型:
nodeType nodeName nodeValue;
nodeType:返回1-12的数字,分别表示不同的节点;1:标签节点;2:属性节点;3:文本节点; 8:注释节点; 9:文档节点;
nodeName:返回节点的名字;文本:#text;注释:#comment;标签:大写的标签名;
nodeValue:认为只有文本才有内容,元素的节点为空null;获取的标签的文本节点使用innerHTML修改会将标签也替换掉,这个可以只修改文本内容;li.firstChild.nodeValue;才能获取到li里面的文本内容;nodeValue = "新内容"; 可以设置新内容;
四、元素的父元素;
parentNode;直接父元素,parentNode.parentNode;父元素的父元素;(常用)offsetParent;返回离元素最近的有定位的父级,如果没有定位的父级,则返回body;
五、其他节点(了解);
父元素的子节点;
firstChild;父元素的第一个子节点;firstElementChild;父元素的第一个子元素节点;lastChild;父元素的最后一个子节点;lastElementChild;父元素的最后一个子元素节点; 以上不常用,推荐做法:
第一个:li[0],
最后一个:li[li.length-1];
兄弟元素节点;
previousSibling;上一个兄弟子节点;(包括文本注释)previousElementSibling;上一个兄弟元素节点;nextSibling;下一个兄弟子节点;nextElementSibling;下一个兄弟元素节点;
拓展:带Element的 标准浏览器支持的,返回元素节点,不带的是ie8及以下支持的,可能返回文本节点;
六、在IE8及以下中兼容问题;
children:还可以获取到注释;childNodes:不能获取到换行;firstChild:不能获取到换行;firstElementChild:带Element的不能识别,返回值undefined;
解决兼容办法:
var first = ul.firstElementchild ? ul.firstChild : firstElementChild;七、属性操作(常用);
获取:
getAttribute(属性名);属性名用在ie里面需要写className;设置:
setAttribute(属性名,属性值);直接是修改hdml标签里面的;删除:
removeAttribute(属性名);直接删除属性;括号里面需要加引号;检查:
hasAttribute(属性名),检查是否有指定属性名
特点:可以操作元素原生的属性,也可以操作自定义属性,并且在html上可见没有兼容性问题;
以下不能操作自定义属性
点的形式:
box.title = "abc";
八、类名操作
元素.classList;兼容ie11+;- 可用属性:length 返回类名的长度;
- 方法:
(1)add(class1,class2...) 添加一个或多个类名,如果存在则不会添加
(2)contains(class) 返回布尔值,判断元素是否有该类名;
(3)item(index) 返回元素索引值对应的类名;
(4)remove(class1,class2...) 移除类名;
(5)toggle(class,[true|false]); 切换类名,第二个参数可选,强制移除false或添加true;
九、创建添加
创建元素节点:
document.createElement("新标签");创建的想要放进去,需要使用添加创建文本节点:
document.createTextNode("文本内容");不常用,使用innerHTML;获取节点内容:元素.textContent
设置节点内容:元素.textContent = '';
添加文本节点:
appendChild(创建的标签);在结束标签之前添加;只能放到一个标签里,不能重复放;可以直接放到body里面: 获取body标签:body = document.body;
添加到指定元素前面:
父元素.insertBefore(new,old);new新标签,old指定标签;在IE9及以上,如果第二个参数不存在,则以appendChild添加,在IE8及以下,则报错;
// 解决兼容问题:
if(ul.children[0]){
ul.insertBefore()
}else{
ul.appendChild(i)
};js原生是没有insertAfter的,需要手动实现
// 插入到节点之后
function insertAfter(newDom, oldDom) {
const parentDom = oldDom.parentNode
// 判断是否是最后一个节点
if(parentDom.lastChild === oldDom) {
parentDom.appendChild(newDom)
} else {
parentDom.insertBefore(newDom, oldDom.nextElementSibling)
}
}技巧:
.link可以快速创建a标签
十、删除替换克隆
删除:
remove();谁调用的就删除谁,ie8及以下不兼容;`父元素.removeChild(子元素)`;将子元素从父元素中删除;替换:
父元素.replaceChild(新标签,旧标签);克隆:
元素.cloneNode();true,内容标签一起克隆,false,克隆标签;包含:
父元素.contains(子元素)
十一、insertAdjacentHTML
element.insertAdjacentHTML(position, text),将text解析为html或xml,并将结果节点插入到DOM树中的指定位置,该方法比直接操作innerHTML操作更快position是相对于元素的位置,必须是以下字符串之一
beforebegin:元素自身的前面。afterbegin:插入元素内部的第一个子节点之前。beforeend:插入元素内部的最后一个子节点之后。afterend:元素自身的后面。
<!-- beforebegin -->
<div>
<!-- afterbegin -->
<p>Hello World</p>
<!-- beforeend -->
</div>
<!-- afterend -->示例:
var list = document.querySelector('ul');
list.insertAdjacentHTML('afterbegin', '<li id="first-item">First</li>');十二、元素的其他获取方式;
querySelector(css选择器);选择第一个直接是元素;querySelectorAll(css选择器);选择所有的,结果是类数组元素.closest(css选择器),返回当前节点最近匹配选择符的父元素,如果选择到自己相同的元素,则返回自己
十三、表格的获取方式;
获取表头:
table.tHead;获取表尾:
table.tFoot;获取主体:
table.tBodies[0];类数组,需要加下标;获取行:
table.rows;获取table下所有的tr;table.tBodies;获取主体下的所有的tr;获取单元格:
table.rows[0].cells;需要通过行来获取td;
十四、表单的获取方式
表单获取属性:
通过form.name名 直接获取到某个标签;
表单事件:
form.onsubmit;点击提交按钮事件时触发;
form.onreset;表单重置事件;
form.user.onfocus;输入框获得焦点时触发;
form.user.onblur;输入框失去焦点时触发;提示输入完验证是否合格;
form.user.onchange;当按下回车或失焦时触发,且内容与上次按下回车或失焦不同;
form.user.oninput: 用户输入时触发;
表单方法:
return false;阻止表单提交,判断是否有内容,没有则阻止提交;
form.submit();调用提交方法;常用于button;
form.reset();调用重置方法;
form.user.focus();输入框获得焦点;
form.user.blur();输入框失去焦点;
form.user.select();直接选中输入框的内容并获得焦点;
当输入框改动时,执行这个函数,每按下一次都会执行;
input.oninput = function(){},比onkeyup先触发;
焦点事件
focus:获得焦点,不支持冒泡;
blur:失去焦点,不支持冒泡
focusin:获得焦点,支持冒泡;
focusout:失去焦点,支持冒泡;
input.focus() 会自动滚动到获取焦点的地方,如果不希望滚动到获取焦点的地方,可以使用以下的代码
// 下面代码ie不兼容
ipt.focus({
preventScroll: true
})高频面试题
● DOM 怎样添加、移除、移动、复制、创建和查找节点