JavaScript DOM
2021/11/7 20:10:26
本文主要是介绍JavaScript DOM,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
目录
1.DOM的简介
2.节点获取
1).获取子节点
2).节点属性
3).获取父节点
4).获取相邻节点
3).节点的操作
1.节点的创建
2.节点的添加
3.节点的插入
4.节点的删除
5.节点替换
6.节点克隆
练习发表评论
4).获取元素的其它方式
5).操作元素结构上的属性
案例:发送验证码状态
1.DOM的简介
-
DOM:Document Object Model 文档对象模型 (创建,添加,删除,替换,查找,获取)
-
DOM树:浏览器在解析html文档的时候,为了让他们的层次更明显,将html解析成DOM树的形式
-
节点:组成DOM树的所有内容,都称之为节点
2.节点获取
规律:获取到了是具体的节点,获取不到就是null,获取到了是一个集合,获取不到就是空集合
1).获取子节点
-
父节点.children;获取直接元素子节点
-
存在兼容问题:IE8及以下不兼容 包含注释节点
-
var child = box.children;
console.log(child); //HTMLCollection(3)
-
父节点.childNodes; 获取直接子节点
-
存在兼容问题:IE8及以下不将换行及空格作为文本节点
-
var nodes = box.childNodes;
console.log(nodes); //NodeList(9) [text, comment, text, p, text, ul, text, h2, text] //在标准浏览器下会把换行及空格当做文本节点
2).节点属性
nodeType | nodeName | nodeVale |
---|---|---|
1 (元素节点) | 大写的标签名 (DIV) | null |
3 (文本节点) | #text | 文本内容 |
8 (注释节点) | #comment | 注释内容 |
9 (文档节点) | #document | null |
<div id="box"> <!-- 我是注释 --> <p>我是p</p> <ul> <li>1</li> <li>2</li> <li>3</li> </ul> <h2>我是h2</h2> 的即可拉伸及打开拉斯就立刻到 </div> <script> var box = document.getElementById("box"); var nodes = box.childNodes; //获取直接子节点 console.log(nodes); console.log(nodes[3].nodeType, nodes[3].nodeName, nodes[3].nodeValue); console.log(nodes[0].nodeType, nodes[0].nodeName, nodes[0].nodeValue); console.log(nodes[1].nodeType, nodes[1].nodeName, nodes[1].nodeValue); console.log(document.nodeType, document.nodeName, document.nodeValue); /* 作用:获取直接元素子节点,传递第二个参数可以进行过滤 参数: parentEle 父元素 [tagName] 是否进行过滤 返回值:数组 */ function getChild(parentEle, tagName) { // 获取直接子节点 var nodes = parentEle.childNodes, arr = []; // 获取当前节点 for (var i = 0; i < nodes.length; i++) { var curNode = nodes[i]; // 判断 if (tagName) { //传递了第二个参数 // 节点类型必须是1 节点名称必须等于传递tagName的值 if (curNode.nodeType === 1 && curNode.nodeName.toLowerCase() == tagName.toLowerCase()) { //元素节点 arr.push(curNode); } } else { if (curNode.nodeType === 1) { //元素节点 arr.push(curNode); console.log(curNode.nodeName); } } } return arr; } var res = getChild(box, "ul"); console.log(res); </script>
3).获取父节点
parentNode是指定节点的父节点.一个元素节点的父节点可能是一个元素(``Element
)节点,也可能是一个文档(``Document
)节点,或者是个
文档碎片(DocumentFragment
)节点.
-
parentNode; 获取父节点 文档节点没有父节点返回值是null
var li = document.getElementById("li"); // parentNode; 获取父节点 文档节点没有父节点返回值是null console.log(li.parentNode);//ul
4).获取相邻节点
-
父元素.firstChild; 获取第一个子节点
-
兼容:IE8及以下不将换行及空格作为文本节点
-
-
父元素.firstElementChild; 获取第一个元素子节点
-
兼容:IE8及以下没有这个属性;
-
-
父元素.lastChild;获取最后一个子节点
-
兼容:IE8及以下不将换行及空格作为文本节点
-
-
父元素.lastElementChild; 获取第一个元素子节点
-
兼容:IE8及以下没有这个属性;
-
-
节点.previousSibling; 获取上一个兄弟节点
-
兼容:IE8及以下不将换行及空格作为文本节点
-
-
节点.previousElementSibling; 获取上一个元素兄弟节点
-
兼容:IE8及以下没有这个属性;
-
-
节点.nextSibling; 获取下一个兄弟节点
-
兼容:IE8及以下不将换行及空格作为文本节点
-
-
节点.nextElementSibling; 获取下一个元素兄弟节点
-
兼容:IE8及以下没有这个属性;
-
<ul id="box"> <li>1</li> <li>2</li> <!-- 我是列表标签 --> <li id="test">3</li> <li>4</li> <li>5</li> </ul> <script> var box = document.getElementById("box"); // 获取到了是具体的节点,获取不到就是null,获取到了是一个集合,获取不到就是空集合 console.log(box.childNodes); //NodeList(13) [text, li, text, li, text, comment, text, li#test, text, li, text, li, text] console.log(box.firstChild);//text console.log(box.firstElementChild);//li console.log(box.lastChild);//text console.log(box.lastElementChild);//li var test = document.getElementById("test"); console.log(test.previousSibling);//text console.log(test.previousElementSibling);//li console.log(test.nextSibling);//text console.log(test.nextElementSibling);//li
3).节点的操作
操作已经存在的节点发生物理偏移
1.节点的创建
创建出来的节点都是对象
-
创建元素节点
-
document.createElemet(“标签名”);
-
-
创建文本节点
-
document.createTextNode("文本");
-
var div = document.createElement("div"); div.innerHTML = "我是DIV"; console.log(div); var h2 = document.createElement("h2"); var text = document.createTextNode("哈哈哈哈哈");
2.节点的添加
-
父节点.appendChild(子节点); 在父节点的末尾进行添加
// 获取元素 var ul = document.getElementById("ul"); // 父节点.appendChild(子节点); 在父节点的末尾进行添加 // 创建元素节点 var li = document.createElement("li"); li.innerHTML = "我是Li"; // 创建文本节点 var txt = document.createTextNode("我是Li"); // 将文本节点添加到li中 li.appendChild(txt); console.log(li); // 将li添加到ul中 ul.appendChild(li); // 操作已经存在的节点发生物理偏移 console.log(ul.children); ul.appendChild(ul.children[0]); /* 2 我是Li我是Li 1 */
3.节点的插入
-
父元素.insertBefore(newEle,refEele); 在参考节点之前进行插入
-
newEle:要插入的节点
-
refEele:参考节点
-
/* 父元素.insertBefore(newEle,refEele); 在参考节点之前进行插入 - newEle:要插入的节点 - refEele:参考节点 */ var ul = document.getElementById("ul"); // 插入新的节点 // 创建 var li = document.createElement("li"); li.innerHTML = "<a href='https://www.baidu.com'>我是Li</a>"; console.log(li); // 没有参考元素,直接在最后面插入 // ul.insertBefore(li,null); // 有参考元素 ul.insertBefore(li,ul.children[1]); // 操作已经存在的节点发生物理偏移 console.log(ul.children); // 将第一个元素节点插入到最后一个元素节点之前 ul.insertBefore(ul.children[0],ul.children[ul.children.length-1]);
4.节点的删除
-
删除节点本身
-
节点.remove();
-
-
删除子节点
-
父元素.removeChild(子节点);
-
var ul = document.getElementById("ul"); // 删除节点本身 // ul.remove(); // 删除子节点 ul.removeChild(ul.children[1]);
5.节点替换
-
父元素.replaceChild(newEle,refEele);
-
newEle:替换节点
-
refEele:被替换节点
-
/* 父元素.replaceChild(newEle,refEele); - newEle:替换节点 - refEele:被替换节点 */ var ul = document.getElementById("ul"); // 创建节点 var h2 = document.createElement("h2"); h2.innerText = "我是H2"; // 用新的节点进行替换 ul.replaceChild(h2,ul.children[1]); // 用已经存在的节点进行替换 // 操作已经存在的节点发生物理偏移 ul.replaceChild(ul.children[2],ul.children[0]);
6.节点克隆
-
节点.cloneNode([false]);
-
[false]->默认值是false,可以省略 只克隆节点本身不包含内容
-
true:将内容一起克隆
-
var ul = document.getElementsByTagName("ul")[0]; // var res = ul.cloneNode(); // var res = ul.cloneNode(false); var res = ul.cloneNode(true); console.log(res);
练习发表评论
// 获取元素 var input = document.getElementsByTagName("input")[0]; var button = document.getElementsByTagName("button")[0]; var ul = document.getElementsByTagName("ul")[0]; // 绑定事件 button.onclick = function () { // 创建li var li = document.createElement("li"); // 赋值内容 li.innerHTML = input.value; // 创建button var btn = document.createElement("button"); btn.innerText = "删除"; // 将btn添加到li中 li.appendChild(btn); // 将li插入到ul中 //在最后面插入 // ul.appendChild(li) //在最前面插入 // ul.insertBefore(li,ul.children[0]); ul.insertBefore(li, ul.firstElementChild); // 给btn绑定事件 btn.onclick = function () { this.parentNode.remove(); } }
4).获取元素的其它方式
-
context.querySelector(“css选择器”);
-
获取到了返回具体的元素,如果有很多符合获取条件,只返回第一个,获取不到返回null
-
-
context.querySelectorAll("css选择器");
-
获取到了是一个节点集合,获取不到是一个空集合
-
context:在这里表示限定获取范围,可以是document也可以自己去限定(context:必须是具体的元素) 不兼容:IE7及以下没有这个属性
var ul = document.querySelector("ul"); var ul = document.querySelector("#box"); var oLis = ul.querySelectorAll("li"); console.log(oLis); //NodeList(10) [li, li, li, li, li, li, li, li, li, li] // 全部的li console.log(document.querySelectorAll('li')); //className名为box下的li var allLis = document.querySelectorAll("ul.box li"); console.log(allLis);
5).操作元素结构上的属性
天生自带的和自定义的
-
设置:元素节点.setAttribute(attr,val);
-
获取:元素节点.getAttribute(attr);
-
移除:元素节点.removeAttribute(attr);
// 操作元素结构上的属性(天生自带的和自定义的) var div = document.querySelector("div"); // 设置 // 元素节点.setAttribute(attr,val); div.setAttribute("class", "box"); div.setAttribute("id", "myBox"); div.setAttribute("hello", "哈喽"); div.setAttribute("trueSrc", "./img/2.jpg"); // 获取 // 元素节点.getAttribute(attr); console.log(div.getAttribute("id")); console.log(div.getAttribute("trueSrc")); console.log(div.getAttribute("hello")); // 移除 // 元素节点.removeAttribute(attr); document.onclick = function () { div.removeAttribute("id"); div.removeAttribute("class"); div.removeAttribute("trueSrc"); }
案例:发送验证码状态
ody> <button>发送验证码</button> <script> // 获取元素 var btn = document.querySelector("button"); // 绑定事件 btn.onclick = function(){ //点击禁用按钮 this.setAttribute("disabled","disabled"); // 重新赋值 this.innerHTML = "5秒钟后重新发送"; var n = 5; // 设置定时器 将定时器的返回值保存到自定义属性timer this.timer = setInterval(function(){ // this->window // n自身减1 n--; // 重新赋值 btn.innerHTML = n+"秒钟后重新发送"; // n的值是0 if(n===0){ // 清除定时器 clearInterval(btn.timer); // 重新赋值 btn.innerHTML = "发送验证码"; // 移除disabled属性 btn.removeAttribute("disabled"); } },1000); } </script>
这篇关于JavaScript DOM的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-15JavaMailSender是什么,怎么使用?-icode9专业技术文章分享
- 2024-11-15JWT 用户校验学习:从入门到实践
- 2024-11-15Nest学习:新手入门全面指南
- 2024-11-15RestfulAPI学习:新手入门指南
- 2024-11-15Server Component学习:入门教程与实践指南
- 2024-11-15动态路由入门:新手必读指南
- 2024-11-15JWT 用户校验入门:轻松掌握JWT认证基础
- 2024-11-15Nest后端开发入门指南
- 2024-11-15Nest后端开发入门教程
- 2024-11-15RestfulAPI入门:新手快速上手指南