API
API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
- 简单理解: API 是给程序员提供的一种工具,以便能更轻松的实现想要完成的功能。
- Web API 是浏览器提供的一套操作浏览器功能和页面元素的 API ( BOM 和 DOM )。
- Web API 主要是针对于浏览器提供的接口,主要针对于浏览器做交互效果。
- Web API 一般都有输入和输出(函数的传参和返回值),Web API 很多都是方法(函数)
获取元素
getElementById获取元素
// 1. 因为我们文档页面从上往下加载,所以先得有标签 所以我们script写到标签的下面
// 2. get 获得 element 元素 by 通过 驼峰命名法
// 3. 参数 id是大小写敏感的字符串
// 4. 返回的是一个元素对象
var timer = document.getElementById('time');
console.log(timer);
console.log(typeof timer);
// 5. console.dir 打印我们返回的元素对象 更好的查看里面的属性和方法
console.dir(timer);
根据标签名获取元素
使用
getElementsByTagName()方法可以返回带有指定标签名的对象的集合。
<ul> <li>ul</li> <li>ul</li> <li>ul</li> </ul> <ol id="ol"> <li>ol</li> <li>ol</li> <li>ol</li> </ol> <script> var ul = document.getElementsByTagName('li') console.log(ul); // 获取ol里的li三种方法 // 1. var ol = document.getElementsByTagName('ol') //得到的是ol的伪数组容器 console.log(ol[0].getElementsByTagName('li')); // 2. var ol = document.getElementsByTagName('ol')[0] var olLis = ol.getElementsByTagName('li') console.log(olLis); // 3.就是给ol标签添加id选择器 var ol1 = document.getElementById('ol') console.log(ol.getElementsByTagName('li'));注意:
- 如果页面中只有一个li 返回的还是伪数组的形式
- 如果页面中没有这个元素 返回的是空的伪数组的形式
- element.getElementsByTagName('标签名'); 父元素必须是指定的单个元素
H5新增的方法获取
1.getElementsByClassName 根据类名获得某些元素集合
<body>
<div class="box">盒子1</div>
<div class="box">盒子2</div>
<div id="nav">
<ul>
<li>首页</li>
<li>产品</li>
</ul>
</div>
<script>
// 1. getElementsByClassName 根据类名获得某些元素集合
var boxs = document.getElementsByClassName('box');
console.log(boxs);
2.querySelector 返回指定选择器的第一个元素对象
// 2. querySelector 返回指定选择器的第一个元素对象 切记 里面的选择器需要加符号 类选择器要加.box id选择器要加#nav
var firstBox = document.querySelector('.box');
console.log(firstBox);
var nav = document.querySelector('#nav');
console.log(nav);
var li = document.querySelector('li');
console.log(li);
3.querySelectorAll()返回指定选择器的所有元素对象集合
// 3. querySelectorAll()返回指定选择器的所有元素对象集合
var allBox = document.querySelectorAll('.box');
console.log(allBox);
var lis = document.querySelectorAll('li');
console.log(lis);
</script>
</body>
4.根据css选择器获取元素
<body>
<ul>
<li>ul1</li>
<li>ul2</li>
<li>ul3</li>
</ul>
<ol id="ol">
<li id="li">ol1</li>
<li>ol2</li>
<li>ol3</li>
</ol>
<script>
// 根据css选择器获取单个元素
var box = document.querySelector('ul li:first-child')
// 获取ul里第三个li
var box2 = document.querySelector('ul li:nth-child(3)')
var box1 = document.querySelector('#li')
console.log(box);
console.log(box1);
console.log(box2);
// 根据css选择器获取多个元素(伪数组)
var olLis = document.querySelectorAll('ol > li')
var lis = document.querySelectorAll('li')
console.log(olLis);
console.log(lis);
</script>
</body>
分别利用css选择器和索引获取元素
<body>
<ol>
<li>1</li>
<li>2</li>
<li>3</li>
</ol>
<ol>
<li>11</li>
<li>22</li>
<li>33</li>
</ol>
<script>
//利用css选择器获取第二个ol
var olLis = document.querySelector('ol:nth-child(2)')
// 利用索引获取第二个ol
var olLis1 = document.getElementsByTagName('ol')[1]
console.log(olLis);
console.log(olLis1);
</script>
</body>
快速获取html
console.log(document.documentElement);
快速获取body
console.log(document.body);\
事件基础
- 事件源(谁):触发事件的元素
- 事件类型(什么事件): 例如 click 点击事件
- 事件处理程序(做啥):事件触发后要执行的代码(函数形式),事件处理函数
案例代码
<body> <button id="btn">唐伯虎</button> <script> // 点击一个按钮,弹出对话框 // 1. 事件是有三部分组成 事件源 事件类型 事件处理程序 我们也称为事件三要素 //(1) 事件源 事件被触发的对象 谁 按钮 var btn = document.getElementById('btn'); //(2) 事件类型 如何触发 什么事件 比如鼠标点击(onclick) 还是鼠标经过 还是键盘按下 //(3) 事件处理程序 通过一个函数赋值的方式 完成 btn.onclick = function() { alert('点秋香'); } </script> </body> <body> <button class="btn">点击</button> <script> // 1.获取事件元素 var btn = document.querySelector('.btn') // 2.注册事件 btn.onclick = function() { this.style.backgroundColor = 'red' //点击后执行按钮背景颜色变红色 // 3.点击按按钮时执行该函数 console.log('你好'); } </script> </body>
执行事件的步骤
- 获取事件源(获取元素)
- 绑定事件(注册事件)
- 添加事件处理程序
案列代码:
<body> <div>123</div> <script> // 执行事件步骤 // 点击div 控制台输出 我被选中了 // 1. 获取事件源 var div = document.querySelector('div'); // 2.绑定事件 注册事件 // div.onclick // 3.添加事件处理程序 div.onclick = function() { console.log('我被选中了'); } </script> </body>
改变元素内容(获取或设置)
1.innerText改变元素内容
<style>
div,
p {
width: 300px;
height: 30px;
line-height: 30px;
color: #fff;
background-color: pink;
}
</style>
</head>
<body>
<button>显示当前系统时间</button>
<div>某个时间</div>
<p>1123</p>
<script>
// 当我们点击了按钮, div里面的文字会发生变化
// 1. 获取元素
var btn = document.querySelector('button');
var div = document.querySelector('div');
// 2.注册事件
btn.onclick = function() {
// div.innerText = '2019-6-6';
div.innerHTML = getDate();
}
function getDate() {
var date = new Date();
// 我们写一个 2019年 5月 1日 星期三
var year = date.getFullYear();
var month = date.getMonth() + 1;
var dates = date.getDate();
var arr = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
var day = date.getDay();
return '今天是:' + year + '年' + month + '月' + dates + '日 ' + arr[day];
}
// 我们元素可以不用添加事件
var p = document.querySelector('p');
p.innerHTML = getDate();
</script>
</body>
innerText和innerHTML的区别
- 获取内容时的区别:
innerText 会去除空格和换行,而innerHTML 会保留空格和换行
- 设置内容时的区别:
innerText不会识别html,而innerHTML会识别
- 注意:
innerText和innerHTML对单标签元素无法使用案列代码:
<body> <div></div> <p> 我是文字 <span>123</span> </p> <script> // innerText 和 innerHTML的区别 // 1. innerText 不识别html标签 非标准 去除空格和换行 var div = document.querySelector('div'); // div.innerText = '<strong>今天是:</strong> 2019'; // 2. innerHTML 识别html标签 W3C标准 保留空格和换行的 div.innerHTML = '<strong>今天是:</strong> 2019'; // 这两个属性是可读写的 可以获取元素里面的内容 var p = document.querySelector('p'); console.log(p.innerText); console.log(p.innerHTML); </script> </body>
修改元素属性
获取属性的值
元素对象.属性名设置属性的值
元素对象.属性名 = 值案例代码:
<style> img { width: 300px; } </style> </head> <body> <button id="ldh">刘德华</button> <button id="zxy">张学友</button><br> <img src="../2-案例/images/ldh.jpg" alt="" title="刘德华"> <script> //获取元素 var img = document.querySelector('img') var ldh = document.getElementById('ldh') var zxy = document.getElementById('zxy') //注册事件 ldh.onclick = function() { img.src = '../2-案例/images/ldh.jpg' img.title = '刘德华' } zxy.onclick = function() { img.src = '../2-案例/images/zxy.jpg' img.title = '张学友' } </script> </body> <!-- 法2 --> <button>刘德华</button> <button>张学友</button><br> <img src="../2-案例/images/ldh.jpg" alt="" title="刘德华"> <script> var img = document.querySelector('img') var btn = document.querySelectorAll('button') //利用索引获取第几个button btn[0].onclick = function() { img.src = '../2-案例/images/ldh.jpg' img.title = '刘德华' } btn[1].onclick = function() { img.src = '../2-案例/images/zxy.jpg' img.title = '张学友' } </script>
案例:分时问候
案例分析:
- 根据系统不同时间来判断,所以需要用到日期内置对象
- 利用多分支语句来设置不同的图片
- 需要一个图片,并且根据时间修改图片,就需要用到操作元素src属性
- 需要一个div元素,显示不同问候语,修改元素内容即可
案例代码:
<style>
img {
width: 300px;
}
</style>
</head>
<body>
<img src="images/s.gif" alt="">
<div>上午好</div>
<script>
// 1.获取元素
var img = document.querySelector('img')
var div = document.querySelector('div')
// 2. 得到当前的小时数
var time = new Date();
var h = time.getHours();
// 3. 判断小时数改变图片和文字信息
if (h < 12) {
img.src = 'images/s.gif';
div.inneHTML = '上午好';
} else if (h < 18) {
img.src = 'images/x.gif';
div.innerHTML = '下午好';
} else {
img.src = 'images/w.gif';
div.innerHTML = '晚上好';
}
</script>
</body>
操作元素之表单属性设置
<body>
<button>按钮</button>
<input type="text" value="输入内容">
<script>
// 1. 获取元素
var btn = document.querySelector('button');
var input = document.querySelector('input');
// 2. 注册事件 处理程序
btn.onclick = function() {
// input.innerHTML = '点击了'; 这个是 普通盒子 比如 div 标签里面的内容
// 表单里面的值 文字内容是通过 value 来修改的
input.value = '被点击了';
// 如果想要某个表单被禁用 不能再点击 disabled 我们想要这个按钮 button禁用
// btn.disabled = true;
this.disabled = true;
// this 指向的是事件函数的调用者 btn
}
input.onfocus = function() {
console.log('获取焦点'); //点击input文本框才生效
console.log(this === input);//true
}
</script>
</body>
案例:仿京东显示密码
案例分析:
①核心思路: 点击眼睛按钮,把密码框类型改为文本框就可以看见里面的密码
②一个按钮两个状态,点击一次,切换为文本框,继续点击一次切换为密码框
③算法:利用一个flag变量,来判断flag的值,如果是1 就切换为文本框,flag 设置为0,如果是0 就切换为密码框,flag设置为1
案例代码:
<style> .box { position: relative; width: 400px; border-bottom: 1px solid #ccc; margin: 100px auto; } .box input { width: 370px; height: 30px; border: 0; outline: none; } .box img { position: absolute; top: 2px; right: 2px; width: 24px; } </style> </head> <body> <div class="box"> <label for=""> <img src="images/close.png" alt="" id="eye"> </label> <input type="password" name="" id="pwd"> </div> <script> // 1. 获取元素 var eye = document.getElementById('eye'); var pwd = document.getElementById('pwd'); // 2. 注册事件 处理程序 var flag = 0;//记录眼睛的状态 0睁眼1是闭眼 eye.onclick = function() { // 点击一次之后, flag 一定要变化 if (flag == 0) { pwd.type = 'text'; eye.src = 'images/open.png'; flag = 1; // 赋值操作 } else { pwd.type = 'password'; eye.src = 'images/close.png'; flag = 0; } } //法2 var flag = true // true为闭眼,false为睁眼 eye.onclick = function() { //点击之后,flag一定要变化 if (flag) { pwd.type = 'text' this.src = 'images/open.png' } else { pwd.type = 'password' this.src = 'images/close.png' } flag = !flag //取反 } </script> </body>样式属性操作
<style>
div {
width: 200px;
height: 200px;
background-color: pink;
}
</style>
</head>
<body>
<div></div>
<script>
// 1. 获取元素
var div = document.querySelector('div');
// 2. 注册事件 处理程序
div.onclick = function() {
// div.style里面的属性 采取驼峰命名法
this.style.backgroundColor = 'purple';
this.style.width = '250px';
}
</script>
</body>
代码执行时机:
- 事件处理函数在for循环执行结束执行
- 先执行for循环,循环一次 注册一次事件 (边循环边注册)(循环几次就开辟几次内存地址)
- 事件处理函数只有点击的时候才执行,不操作不执行
获取焦点和失去焦点
onfocus(获取) onblur(失去) this属性是可读写的<body> <input type="text" value="手机"> <script> // 获取元素 var input = document.querySelector('input') // 注册事件 onfocus (只有文本框里是手机的时候才清空) input.onfocus = function() { if (this.value === '手机') { this.value = '' } // 获取焦点时输入文字变颜色 this.style.color = '#333' } // 失去焦点 onblur input.onblur = function() { if (this.value === '') { this.value = '手机' } // 失去焦点更改字体颜色 this.style.color = '#999' } </script> </body>
通过className更改元素样式
1. element.style 行内样式操作 2. element.className 类名样式操作 注意:
- 如果样式修改较多,可以采取操作类名方式更改元素样式。
- class因为是个保留字,因此使用className来操作元素类名属性
- className 会直接更改元素的类名,会覆盖原先的类名。
<style> div { width: 100px; height: 100px; background-color: pink; } .change { background-color: purple; color: #fff; font-size: 25px; margin-top: 100px; } </style> </head> <body> <div class="first">文本</div> <script> // 1. 使用 element.style 获得修改元素样式 如果样式比较少 或者 功能简单的情况下使用 var test = document.querySelector('div'); test.onclick = function() { // this.style.backgroundColor = 'purple'; // this.style.color = '#fff'; // this.style.fontSize = '25px'; // this.style.marginTop = '100px'; // 让我们当前元素的类名改为了 change // 2. 我们可以通过 修改元素的className更改元素的样式 适合于样式较多或者功能复杂的情况 // 3. 如果想要保留原先的类名,我们可以这么做 多类名选择器 // this.className = 'change'; this.className = 'first change'; } </script> </body> 深化:
- 在原来的基础上添加类名:
this.classList.add- 在原来的基础上移除类名:
this.classList.remove- 切换类名:如果元素有这个类名就移除,没有就添加:
this.classList.toggle<body> <div class="aa">这是div</div> <script> // 获取元素 var div = document.querySelector('div') div.onclick = function() { // 会覆盖元素原有的类名 // this.className = 'change' // 在原来的基础上添加类名 this.classList.add('change') // 在原来的基础上移除类名 this.classList.remove('aa') // 切换类名:如果元素有这个类名就移除,没有就添加 this.classList.toggle('aa') // 实现开关灯效果(toggle 给body添加类名) document.body.classList.toggle('close') } </script> </body>文本框输入信息提示案例
案例分析:
// 首先判断的事件是表单失去焦点 onblur
// 如果输入正确则提示正确的信息颜色为绿色小图标变化
// 如果输入不是6到16位,则提示错误信息颜色为红色 小图标变化
// 因为里面变化样式较多,我们采取className修改样式
<style> div { width: 600px; margin: 100px auto; } .message { display: inline-block; font-size: 12px; color: #999; background: url(images/mess.png) no-repeat left center; padding-left: 20px; } .wrong { color: red; background-image: url(images/wrong.png); } .right { color: green; background-image: url(images/right.png); } </style> </head> <body> <div class="register"> <input type="password" class="ipt"> <p class="message">请输入6~16位密码</p> </div> <script> // 1.获取元素 var ipt = document.querySelector('.ipt'); var message = document.querySelector('.message'); //2. 注册事件 失去焦点 ipt.onblur = function() { // 根据表单里面值的长度 ipt.value.length if (this.value.length < 6 || this.value.length > 16) { // console.log('错误'); message.className = 'message wrong'; message.innerHTML = '您输入的位数不对要求6~16位'; } else { message.className = 'message right'; message.innerHTML = '您输入的正确'; } } </script> </body>
获取对元素产生作用的样式
getComputedStyle(div).width
<style>
div {
width: 100px;
height: 200px;
background-color: blue;
}
</style>
</head>
<body>
<div style="width: 200px">111</div>
<script>
var div = document.querySelector('div')
// 获取对元素产生作用的样式 window可以省略
console.log(getComputedStyle(div).width);
console.log(window.getComputedStyle(div).width);
</script>
</body>
排他算法
如果有同一组元素,我们想要某一个元素实现某种样式, 需要用到排他思想算法:(干掉所有人包括自己,再复活自己)
- 所有元素全部清除样式(干掉其他人)
- 给当前元素设置样式 (留下我自己)
- 注意顺序不能颠倒,首先干掉其他人,再设置自己
注意:
代码的执行顺序:
- 虽然是双for循环但是执行顺序不一样,排他算法的执行顺序:是先注册事件,然后你点击按钮后,再执行内层for循环也就是把所有人干掉(包括自己),循环完毕后再保留点击的自己
<body> <button>按钮1</button> <button>按钮2</button> <button>按钮3</button> <button>按钮4</button> <button>按钮5</button> <script> // 1. 获取所有按钮元素 var btn = document.getElementsByTagName('button'); // btns得到的是伪数组 里面的每一个元素 btns[i] for (var i = 0; i < btn.length; i++) { btn[i].onclick = function() { // (1) 我们先把所有的按钮背景颜色去掉 干掉所有人 for (var i = 0; i < btn.length; i++) { btn[i].style.backgroundColor = ''; } // (2) 然后才让当前的元素背景颜色为pink 留下我自己 this.style.backgroundColor = 'pink'; } } //2. 首先先排除其他人,然后才设置自己的样式 这种排除其他人的思想我们成为排他思想 </script> </body>
百度换肤案例
<style> * { margin: 0; padding: 0; } body { background: url(images/1.jpg) no-repeat center top; } li { list-style: none; } .baidu { overflow: hidden; margin: 100px auto; background-color: #fff; width: 410px; padding-top: 3px; } .baidu li { float: left; margin: 0 1px; cursor: pointer; } .baidu img { width: 100px; } </style> </head> <body> <ul class="baidu"> <li><img src="images/1.jpg"></li> <li><img src="images/2.jpg"></li> <li><img src="images/3.jpg"></li> <li><img src="images/4.jpg"></li> </ul> <script> // 1. 获取元素 var imgs = document.querySelector('.baidu').querySelectorAll('img'); // console.log(imgs); // 2. 循环注册事件 for (var i = 0; i < imgs.length; i++) { imgs[i].onclick = function() { // this.src 就是我们点击图片的路径 images/2.jpg // console.log(this.src); // 把这个路径 this.src 给body 就可以了 document.body.style.backgroundImage = 'url(' + this.src + ')'; } } </script> </body> 表格隔行变色
- 鼠标经过事件 onmouseover
- 鼠标离开事件 onmouseout
<style>
table {
width: 800px;
margin: 100px auto;
text-align: center;
border-collapse: collapse;
font-size: 14px;
}
thead tr {
height: 30px;
background-color: skyblue;
}
tbody tr {
height: 30px;
}
tbody td {
border-bottom: 1px solid #d7d7d7;
font-size: 12px;
color: blue;
}
.bg {
background-color: pink;
}
</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>
// 1.获取元素 获取的是 tbody 里面所有的行
var trs = document.querySelector('tbody').querySelectorAll('tr');
// 2. 利用循环绑定注册事件
for (var i = 0; i < trs.length; i++) {
// 3. 鼠标经过事件 onmouseover
trs[i].onmouseover = function() {
// console.log(11);
this.className = 'bg';
}
// 4. 鼠标离开事件 onmouseout
trs[i].onmouseout = function() {
this.className = '';
}
}
// 1.用排他算法实现
获取tbody里的所有行
var hr = document.querySelector('tbody').querySelectorAll('tr')
// 循环绑定注册事件
for (i = 0; i < hr.length; i++) {
hr[i].onmouseover = function() {
for (i = 0; i < hr.length; i++) {
hr[i].className = ''
}
this.className = 'bg'
}
}
</script>