JavaScript-DOM(上)

DOM

文档:一个页面就是一个文档,DOM中使用document表示

元素:页面中所有的标签都是元素,DOM中使用element表示

结点:网页中所有的内容都是结点(标签、属性、文档、注释等),DOM中使用node表示

DOM把以上内容都看做是对象

 

HTML DOM Document 对象

文档对象代表您的网页。

如果您希望访问 HTML 页面中的任何元素,那么您总是从访问 document 对象开始。

下面是一些如何使用 document 对象来访问和操作 HTML 的实例。

查找 HTML 元素

方法描述
document.getElementById(id) 通过元素 id 来查找元素
document.getElementsByTagName(name) 通过标签名来查找元素
document.getElementsByClassName(name) 通过类名来查找元素

改变 HTML 元素

方法描述
element.innerHTML = new html content 改变元素的 inner HTML
element.attribute = new value 改变 HTML 元素的属性值
element.setAttribute(attribute, value) 改变 HTML 元素的属性值
element.style.property = new style 改变 HTML 元素的样式

添加和删除元素

方法描述
document.createElement(element) 创建 HTML 元素
document.removeChild(element) 删除 HTML 元素
document.appendChild(element) 添加 HTML 元素
document.replaceChild(element) 替换 HTML 元素
document.write(text) 写入 HTML 输出流

添加事件处理程序

方法描述
document.getElementById(id).onclick = function(){code} 向 onclick 事件添加事件处理程序

查找 HTML 对象

首个 HTML DOM Level 1 (1998),定义了 11 个 HTML 对象、对象集合和属性。它们在 HTML5 中仍然有效。

后来,在 HTML DOM Level 3,加入了更多对象、集合和属性。

属性描述DOM
document.anchors 返回拥有 name 属性的所有 <a> 元素。 1
document.applets 返回所有 <applet> 元素(HTML5 不建议使用) 1
document.baseURI 返回文档的绝对基准 URI 3
document.body 返回 <body> 元素 1
document.cookie 返回文档的 cookie 1
document.doctype 返回文档的 doctype 3
document.documentElement 返回 <html> 元素 3
document.documentMode 返回浏览器使用的模式 3
document.documentURI 返回文档的 URI 3
document.domain 返回文档服务器的域名 1
document.domConfig 废弃。返回 DOM 配置 3
document.embeds 返回所有 <embed> 元素 3
document.forms 返回所有 <form> 元素 1
document.head 返回 <head> 元素 3
document.images 返回所有 <img> 元素 1
document.implementation 返回 DOM 实现 3
document.inputEncoding 返回文档的编码(字符集) 3
document.lastModified 返回文档更新的日期和时间 3
document.links 返回拥有 href 属性的所有 <area><a> 元素 1
document.readyState 返回文档的(加载)状态 3
document.referrer 返回引用的 URI(链接文档) 1
document.scripts 返回所有 <script> 元素 3
document.strictErrorChecking 返回是否强制执行错误检查 3
document.title 返回 <title> 元素 1
document.URL 返回文档的完整 URL 1
1、事件三要素
<button id="btn">唐伯虎</button>
<script>
   //点击一个按钮,弹出对话框
   // 1、事件是有三部分组成 事件源 事件类型 事件处理程序
   // (1)事件源 事件被触发的对象 ——按钮
   let btn = document.getElementById('btn');
   // (2)事件类型 如何触发 什么事件 比如鼠标点击(onclick)还是鼠标经过 还是键盘按下
   // (3)事件处理程序 通过一个函数赋值的方式 完成
   btn.onclick = function () {
       alert("点蚊香");
  }
</script>
2、执行事件的步骤
<div>123</div>
<script>
   // 执行事件步骤
   // 点击 div 控制台输出 我是张三疯,打钱!!!
   // 1、获取事件源
   let div = document.querySelector('div');
   // 2、绑定事件 注册事件
   // div.onclick
   // 3、添加事件处理程序(采取函数赋值形式)
   div.onclick = function () {
       console.log("我是张三疯,打钱!!!");
  }
