day09
扩展 如何使用js创建DOM元素
1.创建空标签
var 标签名 = document.creatElement("标签名");
2.为标签设置必要的属性或事件
标签名.innerHTML = "内容" ....
3.将元素放在DOM树上
父元素.appendChild(标签名);
Math对象 专门提供了数学计算的API
Math.PI = 3.141592...
API
1.取数
var num = Math.ceil(num);//向上取整 小数的为数不能超过15位 否则方法会失效
var num = Math.floor(num);//向下取整
var num = Math.round(num);/四舍五入取整 只算小数点后一个小数
另外的取整方式
parseInt(str) 能去掉单位
num.toFixed(d) d表示小数点位数
有两个优点:①传入自定义保留小数为数,也带有四舍五入的操作 ②解决浏览器带来的舍入误差。
缺点:结果是一个字符串,建议搭配parseFloat使用
面试题: 不适用toFixed()的情况下,由用户传输数字以及保留小数的为数进行四舍五入,返回一个数字
function toFixed(num,d){
num *=(10**d);
num = Math.round(num);
num /=(10**d);
return num;
}
var result = toFixed(数字,保留的小数位数)
2.乘方和开方
乘方 Math.pow(底数,幂) => 底数**幂
开方 Math.sqrt(数字) 仅仅只能开方
3.最大值和最小值
var max = Math.max(1,2,3,...);
var min = Math.min(1,2,3,...);
问题:本身不支持数组
解决:Math.max/min.apply(Math,arr); apply具有打散数据的功能
4.绝对值
Math.abs(负数)
5.随机数
Math.random();得到[0,1)的随机小数
Math.floor(Math.random(max-min+1)+min);生成min-max随机整数
Date 对象 日期对象,提供了操作日期和时间的API
创建:
创建一个当前时间
var now = new Date();
创建一个自定义时间
var now = new Date("YYYY-MM-DD hh:mm:ss")
创建一个自定义时间
var now = new Date(YYYY,MM,DD,hh,mm,ss) MM取值范围为0-11
复制一个时间
为什么:目前的所有API都是直接修改原日期的,无法获得修改之前的日期,所以在执行API之前先进行复制,然后再操作复制之后的日期
var end = new Date(new);
使用:2类
1.两个日期对象之间,可以相减,得到一个毫秒差,换算出自己想要的任何一部分,日期本质其实就是保存了一个毫秒数,做到计时的关键点
创建日期的最后一种方式 var data=new Data(毫秒数);计算机元年1970年1月1日8点整
2.API
分量:时间的单位
年月日星期:Fullear Month Date Day
时分秒毫秒:Hours Minutes Seconds Milliseconds
每一个分量都有一对getxxx/setxxx
getxxx负责获取一个分量的值 getDate();
setxxx负责设置一个分量的值 setDate();
取值范围
Fullyear
Month 0-11
Date 1-31
Hours 0-23
Minutes/Seconds 0-59
Day 0-6 0代表星期天
任何分量都有set,除了Day
希望对每个分量进行加减操作的话 date.setxxx(date.getxxx+/-n);
格式化本地时间 date.toLocaleString(),有兼容性问题,不同的浏览器显示出来的不同,用了此方法会失去日期的自动进制和日期的所有API,同时可以对其使用字符串的API进行操作
3.定时器
①周期性定时器
开启:timer=setInterVal(callback,间隔毫秒);
停止:clearInterVal(timer);
②一次性定时器
开启:timer=setTimeout(callback,间隔毫秒);
停止:clearTimeout(timer);
day10
BOM Broser Object Model 浏览器对象模型,专门用于操作浏览器
window对象:扮演两个角色
1.代替全局对象global,保存全局变量和全局函数
2.指当前窗口本身
属性:专门获取大小
获取浏览器完成大小 outerHeight/outerWidth
获取浏览器文本区域大小 innerHeight/innerWidth
获取屏幕的完整大小 screen。width/height
打开方式
自身窗口打开,可以前进后退
HTML:<a href="url">内容</a>
JS:open("url","_self");
自身窗口打开,不能够前进后退
HTML无法实现
js:location.replace("url");
新窗口打开,可以多个
HTML:<a href="url" target="_blank"></a>
js:open("url","_blank");
新窗口打开,只能一个
HTML:<a href="url" target="自定义name"></a>
js:open("url","自定义name");
跳转:任何标签都可以跳转,用js里的open("url","_self")实现
提升用户的体验感
a标签的其他用途
跳转
锚点
下载<a href="xx.exe/rar/zip/7z">内容</a>
打开图片和txt文件 <a href="xx.图片后缀/txt">内容</a>
直接写js不绑定事件<a href='JavaScript:js代码;'></a>
新窗口、新链接
var newW = open("url","targrt","width=?,height=?,left=?,top=?")
特殊
如果没有传入第三个参数,窗口和浏览器是一体的
如果传入了第三个参数,窗口和浏览器分离,独立存在
可以拿变量接住这个窗口,便于以后做其他操作
关闭窗口
window/newW.close();
改变窗口的位置
newW.moveTO(新x,新y);
改变窗口大小
newW.resizeTO(新宽,新高);
window提供的三个框,不同浏览器,样式不同
警告框 alert("内容");
输入框 prompt("内容");
确认框 confirm("内容");
定时器
window的专属事件
window.onload事件 load加载等待其他所以的事执行完毕后才执行
window.onresize 事件 窗口大小如果发生改变,就会触发
window.onscroll 事件 一旦滚动就触发
获取滚动条当前位置 window.scrollY;
获取元素距离页面顶部有多远 window.offsetTop/offsetLeft
本地、客户端存储技术
cookie 存储太小,只有2kb 操作复杂,做多保存30天
webStorage:H5带来的一个新特性,存储大小8MB,永久保存
分为两种
1.seesionStorage 会话级 只要浏览器关闭数据就会死亡
2.localStorage 本地级 不清空就会一直存在
操作
1.添加 xxxStorage.属性名="属性值";
2.读取 xxxStorage.属性名;
3.删除 xxxStorage.removeItem("属性名");
4.清空 xxxStorage.clear();//删除全部
day11
DOM 的常用对象
1.history对象 保存了当前窗口的历史记录
前进一步 history.go(1);
后退一步 history.go(-1);
刷新 history.go();
2.*** localtion 对象 保存着当前窗口正在打开的url
***程序员必备常识: 一个url由几部分组成?每个部分有什么?
由五部分组成
①协议:https(加密) http(不加密) ftp(传输文件) ws(直播) 前两个都属于请求-响应模式,专门用于实现网站开发
②主机号|ip地址|域名 域名是需要花钱购买的,主机号|ip地址是免费的
③端口号:https的端口号默认为443 http的默认端口号为80 只有端口号可以省略不写
④***文件的相对路径|路由:
⑤***查询字符串|请求消息 前端传输到后端的东西(form表单提交的东西)
属性:获取url的五个部分的内容
协议:location.protocol
域名:location.hostname
端口号:localtion.port
路由:location.pathname
请求消息:location。search
方法:
跳转:location="新url"
跳转后,禁止后退 location.replace("新url")
刷新:location。reload
DOM:原本DOM是可以操作一切结构化文档的,升级后分为了3部分
1.核心DOM,是无敌的,既可以操作HTML又可以操作XML,但语法相对复杂
2.HTMLDOM:只能操作HTML。不能访问一切自定义的东西,但是语法简单
3.XMLDOM:是能操作XML数据格式(淘汰)被JSON数据格式代替了
查找元素
①通过关系查找 至少要找到一个元素,才能调用关系
父:xx.parentNode
子:xx.children;
第一个子:xx.firstElementChild;
最后一个子:xx.lastElementChild;
前一个兄弟:xx.previousElementSIbling;
后一个兄弟:xx.nextElementSibling;
②直接找元素
1.var elems = document.getElementsByxxxxx();返回一个动态集合 HTMLcollection
2.var elem = document.querySelector("任意css选择器")
缺点:只能找到单个元素,如果匹配到多个,也只会返回第一个,没有找到返回null
var elems = document.querySelectorAll()("r任意CSS选择器")
找到是一个集合,没找到是一个空集合,复杂查找时非常简单,返回的是一个静态集合Nodelist 可以使用forEach
面试题 document.getxxx和document.queryxxx 的区别
1.后者更适合复杂查找
2.动态集合和静态集合的区别
动态集合:每一个DOM发生变化,都会悄悄的再次查找页面元素,让页面和数据保持一致,效率低下,不支持forEach
静态集合:每一次DOM发生变化,不会再次查找页面,页面元素和数据就不一致,效率就提高了,支持forEach
操作样式
内联样式
获取:elem.style.css属性名;只能获取内联样式
设置:elem.style.css属性名="css属性值"
2.样式表(不用,太麻烦了)
var sheet = document.styleSheets[i]; //获取想要操作的样式表
var rules = document.cssRules;//获取样式表中所有的样式
var rule = rules[i];
//操作
console.log(rule.style.background)
rule.style.background("red")
操作属性
获取属性
核心DOM:elem.getAttribute("属性名");
HTMLDOM:elem.属性名
设置属性
核心DOM:elem.setAttribute("属性名","属性值");
HTMLDOM:elem.属性名="属性值"
删除属性:
设置属性值为空字符串,某些属性可以算删除,但是只是删除了属性值,属性名还在,而有的属性哪怕只有一个属性名,也会具有作用(checked,href)
核心DOM:elem.removeAttribute("属性名");
HTMLDOM:elem.属性名=""
如何创建元素以及上树
1.创建空标签
var e = document.creatElement("标签名")
2.为其设置必要的样式
3.上树
父元素.appendChild(elem);在父元素末尾追加一个子元素elem
父元素.insertBefore(elem,已有子元素);在父元素已有子元素后放上elem
父元素.replaceChild(elem,已有子元素);在父元素追加一个子元素elem,但会替换掉已有子元素
删除元素
elem.remove();
let 变量名=值;
作用:
1.解决了申明提前一定要先创建再使用
2.带来了块级作用域,一个{}就是一个块,此变量只能在那个{}里使用
3.如果用let去当下标绑定事件,那么会记录着你当前元素的下标,不需要再自定义下标
将类数组对象变为普通数组
var arr = Array.from(类数组);
day12
1.递归:简单来说就是在函数中再次调用自己,迟早有一天会停下来
何时使用,专门用于【遍历层级不明确的情况】的DOM树和数据
如何使用
function 函数名(root){
1.第一层要做什么直接做
2.判断有没有下一层,如果有下一层再次调用方法,只不过传入的实参是自己的下一层
}
函数名(实际的根元素)
算法:深度优先,优先遍历当前节点的子节点,子节点遍历完成才会跳到兄弟节点
缺陷:不要过多使用,性能相对较差,同时开启大量的函数调用,浪费内存
递归VS纯循环
递归
优点:简单易用
缺点:性能低
纯循环
优点:几乎不占用内存
缺点:难度高
扩展
select&option 只要他们创建元素&上树可以简化
select.add(new Option("innerHTML",value))
绑定事件
1.在HTML页面上书写事件属性
<e on事件名="函数名()"><e>
缺点
不符合内容与样式与行为的分离
无法动态绑定,一次只能绑定一个元素
不支持绑定多个函数对象
2.在JS中使用事件处理函数属性
e.on事件名=function(){
操作
}
优点
符合内容与样式与行为的分离
可以动态绑定
缺点
不支持绑定多个函数对象
3.在js中使用事件API。不考虑老IE是不错的
主流
e.addEventListener("事件名",callback);
老IE
e.attachEvent("on事件名",callback);
兼容
if(e.addEventListener){
e.addEventListener("事件名",callback);
}else{
e.attachEvent("on事件名",callback);
}
优点
符合内容与样式与行为的分离
可以动态绑定
支持绑定多个函数对象
day13
event(事件对象)
1.事件周期:从事件发生,到事件发生到事件处理函数执行完毕的全过程
3个阶段
捕获阶段 由外向内,记录着要发生的事件有哪些
目标优先触发:目标元素->当前点击的实际发生事件的元素
冒泡触发:由外向内,依次执行我们之前记录着的要发生的事件
2.获取事件对象event
主流:会自动作为事件处理函数的第一个形参传入e
老IE:event---老ie全局有这个变量
兼容 event
得到事件对象event可以做什么呢?
1***.获取鼠标的坐标/位置
相对于屏幕的位置 e.screenX/Y
相对于浏览器、文档显示区域的位置 e.clientX/Y
相对于网页的坐标 e.pageX/Y
2.阻止事件冒泡--笔试中
主流:e.stopPropagetion();
老IE:e.cancelBubble=true;
兼容:e.cancelBubble=true;
3.把事件函数简化为箭头函数,但简化后,this就用不了了,需要一个元素来代替this
目标元素:target 实际触发事件的元素
主流:e.target;
老IE:e.stcElement;
兼容:e.strElement;
4.阻止浏览器的默认行为:比如a标签默认就可以跳转,提交按钮可以提交表单,右键自带一个弹出框
主流:e.preventDefault;
老IE:e.returnValue=false;
兼容:e.returnValue=false;
新事件
1.右键事件 window.oncontextmenu
2.键盘事件
window.onkeydown 按下和按住都会触发,任何按键都会触发
window.onkeypress 按下和按住都会触发,但是只有数字,字母,回车,空格可以触发
window.onkeyup 松开按键才会触发 任何按键都可以触发
5.获取键的键码
e.keyCode 可以获取到你按了哪个键,每个键都有自己对应的键码
如果事件委托
脱字符串的衣服,eval(str) 会悄悄的脱掉字符串的衣服再运算
如何判断目标元素是什么标签xx.nodeName 得到的标签名是全大写
事件处理函数可以写为箭头函数-->this会失效,所以必须使用目标元素target
this的指向
单个事件绑定事件this-->当前元素
多个元素绑定事件this-->当前元素
箭头函数this-->外部对象