是W3C的标准,主要学习页面交互功能实现交互效果;
API是一些预先定义的函数,简单理解就是给程序员提供的一种工具,以便能轻松的实现想要完成的功能;
Web APIs是浏览器的API;
文档对象模型,是处理html或者xml的编程接口;可以通过里面的接口修改网页内容,样式,结构;
var timer =document.getElementById('time');
console.log(timer);
console.log(typeof timer);//这里返回值是对象object
console.dir(timer)//它是用来打印我们返回的元素对象,更好地查看里面的属性和方法;
根据标签名获取:
使用getElementByTagName()方法可以获取指定标签名的对象的集合;
返回对象是获取过来的元素对象的集合,以伪数组的形式存储的;
如果页面中没有元素,返回的是空的伪数组;
通过HTML5新增方法获取:
(1) getElementsByClassName(‘这里面填class的名字’);根据类名返回元素集合;
(2)querySelector(‘.box’/‘#nav’/‘li’):只能返回指定选择器的第一个元素对象;这里切记里面的选择器前面需要加符号;
(3)querySelectorAll():返回的是指定选择器的所有元素对象集合,还是伪数组的形式;这里也要注意选择器前面需要加符号;
特殊元素获取:
(1)获取body元素: var bodyEle = document.body;
(2)获取html元素: document.documentElement;
<body>
<button id="btn">syc</button>
<script>
var btn = document.getElementById('btn');
btn.onclick= function (){
alert('超棒!');
}
</script>
<body>
<div>123</div>
<script>
//1 获取事件源
var div =document.querySelector('div');
//2-绑定事件
div.onclick;
//3-添加事件处理程序
div.onclick=function (){
alert('我被选中了')
}
</script>
</body>
- element.innerText;不识别html标签;非标准
- element. innerHtml;识别html标签;W3C标准;保留空格和换行;
<body>
<button id="ldh">刘德华</button>
<button id="zxy">张学友</button>
<img src="images/ldh.jpeg" alt="">
<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.jpeg';
}
</script>
</body>
type,value,checked,selected,disable;
下面展示的是value属性和disabled的用法:
<body>
<button>点这里</button>
<input type="text" value="输入内容">
<script>
var btn = document.querySelector('button');
var input = document.querySelector('input');
btn.onclick =function(){
input.value='被点击啦';
//想要某个表单被禁用 不能再点击 用disabled
btn.disabled=true;
//和下面这种结果是一样的:
this.disabled=true;
//this指向的是这个函数的调用者 在这里就是btn;
}
</script>
</body>
- element.style :行内样式操作;
- element.className:类名样式操作;
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
div{
width: 300px;
height: 300px;
background-color: pink;
}
</style>
</head>
<body>
<div></div>
<script>
var div=document.querySelector('div');
div.onclick=function (){
//div里面的属性采取驼峰命名法
div.style.backgroundColor='purple';
div.style.width='400px';
}
</script>
</body>
display.none;隐藏
display.block;显示
首先表单需要两个事件:
获得焦点onfocus
失去焦点 onblur
之前讲到,如果样式比较少,或者功能比较简单用element.style修改外观样式:
this.className = ’ 类名 ’
var ipt =document.querySelector('.ipt')
var message = document.querySelector('.message')
ipt.onblur= function (){
if(ipt.value.length<6||ipt.value.length>16){
console.log('wrong');
message.className='wrong'
message.innerHTML='位数不对';
}
}
就是用到了双层循环;首先先排除所有人,然后再设置自己的样式;
<script>
//获取所有按钮
var btns = document.querySelectorAll('button');
//btn得到的是伪数组,这里遍历每一个button
for (var i=0;i<btns.length;i++){
btns[i].onclick=function (){
//2。所以可以在这里先让所有的背景颜色清空
for (i=0;i<btns.length;i++){
btns[i].style.backgroundColor='';
}
this.style.backgroundColor='pink';//1。但是这里循环内部累计了,都变粉色了
}
}
</script>
设置:
移除
1 . remove
.parentNode------------------得到父节点;但这个得到的是离他最近的父节点;如果找不到父节点就返回为空null;
console.log(erweima.parentNode);//这个就是erweima的父节点
.childNode--------------------得到子节点;
.children-----------------------也是得到子节点,是实际开发常用的;
DOM 提供的方法(API)获取
var ul = document.querySelector('ul');
var lis = ul.querySelectorAll('li');
子节点 childNodes 所有的子节点 包含 元素节点 文本节点等等
console.log(ul.childNodes);
console.log(ul.childNodes[0].nodeType);
console.log(ul.childNodes[1].nodeType);
children 获取所有的子元素节点 也是我们实际开发常用的
console.log(ul.children);
firstChild/lastChild----------------第一个/最后一个子节点,不管是文本节点还是元素节点;
firstElementChild/lastElementChild----------------第一个/最后一个子元素节点;
返回第一个子元素节点 ie9才支持
console.log(ol.firstElementChild);
console.log(ol.lastElementChild);
实际开发的写法 既没有兼容性问题又返回第一个子元素,就是用刚才那种返回子元素的方法,后面加上数组下标:
console.log(ol.children[0]);
console.log(ol.children[ol.children.length - 1]);
分为两步: 1. 创建元素 2. 添加元素
.createElement-----------------------------创建;
node.appendChild(child)-----------------添加,类似数组里面的push;
node.insertBefore(child, 指定元素)------添加到指定元素的前面;
// 1. 创建节点元素节点
var li = document.createElement('li');
// 2. 添加节点 node.appendChild(child) node 父级 child 是子级 后面追加元素 类似于数组中的push
var ul = document.querySelector('ul');
ul.appendChild(li);
// 3. 添加节点 node.insertBefore(child, 指定元素);
var lili = document.createElement('li');
ul.insertBefore(lili, ul.children[0]);
// 4. 我们想要页面添加一个新的元素 : 1. 创建元素 2. 添加元素
node.removeChild(child)--------------------------删除元素
操作元素内容:innerText;innerHTML;
操作元素常见属性:src href title alt
操作表单元素属性:type,value,disabled
操作元素常见样式:元素少用element.style;元素多用className;
传统方式:比如onclick
方法监听注册方式:
addEventListener事件监听方式
(1) 里面的事件类型是字符串 必定加引号 而且不带on
(2) 同一个元素 同一个事件可以添加多个侦听器(事件处理程序)
btns[1].addEventListener('click', function() {
alert(22);
})
btns[1].addEventListener('click', function() {
alert(33);
})
divs[0].onclick = null;
divs[1].addEventListener('click', fn)//这里先写移除函数,不需要调用➕小括号
function fn() {//这里定义fn这个函数
alert(22);
divs[1].removeEventListener('click', fn);
}
divs[2].attachEvent('onclick', fn1);
function fn1() {
alert(33);
divs[2].detachEvent('onclick', fn1);
}
事件流描述的是从页面中接收事件的顺序,分为三个阶段:
常见事件对象的属性和方法:
1. e.target 返回的是触发事件的对象(元素) this 返回的是绑定事件的对象(元素)
区别 : e.target 点击了那个元素,就返回那个元素 ;this 那个元素绑定了这个点击事件,那么就返回谁
2. e.preventDefault() 阻止默认行为(事件) 让链接不跳转 或者让提交按钮不提交;return false也可以,但是只要有return的话后面的代码就不执行了;
3. 怎么阻止冒泡:
标准写法:e,stopPropagation(),stop 停止 ,Propagation 传播;
e.cancelBubble = true;
我是一段不愿意分享的文字
<script>
//禁止鼠标右键菜单contextmenu
document.addEventListener('contextmenu',function (e) {
e.preventDefault();
})
//禁止鼠标选中文字
document.addEventListener('selectstart',function (e) {
e.preventDefault();
})
// 鼠标事件对象 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);
mouseenter只经过自身盒子触发;
mouseover经过自身盒子和经过子盒子都触发;
// document.onkeyup = function() {
// console.log('我弹起了');
// }
document.addEventListener('keyup', function() {
console.log('我弹起了');
})
document.addEventListener('keydown', function() {
console.log('我按下了down');
})
document.addEventListener('keypress', function() {
console.log('我按下了press');
})
三个事件的执行顺序 keydown – keypress – keyup
document.addEventListener('keyup',function (e) {
console.log(e.keyCode)
})
案例:京东快递单号查询
<div class="search">
<!-- 字号偏大的一个盒子-->
<div class="con">123</div>
<!-- 下面的一个输入盒子-->
<input type="text" placeholder="请输入您的快递单号" class="jd">
</div>
<script>
var con = document.querySelector('.con')
var jd_input = document.querySelector('.jd')
jd_input.addEventListener('keyup',function () {
if (this.value==''){
con.style.display='none'
}else {
con.style.display = 'block';
con.innerText = this.value;
}
})
这个案例里面就必须要用keyup,因为字还没按进去的时候,就触发了事件,触发事件的时候value为空,为空时display还是none,取不过来;
BOM–浏览时对象模型;给浏览器窗口做交互效果;比DOM大,document就是window对象的一部分;
window.onload-------页面加载事件:就是在页面中所有元素和事件都加载完成之后再开始执行这个事件;这样就可以把js的代码写在页面元素的任何地方;但这种注册事件方式只能写一个,如果有多个就只执行最后那个,所以我们平时生产环境里面会用到另一种实现方式:window.addEventListener('load',function(){})
DOMContentLoaded-------窗口加载事件,仅当DOM加载完成事件就触发;不包括要再去加载样式表,图片,flash等;就是只要各种标签加载完就可以了;这个更快一点;
window.addEventListener('DOMContentLoaded',function(){})
window.onresize-----只要窗口大小发生变化就会触发这个事件;
window.innerWidth是当前屏幕宽度
window.addEventListener('resize',function(){})
1.
setTimeout(function() {
console.log('时间到了');
}, 2000);
2.
function callback() {
console.log('爆炸了');
}
var timer1 = setTimeout(callback, 3000);
模拟五秒钟关闭广告:
<img src="images/ad.jpg" alt="" class="ad">
<script>
var ad = document.querySelector('.ad');
setTimeout(function () {
ad.style.display='none';
},5000)
</script>
<img src="images/ad.jpg" alt="" class="ad">
<button>不管广告啦</button>
<script>
var ad = document.querySelector('.ad');
var btn = document.querySelector('button')
var Timer=setTimeout(function () {
ad.style.display='none';
},5000)
btn.addEventListener('click',function () {
clearTimeout(Timer);
})
</script>
<script>
var Timer = setInterval(function () {
console.log('syc超棒')
},1000);
</script>
在全局作用下的函数都是window的方法,一般情况下this指向的都是window;
谁调用的函数,this指向的就是哪个对象;
history.forward():前进
history.back():后退
history.go():前进x步,这个x就是()里面的参数,写几就是几,甚至可以是-1;
console.log(father.offsetTop);
console.log(father.offsetLeft);
console.log(w.offsetWidth);
console.log(w.offsetHeight);
console.log(son.offsetParent); // 返回带有定位的父亲 否则返回的是body
console.log(son.parentNode); // 返回父亲 是最近一级的父亲 亲爸爸 不管父亲有没有定位
立即执行函数:不用进行调用直接执行;
两种写法:(function() {})();或者(function(){}());
dpr 物理像素比
(仿淘宝页面滚动案例)
获得的是元素真正的,元素内容大小;
scroll就是被卷进去的长度
var div = document.querySelector('div');
var timer = setInterval(function() {
if (div.offsetLeft >= 400) {
// 停止动画 本质是停止定时器
clearInterval(timer);
}
div.style.left = div.offsetLeft + 1 + 'px';
}, 30);
clearInterval(obj.timer);
obj.timer = setInterval(function() {
if (obj.offsetLeft >= target) {
// 停止动画 本质是停止定时器
clearInterval(obj.timer);
}
obj.style.left = obj.offsetLeft + 1 + 'px';
}, 30);
缓动动画函数封装obj目标对象 target 目标位置
思路:
1. 让盒子每次移动的距离慢慢变小, 速度就会慢慢落下来。
2. 核心算法:(目标值 - 现在的位置) / 10 做为每次移动的距离 步长
(有步长还能让步长成为负数,往后退)
var step = (target - obj.offsetLeft) / 10;