</script>
3、操作元素 —innerText(innerHTML)
//element.innerText
//从起始位置到终止位置的内容,但它去除html标签,同时空格和换行也会去掉
//element.innerHTML
//从起始位置到终止位置的全部内容,包括html标签,同时保留空格和行
<button>显示当前系统事件</button>
<div>某个事件</div>
<p></p>
<script>
   // 当我们点击了按钮,div里面的文字会发生变化
   // 1、获取元素
   let btn = document.querySelector('button');
   let div = document.querySelector('div');
   // 2、注册事件
   btn.onclick = function () {
       div.innerText = getDate();
  }
   function getDate() {
       let date = new Date();
       let year = date.getFullYear();
       let month = date.getMonth()+1;
       let dates = date.getDate();
       let day = date.getDay();
       let hours = date.getHours();
       let minutes = date.getMinutes();
       let seconds = date.getSeconds();
       let arr = ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'];
       return "现在是:"+year+'年'+month+'月'+dates+'日 '+hours+':'+minutes+':'+seconds+' '+arr[day];
  }
   // 不添加事件直接修改页面内容
   let p = document.querySelector('p');
   p.innerText = getDate();
</script>

结果:显示当前系统事件
现在是:2022年2月26日 23:32:25 星期六
现在是:2022年2月26日 23:32:24 星期六
4、操作元素—修改元素属性
<button id="ej">蓝牙耳机</button>
<button id="sh">手环</button>
<div>
   <img src="images/ej.png" alt="" title="蓝牙耳机">
</div>

<script>
   let ej = document.getElementById('ej');
   let sh = document.getElementById('sh');
   let img = document.querySelector('img');
   ej.onclick = function () {
       img.src = "images/ej.png";
       ej.title = "蓝牙耳机";
  }
   sh.onclick = function () {
       img.src = "images/sh.png";
       ej.title = "手环";
  }
</script>
5、分时问候案例
<img src="images/sw.gif" title="上午" alt="" width="240">
<div><strong>上午好!</strong></div>
<script>
   let img = document.querySelector('img');
   let ch = document.querySelector('div');
   let date = new Date();
   let hours = date.getHours();
   if (hours < 12){
       img.src = "images/sw.gif";
       img.title = "早上";
       ch.innerText = "早上好!!";
  }else if(hours < 18){
       img.src = "images/xw.gif";
       img.title = "下午";
       ch.innerText = "下午好!!";
  }else {
       img.src = "images/ws.gif";
       img.title = "晚上";
       ch.innerText = "晚上好!!";
  }
   console.log(hours);

</script>
6、修改表单元素
<button>按钮</button>
<input type="text" value="">
<script>
   //1 、获取元素
   let btn = document.querySelector('button');
   let ch = document.querySelector('input');
   // 2、注册事件 处理程序
   btn.onclick = function () {
       ch.value = "按钮被点击了!";
       this.disabled = true;
       // this 指向的是事件函数的调研者 btn
  }

</script>
7、显示和隐藏密码
<div class="box">
   <input type="password" name="" id="pwd">
   <label>
       <img src="images/1.png" id="eye">
   </label>
</div>
<script>
   let eye = document.getElementById('eye');
   let pwd = document.getElementById('pwd');
   let flag = 0;
   eye.onclick = function () {
       if (flag == 0){
           eye.src = "images/1.png";
           pwd.type = 'text';
           flag = 1;
      }else {
           eye.src = "images/2.png";
           pwd.type = 'password';
           flag = 0;
      }

  }
</script>
8、样式属性操作(点击div更改div背景颜色和宽度)
1、JS里面的样式采取驼峰命名法 比如 fontSize、backgroundColor
2、JS修改style 样式操作,产生的是行内样式,css权重比较高

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>Title</title>
   <style>
       div{
           background: pink;
           width: 200px;
           height: 200px;
      }
   </style>

</head>
<body>
   <div></div>
   <script>
       let div = document.querySelector('div');
       div.onclick = function () {
           this.style .backgroundColor = 'purple';
           this.style.width = '400px';
           this.style.height = '400px';
      }
   </script>
</body>
</html>
9、点击x隐藏二维码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.box{
position: relative;
margin: 100px auto;
background: pink;
width: 200px;
height: 200px;
text-align: center;
}
.box p{
text-align: center;
position: absolute;
top: 70px;
right: 43px;
}
.box i{
position: absolute;
width: 30px;
height: 30px;
text-align: center;
font-size: 17px;
left: -30px;
cursor: pointer;
border: 1px solid #ccc;
}
</style>

</head>
<body>
<div class="box">
<p><strong>我是淘宝二维码</strong></p>
<i class="close-btn"><strong>x</strong></i>
</div>
<script>
let box = document.querySelector('.box');
let btn = document.querySelector('.close-btn');
btn.onclick = function () {
box.style.display = 'none';
}

