DOM 是 Document Object Model(文档对象模型)的缩写。下面是MDN对DOM的解释:
文档对象模型 (DOM) 是HTML和XML文档的编程接口。它提供了对文档的结构化的表述,并定义了一种方式可以使从程序中对该结构进行访问,从而改变文档的结构,样式和内容。 DOM 将文档解析为一个由节点和对象(包含属性和方法的对象)组成的结构集合。简言之,它会将web页面和脚本或程序语言连接起来。
上图就是为了表示通过DOM树可以通过一个标签找到跟他有关系的任何一个标签
DOM作用:
就是为了操作HTML中的元素,使得网页被下载到浏览器后改变网页内容成为可能
准备工作:
<div class="d1">d1 <div id="d2">d2 <p id="p1">p1</p> <span id="s1">span1</span> </div> </div>
前缀关键字:document 基本查找用法: 根据ID获取一个标签:document.getElementById('id') 根据class属性获取:document.getElementsByClassName('class') 根据标签名获取标签合集:document.getElementsByTagName('标签名')
注意
:涉及到DOM操作的JS代码应该放在文档的哪个位置。
# 我们看上图出现的现象,在通过DOM操作查找标签的时候,并没有查找到。 原因:这是因为在html代码体中,执行顺序是从上到下的,所以先执行的为script标签中的代码,这时查找的话,系统还没有找到下面的id='d2'的标签,认为就没有,所以就返回为null 解决:所以我们在写js代码时需要注意: 如果我们的js代码需要页面上某个标签加载完毕,那么该js代码应该写在body内部最下方或者引入外部js文件。
补充:
1、可通过变量名来接收标签查找的结果,通常以后缀为Ele为结束字符来命名。 eg: var divEle = document.getElementsByTagName('div'); 2、在通过类属性或标签名查找标签时返回结果为一个数组,可直接通过索引的方式定义所需要的标签 eg:var pEle = document.getElementsByTagName('p')[0]; // 找到索引为0的p标签
核心查找用法:
parentElement 父节点标签元素 children 所有子标签 firstElementChild 第一个子标签元素 lastElementChild 最后一个子标签元素 nextElementSibling 下一个兄弟标签元素 previousElementSibling 上一个兄弟标签元素
用法实例:
var div1Ele = document.getElementsByClassName('d1')[0]; // 通过class找到第一个div标签 var div2Ele = document.getElementById('d2'); // 通过id找到第二个div标签 var pEle = document.getElementsByTagName('p')[0]; // 通过标签名找到p标签
// js是可以动态改变html的文档内容的,但只是动态修改,未保存。 // 创建标签 关键字:createElement eg : var aEle = document.createElement('a'); // 创建一个a标签 // 添加属性 关键字:setAttribute // 如果是默认属性的话可直接通过(.)的方式添加 eg :aEle = setAttribute('href','https://www.mmzztt.com/') //获取属性 关键字:getAttribute eg :aEle.getAttribute('href') // 获取a标签的href属性 // 插入文本 关键字:innerText eg :aEle.innerText = '点我有你好看'; // 动态添加:(添加到指定标签后) 关键字:appendchild eg :document.getElementsByTagName('p')[0].appendChild(aEle) // 添加在p标签后
补充:
innerText 不加赋值符号是获取内部文本 加了赋值符号是设置内置文本 // 不可以识别HTML标签 innerHTML 不加赋值符号是获取内部标签+文本 加了赋值符号是设置内置标签+文本 // 可以识别HTML标签
// 普通文数据获取 格式:标签对象.value // 特殊文件数据获取 标签对象.value // 仅仅获取一个文件地址而已 获取真正的文件对象格式:标签对象.files[0] // 获取单个文件数据 标签对象.files // 获取多个文件数据
实例:
准备工作: <form action=""> <p>username: <input type="text" id="d1"> </p> <p>files: <input type="file" id="d2" multiple> </p> </form>
准备工作: // html: <body> <div id='d1' class="c1 c2 c3"></div> </body> // css: <style> .c1 { width: 200px; height: 200px; border-radius: 50%; } .c2 { background-color: darkgray; } .c3 { background-color: yellow; } </style>
classList 查看所有的类 classList.remove(cls) 删除指定类 classList.add(cls) 添加类 classList.contains(cls) 存在返回true,否则返回false classList.toggle(cls) 存在就删除,否则添加
实例:
// 删除c3类 divEle.classList.remove('c3'); // 颜色由黄色变为灰色 (模拟灯泡)
// 添加c3类 divEle.classList.add('c3'); // 颜色再次变为了黄色
divEle.classList.contains('c3'); true divEle.classList.contains('c4'); false divEle.classList.toggle('c3');
格式:标签对象.style.属性名='属性值'
1.对于没有中横线的CSS属性一般直接使用style.属性名即可。如:
obj.style.margin obj.style.width obj.style.left obj.style.position
2.对含有中横线的CSS属性,将中横线后面的第一个字母换成大写即可。如:
obj.style.marginTop obj.style.borderLeftWidth obj.style.zIndex obj.style.fontFamily
HTML 4.0 的新特性之一是有能力使 HTML 事件触发浏览器中的动作(action),比如当用户点击某个 HTML 元素时启动一段 JavaScript。下面是一个属性列表,这些属性可插入 HTML 标签来定义事件动作。
常用事件:
onclick 当用户点击某个对象时调用的事件句柄。 ondblclick 当用户双击某个对象时调用的事件句柄。 onfocus 元素获得焦点。 // 练习:输入框 onblur 元素失去焦点。 应用场景:用于表单验证,用户离开某个输入框时,代表已经输入完了,我们可以对它进行验证. onchange 域的内容被改变。 应用场景:通常用于表单元素,当元素内容被改变时触发.(select联动) onkeydown 某个键盘按键被按下。 应用场景: 当用户在最后一个输入框按下回车按键时,表单提交. onkeypress 某个键盘按键被按下并松开。 onkeyup 某个键盘按键被松开。 onload 一张页面或一幅图像完成加载。 onmousedown 鼠标按钮被按下。 onmousemove 鼠标被移动。 onmouseout 鼠标从某元素移开。 onmouseover 鼠标移到某元素之上。 onselect 在文本框中的文本被选中时发生。 onsubmit 确认按钮被点击,使用的对象是form。
实例:
<body> <button onclick="func()">点我1111</button> <button id="d1">点我2222</button> <script> // 方式一: function func(){ alert('方式一弹') } // 方式二(推荐): // 查找标签 var btnEle = document.getElementById('d1') // 绑定事件 btnEle.ondblclick = function (){ alert('方式二弹') } </script> </body>
// this指代的就是当前被操作对象本身 在事件的函数体代码内部使用 btnEle.onclick = function () { alert(456) console.log(this) } 也可以直接使用this方法去操作标签: eg: btnEle.onclick = function () { alert(456) console.log(this) this.innerText('点我3333') }
实例一:动态时间
需求:创建一个开始和暂停按钮,实现一个动态时间,点击暂停暂停时间,点击开始继续动态运作。 代码块: <body> <input type="text" id="i1"> <button id = 't1'>开始</button> <button id = 't2'>暂停</button> <script> var btnEle = document.getElementById('t1') // 查询标签开始按钮 var btn2Ele = document.getElementById('t2') // 查询标签暂停按钮 var t = null // 定义全局变量t function showtime(){ // 定义展示时间的函数 var time = new Date().toLocaleString() // 定义新的时间对象并格式化展示 var inputEle = document.getElementById('i1') //潮汛标签inout框 inputEle.value = time // 将时间对象添加给value属性 } btnEle.onclick = function (){ // 定义事件:单击开始按钮事件 if(!t){ // 判断是否已经创建了定时任务(如果这里不判段的话,连续点击开始就无法暂停) t = setInterval(showtime,1000) // 创建定时任务(每一秒执行一次showtime函数) } } btn2Ele.onclick = function (){ // 定义事件:单击暂停按钮事件 clearInterval(t) // 清除定时任务 t = null // 重置全局变量(不重置的话再次点击开始按钮是无法执行的,定时任务判断为flase) } </script> </body>
示例二:校验用户名密码
需求:在输入用户名和密码为空时,会提示不能为空。 <body> <p>username: <input type="text" id="i1"> <span id="p1"></span> </p> <p>password: <input type="password" id="i2"> <span id="p2"></span> </p> <button id="b1">登录</button> <script> var i1ELe = document.getElementById('i1') // 查询标签input用户名 var i2Ele = document.getElementById('i2') // 查询标签input密码 var butEle = document.getElementById('b1') // 查询标签button登录按钮 var span1Ele = document.getElementById('p1') // 提示信息span1 var span2Ele = document.getElementById('p2') // 提示信息span2 butEle.onclick = function (){ // 创建事件:单击按钮事件 if(i1ELe.value===''){ // 如果input用户名框数据为空 span1Ele.innerText = '输入账号不能为空' // span1标签添加文本 span1Ele.style.color = 'red' // 添加文本样式:字体颜色 span1Ele.style.fontSize = '12px' // 字体大小 } if(i2Ele.value===''){ span2Ele.innerText = '输入密码不能为空' // span2标签提示 span2Ele.style.color = 'red' span2Ele.style.fontSize = '12px' } } i1ELe.onfocus = function (){ // input1创建事件:聚焦事件 span1Ele.innerText = '' // span1标签文本数据改为空 } i2Ele.onfocus = function (){ // input2创建事件:聚焦事件 span2Ele.innerText = '' // span2标签文本数据改为空 } </script> </body>