API和Web API
1.API是为我们程序员提供的一个接口,帮助我们实现某种功能,我们会使用就可以了,不必纠结内部如何实现
2.Web API主要是针对于浏览器提供的接口,主要针对于浏览器做交互效果。
3.Web API一般都有输入和输出(函数的传参和返回值),WebAPI很多都是方法(函数)
4.学习Web API可以结合前面学习内置对象方法的思路学习
DOM
文档对象模型(DocumentObject Model,简称DOM),是W3C组织推荐的处理可扩展标记语言(HTML
或者XML)的标准编程接口。
W3C已经定义了一系列的DOM接口,通过这些DOM接口可以改变网页的内容、结构和样式。
心
获取元素
getElementById
<div id="time" >2819-9-9c/div>
<script>
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);
getElementByTagName
<ul>
<li>知否知否,应是等你好久11</1i>
<li>知否知否,应是等你好久11</li>
<li>知否知否,应是等你好久11</li>
<li>知否知否,应是等你好久11</li>
</ul>
<ol>
<li>生僻字</li>
<li>生僻字</li>
<li>企生僻字</li>
<li>生僻字</li>
</ol>
<script>
1.返回的是 获取过来元素对象的集合 以伪数组的形式存储的
var lis = document.getElementsByTagName( "li");
console.log(lis);
console.log(lis[0]);
2.我们想要依次打印里面的元素对象我们可以采取遍历的方式
for (var i =0; i < lis.length; i++) {
console.log(lis[i]);
}
3.如果页面中只有一个li返回的还是伪数组的形式
4.如果页面中没有这个元素返回的是空的伪数组的形式
5. element.getElementsByTagName("标签名");父元素必须是指定的单个元素
var ol = document.getElementById("ol');
console.log(ol.getElementsByTagName( "li'));
获取特殊元素(body,html)
获取body元素
- doucumnet.body //返回body元素对象
获取html元素 - document.documnentElement //返回html元素对象
<script>
1.获取body元素
var bodyEle = document.body;
console.log(bodyEle);
console.dir(bodyEle);
2.获取html元素
var htmiEle = document.html;
var htmlEle = document.documentElement;I
console.log(htmlEle);
</script>
数件基础
1.事件三要素
script>
点击一个按钮,弹出对话框
1.事件是有三部分组成 事件源―事件类型―事件处理程序――我们也称为事件三要素
(1)事件源 事件被触发的对象 谁 按钮
var btn = document.getElementByd( " btn");
(2)事件类型︰ 如何触发 什么事件 比如鼠标点击(onclick) 还是鼠标经过 还是键盘按下
(3)事件处理程序 ―通过一个函数赋值的方式完成
btn.onclick = function(){
alert("点秋香');
}
</script>
2.执行事件过程
<script>
执行事件步骤
1.获取事件源
var div = document.queryselector( "div");
2.绑定事件注册事件
//div.onclick
3.添加事件处理程序
div.onclick = function() {
console.log(我被选中了');}
</script>
操作元素
1.修改元素内容
当我们点击了按钮,div里面的文字会发生变化
// 1.获取元素
var btn = document.queryselector(" button" );
var div = document.queryselector( "div");
// 2.注册事件
btn.onclick = function() i
div.innerText = "2p19-6-6";
<script>
innerText 和innerHTML的区别I
1. innerText不识别html标签 非标准︰去除空格和换行
var div = document.querySelector("div');
// div.innerText = '<strong>今天是:</strong>2019";//strong标签不起作用
2. innerHTML识别html标签W3C标准保留空格和换行的
div.innerHTML = "<strong>今天是:</strong>2019";
//这两个属性是可读写的可以获取元素里面的内容
var p = document.querySelector("p');
console.log(p.innerText);
console.log(p.innerHTML);
</script>
2.修改元素属性
<body>
<button id="ldh">刘德华</button>
<button id="zxy">张学友</button> <br>
<img src="images/ldh.jpg" alt="" title="刘德华">
<script>
//修改元素属性src
1.获取元素
var ldh = document.getElementById(" ldh");
var zxy = document.getElementById( " zxy");
var img = document.querySelector( "img" );
2.注册事件︰处理程序
zxy.onclick = function( ){
img.src = "images/zxy.jpg";
img.title =‘张学友思密达';
}
ldh.onclick = function(){
img.src = "images/ldh.jpg";
img.title ='刘德华';
}
3.表单元素属性操作
<button>按钮</button>
<input type="text" value=""输入内容">
<script>
1.获取元素
var btn = document.queryselector("button" );
var input = document.queryselector( "input");
2.注册事件处理程序
btn.onclick = function( ){
//表单里面的值文字内容是通过value来修改的
input.value ='被点击了";
如果想要某个表单被禁用―不能再点击 disabled我们想要这个按钮 button禁用
// btn.disabled = true;
this.disabled = true;
this 指向的是事件函数的调用者btn
4.样式属性操作
<style>
div {
width: 200px;
height: 200px;
background-colgr: 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 = "25epx";
5.排他思想
1.获取所有按钮元素
var btns = document.getElementsByTagName( 'button');
// btns得到的是伪数组里面的每一个元素btns[i]
for (var i = e; i < btns.length; i+){
btns[i].onclick = function(){
//我们先把所有的按钮背景颜色去掉干掉所有人
for (var i = e; i c btns.length; ir) {
btns[i].style.backgroundcolor = ";
}
//然后才让当前的元素背景颜色为pink留下我自己
this.style.backgroundColor = "pink";
)
6.自定义属性的操作
<div id="demo" index=""1" class="nav></div>
<script>
var div = document.queryselector( "div');
1.获取元素的属性值
方法一:(1)element.属性
console.log(div.id);
方法二:(2) element.getAttribute('属性') get得到获取 attribute属性的意思我们程序员自己添加的属性我
们称为自定义属性index
console.log(div.getAttribute("id");
console.log(div.getAttribute( "index"));
2.设置元素属性值
方法一: (1)element.属性="值"
div.id = 'test";
div.className = 'navs";
方法二:(2)element.setAttribute('属性",‘值");主要针对于自定义属性
div.setAttribute( "index", 2);
div.setAttribute('class ','footer');// class特殊―这里面写的就是class不是className
3.移除属性 removeAttribute(属性)
div.removeAttribute('index');
节点操作
<div class="demo">//父亲
<div class="box">//父亲
<span class="erweima">x</span>//儿子
</div>
</div>
<script>
1.父节点parentNode
var erweima = document.queryselector(" .erweima " );
得到的是离元素最近的父级节点
console.log(erweima.phrentNode);//box
</script>
2.子节点
children获取所有的子元素节点也是我们实际开发常用的
console.log(ul.children);
操作元素的第一和最后一个元素
console.log(ol.children[0]);
console.log(ol.children[ol.children.length -1]);
3.兄弟节点
<script>
var div = document.queryselector("div");
1.nextsibling 下一个兄弟节点包含元素节点或者文本节点等等
console.log(div.nextsibling);
console.log(div.previoussibling);
2. nextElementsibling得到下一个兄弟元素节点
console.log(div.nextElementsibling);
console.log(div.previousElementsibling);
</script>
3.创建节点和添加节点
<script>
1.创建节点元素节点
var li = document.createElement('li');
2.添加节点node.appendChild(child) node父级 child 是子级后面追加元素﹑类似于数组中的push
var ul = document.queryselector("ul");
ul.appendchild(i);//默认在后面添加
3,添加节点node.insertBefore(child,指定元素);
var lili = document.createElement('li');
ul.insertBefore(lili,ul.children[e];//在lili的前面添加
4,我们想要页面添加一个新的元素:1.创建元素2.添加元素
</script>
4.删除节点 node.removeChild
<script>
1.获取元素
var ul = document.queryselector("ul");
var btn = document.queryselector( 'button');
2.删除元素node.removechild(child)
ul.removeChild(ul.children[e]);
3.点击按钮依次删除里面的孩子
btn.onclick = function() {
if (ul.children.length == 0){
this.disabled = true;
}else {
ul.removeChild(ul.children[e]);
}}
</script>
6.复制节点
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
<script>
var ul = document.querySelector("ul");
1. node.cloneNode();括号为空或者里面是false浅拷贝只复制标签不复制里面的内容//<li> </li>
2. node.cloneNode(true);括号为true 深拷贝复制标签复制里面的内容
var lili = ul.children[0].cloneNode(true);
ul.appendchild(1ili);//会复制标签和内容<li>1</li>
</script>
事件的高级
注册事件
addEventListener
<button>传统注册事件</button>
<button>方法监听注册事件</button>
<script>
var btns = document.querySelectorAl1( "button" );
1.事件侦听注册事件addEventListener
(1)里面的事件类型是字符串必定加引号而且不带on
(2)同一个元素同一个事件可以添加多个侦听器(事件处理程序)
btns[1].addEventListener("'click" , function(){
alert(22);
})
btns[1].addEventListener("click" , function(){
alert(33);
})
</script>
删除事件
removEventListener
<body>
<div>1</div>
<div>2</div>
<div>3</div>
<script>
var divs = document.querySelectorAl1( "div");
2. removeEventListener删除事件
divs[1].addEventListener('click", fn)//里面的fn不需要调用加小括号
function fn(){
alert(22);
divs[1].removeEventListener("click", fn);
}
/script>
</body>
DOM事件流
<script>
dom事件流三个阶段
1.JS 代码中只能执行捕获或者冒疱其中的一个阶段。
2. onclick和attachEvent (ie)只能得到冒跑阶段。
3.捕获阶段如果addEventListener第三个参数是 true那么则处于捕获阶段 document - html ->
body -> father -> son
var son = document.querySelector( ".son");
son.addEventListener('click', function() {
alert( 'son');
, true);//弹出son
var father = document.querySelector( ".father");
father.addEventListener('click", function() {
alert( 'father');
,true);//弹出father再弹出son
4.冒泡阶段如果addEventListener第三个参数是 false或者省略那么则处于冒泡阶段son ->
father ->body -> html -> document
var son = document.queryselector( " .son");
son.addEventListener("click" , function(){
alert( 'son ');
,false);
var father = document.querySelector( ".father" );
father.addEventListener("cick", function() {
lalert( 'father');
,false);//弹出father再弹出son
document.addEventListener("click" , function(){
alert( 'document');//弹出docunment,father,son
)
</script>
事件对象
//事件对象
var div = document.querySelector( 'div');
div.onclick = function(e) i
// console.log(e);
// console.log(window.event);
// e =e ll window.event;
console.log(e);
}
// div.addEventListener( 'click', function(e) {
//console.log(e);
})
1. event就是一个事件对象写到我们侦听函数的小括号里面当形参来看
2.事件对象只有有了事件才会存在,它是系统给我们自动创建的,不需要我们传递参数
息,鼠标坐标啊,如果是键盘事件里面就包含的键盘事件的信息比如判断用户按下了那个键
4.这个事件对象我们可以自己命名比如event . evt、e
5.事件对象也有兼容性问题ie678通过 window.event兼容性的写法e = e||window.event
3.事件对象是我们事件的一系列相关数据的集合跟事件相关的比如鼠标点击里面就包含了鼠标的相关信
地
e.target和this的区别
常见事件对象的属性和方法
1. e.target返回的是触发事件的对象(元素) this 返回的是绑定事件的对象(元素)
区别:e.target点击了那个元素,就返回那个元素 this那个元素绑定了这个点击事件,那么就返回谁
var div = document.queryselector( 'div");
div.addEventListener('click', function(e){
console.log(e.target);
console.log(this);
))
var ul = document.queryselector('ul');
ul.addEventListener('click', function(e){
//我们给ul绑定了事件―那么this 就指向uil
console.log(this);
e.target指向我们点击的那个对象谁触发了这个事件我们点击的是li e.target 指向的就是li
console.log(e.target);
”
2.e.type和e.preventDefault()
body>
<div>123</div>
<a href="http://www.baidu.com>百度</a>
<form action="http://www.baidu.com">
<input type="submit" value=""提交" name="sub">
</form>
<script>
常见事件对象的属性和方法
1.返回事件类型
var div = document.queryselector( "div');
div.addEventListener("click", fn);
div.addEventListener("mouseover", fn);
div.addEventListener( " mouseout", fn);
function fn(e){
console.log(e.type);
}
2.阻止默认行为(事件)让链接不跳转或者让提交按钮不提交
var a = document.queryselector("a');
a.addEventListener('click', function(e) {
e.preventDefault();//dom标准写法
)
3.阻止事件冒泡
e.stopPropagation()
<div class="son">son儿子</div>
</div>
<script>
1常见事件对象的属性和方法
阻止冒泡dom 推荐的标准stopPropagation()
var son = document.queryselector(".son");
son.addEventListener('click" , function(e) {
alert( "son');
e.stopPropagation(); // stop停止Propagation传播
e.cancelBubble = true; //非标准cancel取消bubble泡泡
},false);
var father = document.queryselector( " .father" );
father.addEventListener("click" , function() {
alert( 'father');
}, false);
document.addEventListener( 'click" , function() {
alert( " document");
})
4.事件委托
<ul>
<li>知否知否,点我应有弹框在手!</li>
<li>知否知否,点我应有弹框在手!</li>
<li>知否知否,点我应有弹框在手!</li>
<li>知否知否,点我应有弹框在手!</li>
<li>知否知否,点我应有弹框在手!</li>
</ul>
<script>
//事件委托的核心原理:给父节点添加侦听器,利用事件冒泡影响每一个子节点
var ul = document.queryselector( 'ul");
ul.addEventListener("click" , function(e) {
// alert(知否知否,点我应有弹框在手!');
e.target这个可以得到我们点击的对象
e.target.style.backgroundcolor = "pink" ;
)
6.常用的鼠标事件
<script>
鼠标事件对象MouseEvent
document.addEventListener("click" , function(e) {
1. client鼠标在可视区的x和y坐标
console.log(e.clientx);
console.log(e.clientY);
console.log('---------------------");
2. page鼠标在页面文档的x和y坐标
console.log(e.pagex);
console.log(e.pageY);
console.log('------------
);
3. screen鼠标在电脑屏幕的x和y坐标
console.log(e.screenX);
console.log(e.screenY);
)
</script>
常用的键盘事件
1。如果使用addEventListener不需要加on
2. onkeypress和前面2个的区别是,它不识别功能键,比如左右箭头,shift等。
3.三个事件的执行顺序是:keydown-- keypress —keyup
1. keyup按键弹起的时候触发
document.onkeyup = function( ){
consoile.log("我弹起了');
})
document.addEventListener( " keyup', function() {
console.log('我弹起了');
})
3. keypress按键按下的时候触发不能识别功能键比如 ctrl shift左右箭头啊
document.addEventListener( " keypress", function() {
console.log('我按下了press");
2. keydown按键按下的时候触发能识别功能键比如ctrl shift左右箭头啊
document.addEventListener( " keydown " , function() {
console.log('我按下了down');
)
键盘事件对象
<script>
键盘事件对象中的keyCode属性可以得到相应键的ASCII码值
1.我们的keyup和keydown事件不区分字母大小写a和A得到的都是65
2.我们的keypress事件区分字母大小写a 97和A得到的是65
document.addEventListener( " keyup" , function(e) {
console.log(e);
console.log( "up:' + e.keyCode);
我们可以利用keycode返回的ASCII码值来判断用户按下了那个键
if (e.keyCode === 65){
alert('您按下的a);
}else {
alert('您没有按下a键")
}})
document.addEventListener( " keypress", function(e) {
//console.log(e);
console.log("press: " +e.keyCode);
BOM浏览器对象模型
window事件常见对象
<script>
window.onload = function( ){
var btn = document.queryselector(" button" );
btn.addEventListener( 'click", function() {
lert("点击我');
})
}
</script>
</head>
<body>
<button>点击</button>
</body>
<script>
window.addEventListener('resize',function (){
console.log(window.innerWidth);
})
</script>
2.3定时器settimeout
<script>
1. setTimeout
语法规范:window.setTimeout(调用函数,延时时间);
1.这个window在调用的时候可以省略
2.这个延时时间单位是毫秒但是可以省略,如果省略默认的是e
setTimeout(function(){
console.log('时间到了');
},2000);
</script>
<body>
<button>点击停止定时器</button>
<script>
var btn = document.queryselector( " button");
var timer = setTimeout(function(){
console.log('爆炸了');
},5000);
btn.addEventListener("click", function() {
clearTimeout(timer);
})
</script>
</body>
<script>
1. setInterval
语法规范:window.setInterval(调用函数,延时时间);
setInterval(function( ){
console.log(继续输出');
,1000);
setTimeout延时时间到了,就去调用这个回调函数,只调用一次就结束了这个定时器
setInterval每隔这个延时时间,就去调用这个回调函数,会调用很多次,重复调用这个函数
</script>
<button class="begin">开启定时器</button>
<button class="stop">停止定时器</button>
<script>
var begin = document.querySelector( ".begin");
var stop = document.querySelector( '.stop');
var timer = null;//全局变量null是一个空对象
begin.addEventListener( "click", function( ){
timer = setInterval(function() {
console.log('ni hao ma');
},1000);
})
stop.addEventListener("click", function() {
clearInterval(timer);
)
</script>
JS执行机制(同步,异步)
location对象
body>
<button>点击</button>
<script>
var btn = document.queryselector( " button");
btn.addEventListener("click", function() {
记录浏览历史,所以可以实现后退功能
location.assign( "http://wow .itcast.cn');
不记录浏览历史,所以不可以实现后退功能
ilocation.replace( " http://wwnw .itcast.cn');
location.reload(true);
</script>
</body>
navigator对象
history对象
<body>
<a href="list.htm1">点击我去往列表页</a>
<button>前进</button>
<script>
var btn = document.queryselector( " button");
btn. addEventListener("click", function() i
//history.forward();
history.go(1);//1代表前进,-1代表后退
))
</script>
</body>
PC端网页特效
<script>
offset系列
var father = document.querySelector( ".father" );
var son = document.querySelector( ".son ");
可以得到元素的偏移位置返回的不带单位的数值
console.log(father.offsetTop);
console.log(father.offsetLeft);
它以带有定位的父亲为准如果么有父亲或者父亲没有定位则以 body 为准
console.log(spn.offsetLeft);
可以得到元素的大小宽度和高度
var w = document.queryselector(".w');
console.log(w.offsetwidth);
console.log(w.offsetHeight);
</script>
元素可视区client系列
<script>
client宽度和我们offsetwidth最大的区别就是不包含边框
var div = document.queryselector( "div");
console.log(div.clientwidth);
</script>
scroll系列
<script>
scroll系列
var div = document.querySelector( 'div');
console.log(div.scrollHeight);
console.log(div.clientHeight);
scroll滚动事件当我们滚动条发生变化会触发的事件
div.addEventListener( "scroll', function() {
console.log(div.scrollTop);
})
</script>
mouseenter和mouseover
<script>
var father = document.queryselector( '.father');
var son = document.queryselector( '.son');
father.addEventListener('mouseover', function() {//这里经过父子盒子都会打印11,
//如果是mouseenter就智慧打印一次
console.log(11);
})
</script>
动画原理
<script>
动画原理
1.获得盒子当前位置
2.让盒子在当前位置加上1个移动距离
3.利用定时器不断重复这个操作
4.加一个结束定时器的条件
5.注意此元素需要添加定位,才能使用element.style.left
var div = document.querySelector( "div');
var timer = setInterval(function(){
if (div.offsetLeft >= 400){
//停止动画本质是停止定时器
clearInterval(timer);
}
div.style.left = div.offsetLeft + 1 + "px";
},30);
</script>
触屏事件
<script>
1.获取元素
2.手指触摸DOM元素事件
var div = document.queryselector( 'div);
div.addEventListener( "touchstart", function() {
console.log('我摸了你");
});
3.手指在DOM元素身上移动事件
div.addEventListener("touchmove', function() {
console.log('我继续摸');
});
4.手指离开dom事件
div.addEventListener( "touchend" , function(){
console.log('轻轻的我走了');
});
</script>
触摸事件对象(TouchEvent)
##移动端拖拽元素
var div = document.queryselector( "div");
var startx = 0;//获取手指初始坐标
var startY = o;
var x = 0;//获得盒子原来的位置
var y = 0;
div.addEventListener("touchstart", function(e) {
//获取手指初始坐标
startx = e.targetTouches[e].pagex;
startY = e.targetTouches[e].pageY;
x = this.offsetLeft;
y = this.offsetTop;
});
div.addEventListener( 'touchmove", function(e) {
//计算手指的移动距离:手指移动之后的坐标减去手指初始的坐标
var movex = e.targetTouches[0].pagex - startx;
var moveY = e.targetTouches[0].pageY - startY;
//移动我们的盒子盒子原来的位置÷+手指移动的距离
this.style.left = x+ movex + "px";
this.style.top = y + moveY + 'px";
e.preventDefault();//阻止屏幕滚动的默认行为
移动端常见的开发插件
1.-fastclick插件:减低延时问题
<script src="fastclick.js"></script>
</head>
<body>
<div></div>
<script>
if (" addEventListener' in document){
document.addEventListener( " DOMContentLoaded" , function() {
Fastclick.attach(document.body);
},false);
}
var div = document.querySelector( 'div');
div.addEventListener("click", function( ){
lalert(11);
})
2.Swiper插件
实现轮播图
3.superslide
4.iscroll
本地存储
localStorage
<body>
<input type="text">
<button class="set">存储数据</button>
<button class="get">获取数据</button>
<button class="remove">删除数据</button>
<button class="del">清空所有数据</button>
<script>
console.log(localStorage.getItem('username'));
var ipt = document.querySelector('input');
var set = document.querySelector('.set');
var get = document.querySelector('.get');
var remove = document.querySelector('.remove');
var del = document.querySelector('.del');
set.addEventListener('click', function() {
// 当我们点击了之后,就可以把表单里面的值存储起来
var val = ipt.value;
sessionStorage.setItem('uname', val);
sessionStorage.setItem('pwd', val);
});
get.addEventListener('click', function() {
// 当我们点击了之后,就可以把表单里面的值获取过来
console.log(sessionStorage.getItem('uname'));
});
remove.addEventListener('click', function() {
//
sessionStorage.removeItem('uname');
});
del.addEventListener('click', function() {
// 当我们点击了之后,清除所有的
sessionStorage.clear();
});
</script>
</body>
<body>
<input type="text">
<button class="set">存储数据</button>
<button class="get">获取数据</button>
<button class="remove">删除数据</button>
<button class="del">清空所有数据</button>
<script>
var ipt = document.querySelector('input');
var set = document.querySelector('.set');
var get = document.querySelector('.get');
var remove = document.querySelector('.remove');
var del = document.querySelector('.del');
set.addEventListener('click', function() {
var val = ipt.value;
localStorage.setItem('username', val);
})
get.addEventListener('click', function() {
console.log(localStorage.getItem('username'));
})
remove.addEventListener('click', function() {
localStorage.removeItem('username');
})
del.addEventListener('click', function() {
localStorage.clear();
})
</script>
</body>