</script>
</body>
</html>

image-20220227163053601

10、显示隐藏文本框内容
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
input{
color: #999;
}
</style>
</head>
<body>
<input type="text" value="手机">
<script>
let text = document.querySelector('input');
//获取焦点事件 onfocus
text.onfocus = function () {
if (this.value === '手机'){
this.value = '';
}
//获取焦点之后文字颜色变深
this.style.color = '#333';
}
//失去焦点事件
text.onblur = function () {
if (this.value === ''){
this.value = '手机';
}
//获取焦点之后文字颜色变浅
this.style.color = '#999';
}
</script>
</body>
</html>

image-20220227174602336

11、className(密码框验证信息)
1、如果样式修改较多,可以采取操作类名的方式更改元素样式
2、class因为是个保留字,因此使用className来操作元素类名属性
3、className会直接更改元素的类名,会覆盖原先的类名
4、如果想保留原先的类名,我们可以选择多类名选择器
this.className = 'first change';
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.box{
margin:100px auto;
width: 600px;
}
.message{
display: inline-block;
padding-left: 25px;
background: url("images/message.png") no-repeat left center;
}
.error{
color: red;
background-image: url("images/error.png");
}
.right{
color: green;
background-image: url("images/right.png");
}
</style>
</head>
<body>
<div class="box">
<input type="password" class="ipt">
<p class="message">请输入6~16位的密码</p>
</div>
<script>
let ipt = document.querySelector('.ipt');
let message = document.querySelector('.message');
ipt.onblur = function () {
if (this.value.length < 6 || this.value.length > 16){
message.innerHTML = "你输入的不正确,请重新输入6~16位的密码!";
message.className = 'message error';
}else {
message.innerHTML = "可用!";
message.className = 'message right'
}
}
</script>

</body>
</html>

image-20220227185813242

image-20220227185845102

image-20220227190213311

12、总结

image-20220227190122502

13、用户名密码显示和隐藏内容
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.box{
margin: 100px auto;
width: 450px;
}
.onfocus{
border: pink 1px solid;
color: #eaaab5;

}
.onblur{
color: #999;
}
input{
color: #999;
width: 140px;
}
</style>
</head>
<body>
<div class="box">
<input type="text" class="uname" value="邮箱/ID/手机号">
<input type="text" class="pwd" value="密码">
<button class="btn">登录</button>
</div>

<script>
let uname = document.querySelector('.uname');
let pwd = document.querySelector('.pwd');
uname.onfocus = function () {
if (this.value === '邮箱/ID/手机号'){
this.value = '';
this.className = 'onfocus uname';
}
}
pwd.onfocus = function () {
if (this.value === '密码'){
this.value = '';
this.type = 'password';
this.className = 'onfocus pwd';
}
}

uname.onblur = function(){
if (this.value === ''){
this.value = '邮箱/ID/手机号';
this.className = 'onblur uname';
}
}
pwd.onblur = function () {
if (this.value === ''){
this.value = '密码';
this.type = 'text';
this.className = 'onblur pwd';
}
}
</script>
</body>
</html>

image-20220227194942493

image-20220227195004031

14、京东关闭广告
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.box{
margin: 0px;
position: absolute;

width: 100%;
height: 200px;
}
#gg{
position: relative;
margin: 65px auto;
text-align: center;
font-size: 40px;
}
#x{
width: 27px;
height: 27px;
position: absolute;
right: 10px;
font-size: 20px;
text-align: center;
cursor: pointer;

}
</style>
</head>
<body>
<div class="box">
<div id="x">x</div>
<div id="gg"><span>我是广告</span></div>
</div>

<script>
let box = document.querySelector('.box');
let x = document.getElementById('x');
x.onclick = function () {
box.style.display = 'none';
}
</script>

</body>
</html>

image-20220227201706243

15、一键开关灯
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<button>开关灯</button>
<script>
let btn = document.querySelector('button');
let flag = 0;
btn.onclick = function () {
if (flag === 0){
document.body.style.backgroundColor = 'white';
flag = 1;
}else {
document.body.style.backgroundColor = 'black';
flag = 0;
}
}
</script>
</body>
</html>
16、排他思想
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<button>按钮</button>
<button>按钮</button>
<button>按钮</button>
<button>按钮</button>
<button>按钮</button>

<script>
// 1、获取所有按钮元素
let btns = document.getElementsByTagName('button');
// btns得到的是伪数组 里面每一个元素 btns[i]
for (let i = 0;i < btns.length;i++){
btns[i].onclick = function () {
// (1)先把所有按钮的背景颜色去掉
for (let i = 0;i < btns.length;i++){
btns[i].style.backgroundColor = '';
}
// (2)然后才把当前的元素背景改为yellow
this.style.backgroundColor = 'yellow';
}
}
// 2、首先先排除其他人,然后才设置自己的样式
</script>
</body>
</html>

image-20220227232914157

17、表格隔行变色
<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
table {
width: 800px;
margin: 100px auto;
text-align: center;
border-collapse: collapse;
font-size: 14px;
}

thead tr {
height: 30px;

}

tbody tr {
height: 30px;
}

tbody td {
border-bottom: 1px solid #d7d7d7;
font-size: 12px;
color: blue;
}

.bg {

}
</style>
</head>

<body>
<table>
<thead>
<tr>
<th>代码</th>
<th>名称</th>
<th>最新公布净值</th>
<th>累计净值</th>
<th>前单位净值</th>
<th>净值增长率</th>
</tr>
</thead>
<tbody>
<tr>
<td>003526</td>
<td>农银金穗3个月定期开放债券</td>
<td>1.075</td>
<td>1.079</td>
<td>1.074</td>
<td>+0.047%</td>
</tr>
<tr>
<td>003526</td>
<td>农银金穗3个月定期开放债券</td>
<td>1.075</td>
<td>1.079</td>
<td>1.074</td>
<td>+0.047%</td>
</tr>
<tr>
<td>003526</td>
<td>农银金穗3个月定期开放债券</td>
<td>1.075</td>
<td>1.079</td>
<td>1.074</td>
<td>+0.047%</td>
</tr>
<tr>
<td>003526</td>
<td>农银金穗3个月定期开放债券</td>
<td>1.075</td>
<td>1.079</td>
<td>1.074</td>
<td>+0.047%</td>
</tr>
<tr>
<td>003526</td>
<td>农银金穗3个月定期开放债券</td>
<td>1.075</td>
<td>1.079</td>
<td>1.074</td>
<td>+0.047%</td>
</tr>
<tr>
<td>003526</td>
<td>农银金穗3个月定期开放债券</td>
<td>1.075</td>
<td>1.079</td>
<td>1.074</td>
<td>+0.047%</td>
</tr>
</tbody>
</table>
<script>
let trs = document.querySelector('tbody').querySelectorAll('tr');
for (let i = 0; i < trs.length;i++){
trs[i].onmouseout = function(){
this.className= '';
}
trs[i].onmouseover = function () {
this.className = 'bg';
}
}
</script>
</body>

</html>

image-20220228162811241

18、全选反选
<!DOCTYPE html>
<html>

<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
* {
padding: 0;
margin: 0;

}
.wrap {
width: 300px;
margin: 100px auto 0;
}

table {
border-collapse: collapse;
border-spacing: 0;
border: 1px solid #c0c0c0;
width: 300px;
}

th,
td {
border: 1px solid #d0d0d0;
color: #404060;
padding: 10px;
}

th {

font: bold 16px "微软雅黑";
color: #fff;
}

td {
font: 14px "微软雅黑";
}

tbody tr {

}

tbody tr:hover {
cursor: pointer;

}
</style>

</head>

<body>
<div class="wrap">
<table>
<thead>
<tr>
<th>
<input type="checkbox" id="j_cbAll" />
</th>
<th>商品</th>
<th>价钱</th>
</tr>
</thead>
<tbody id="j_tb">
<tr>
<td>
<input type="checkbox" />
</td>
<td>iPhone8</td>
<td>8000</td>
</tr>
<tr>
<td>
<input type="checkbox" />
</td>
<td>iPad Pro</td>
<td>5000</td>
</tr>
<tr>
<td>
<input type="checkbox" />
</td>
<td>iPad Air</td>
<td>2000</td>
</tr>
<tr>
<td>
<input type="checkbox" />
</td>
<td>Apple Watch</td>
<td>2000</td>
</tr>

</tbody>
</table>
</div>
<script>
let j_cbAll = document.getElementById('j_cbAll');
let j_tbs = document.getElementById('j_tb').querySelectorAll('input');
j_cbAll.onclick = function () {
for (let i = 0;i < j_tbs.length;i++){
j_tbs[i].checked = this.checked;
}
}
for (let i = 0;i < j_tbs.length; i++){
j_tbs[i].onclick = function () {
}
</script>
</body>

</html>
19、自定义属性的操作(Attribute('属性'))
// 1.获取属性值
element.属性 获取属性值
element.getAttribute('属性');

// 2.设置属性值
element.属性 = '值' 设置内置属性值
element.setAttribute('属性','值');

// 3.移除属性
element.removeAttribute('属性');

//区别:
element.属性 内置属性(元素本身自带的属性)
element.get(set)Attribute('属性');主要获得(设置)自定义属性(标准),我们程序员自定义的属性

//H5自定义规范
<div getTime="20" data-index="2" data-list-name="andy"></div>
<script>
let div = document.querySelector('div');
// console.log(div.getTime);
console.log(div.getAttribute('getTime'));
div.setAttribute('data-time', 20);
console.log(div.getAttribute('data-index'));
console.log(div.getAttribute('data-list-name'));
// h5新增的获取自定义属性的方法 它只能获取data-开头的
// dataset 是一个集合里面存放了所有以data开头的自定义属性
console.log(div.dataset);
console.log(div.dataset.index);
console.log(div.dataset['index']);
// 如果自定义属性里面有多个-链接的单词,我们获取的时候采取 驼峰命名法
console.log(div.dataset.listName);
console.log(div.dataset['listName']);
20、tab栏切换
<!DOCTYPE html>
<html lang="en">

<head>
   <meta charset="UTF-8">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <meta http-equiv="X-UA-Compatible" content="ie=edge">
   <title>Document</title>
   <style>
      * {
           margin: 0;
           padding: 0;
      }
       
       li {
           list-style-type: none;
      }
       
       .tab {
           width: 978px;
           margin: 100px auto;
      }
       
       .tab_list {
           height: 39px;
           border: 1px solid #ccc;
           background-color: #f1f1f1;
      }
       
       .tab_list li {
           float: left;
           height: 39px;
           line-height: 39px;
           padding: 0 20px;
           text-align: center;
           cursor: pointer;
      }
       
       .tab_list .current {
           background-color: #c81623;
           color: #fff;
      }
       
       .item_info {
           padding: 20px 0 0 20px;
      }
       
       .item {
           display: none;
      }
   </style>
</head>

<body>
   <div class="tab">
       <div class="tab_list">
           <ul>
               <li class="current">商品介绍</li>
               <li>规格与包装</li>
               <li>售后保障</li>
               <li>商品评价(50000)</li>
               <li>手机社区</li>
           </ul>
       </div>
       <div class="tab_con">
           <div class="item" style="display: block;">
              商品介绍模块内容
           </div>
           <div class="item">
              规格与包装模块内容
           </div>
           <div class="item">
              售后保障模块内容
           </div>
           <div class="item">
              商品评价(50000)模块内容
           </div>
           <div class="item">
              手机社区模块内容
           </div>

       </div>
   </div>
   <script>
       // 获取元素
       var tab_list = document.querySelector('.tab_list');
       var lis = tab_list.querySelectorAll('li');
       var items = document.querySelectorAll('.item');
       // for循环绑定点击事件
       for (var i = 0; i < lis.length; i++) {
           // 开始给5个小li 设置索引号
           lis[i].setAttribute('index', i);
           lis[i].onclick = function() {
               // 1. 上的模块选项卡,点击某一个,当前这一个底色会是红色,其余不变(排他思想) 修改类名的方式

               // 干掉所有人 其余的li清除 class 这个类
               for (var i = 0; i < lis.length; i++) {
                   lis[i].className = '';
              }
               // 留下我自己
               this.className = 'current';
               // 2. 下面的显示内容模块
               var index = this.getAttribute('index');
               console.log(index);
               // 干掉所有人 让其余的item 这些div 隐藏
               for (var i = 0; i < items.length; i++) {
                   items[i].style.display = 'none';
              }
               // 留下我自己 让对应的item 显示出来
               items[index].style.display = 'block';
          }
      }
   </script>
</body>

</html>

image-20220228204603982

 

posted @ 2022-03-02 18:48  小鹅爸爸  阅读(42)  评论(0编辑  收藏  举报