未记住:
定位得几种方式:
1.position:static(这个属性让元素使用正常的布局(元素在文档常规流中当前的布局位置-- 也就是说元素没加这个属性和加了以后位置都是不变的--top, right, bottom, left 和 z-index属性无效))
2.position:relative(- 在元素原有的位置基础上,根据设置的top,left调整元素位置-- 不会改变页面布局,不影响其他元素的偏移,因此会在此元素未添加定位时所在位置留下空白-table-*-group, table-row, table-column, table-cell, table-caption` 元素无效)
3.粘性定位:sticky:相对定位与固定定位得混搭 ---在 viewport 视口滚动到元素 top 距离小于 10px 之前,元素为相对定位。之后,元素将固定在与顶部距离 10px 的位置,直到 viewport 视口回滚到阈值以下,始终处于 A 的下方。而在开始滚动 B 部分时,B 的头部会固定在屏幕顶部,直到所有 B 的项均完成滚动后,才被 C 的头部替代。
day1
1、***数组的基础(填坑):
1、创建数组:
1、直接量:var arr=[值1,...];
2、构造函数:var arr=new Array(值1,...);
第二个方法有一个坑:new Array(num);//这句话的意思是:创建了一个长度为num的空数组,里面没有任何东西,只有无数的undefined
2、***面试题:按值传递:var a=x; var b=a; 修改a,b变不变,或者 修改b,a变不变
传递的如果是原始类型:
其实是复制了一个副本给对方,两者互不影响
传递的如果是引用类型:js中不是原始类型,就是引用类型(函数、数组,都是引用类型)- 浅拷贝--地址值----
3、如何释放一个引用类型:一定要看清楚有几个变量引用着这个引用类型,每个变量都要释放后才能释放干净
在js底层有一个垃圾回收器,只有垃圾回收器的计数器(记录着这个数据有几个人引用着)为0的时候才会删除不要的数据
索引数组:下标都是数字组成的数组
2、***hash数组(关联数组):下标是可以自定义的
为什么:索引数组的下标无具体的意义,不便于查找
如何使用:
1、创建:2步
1、创建空数组:var arr=[];
2、为数组添加自定义下标并且赋值:arr["自定义下标"]=新值;
2、访问元素:arr["自定义下标"];
3、强调:hash数组的length失效了,永远为0!
遍历hash数组:不能再使用for循环,必须使用for in循环 - 其实for in代老师并不爱称呼他叫作一个循环,因为它不需要设置从哪里开始到哪里结束,纯自动化的,专门为了遍历hash数组存在的
for(var i in 数组名){
i;//下标
数组名[i];//当前次元素
}
不止能遍历hash数组,也能遍历索引数组
个人建议:索引数组依然是for,hash数组再使用for in
例题:计算字符串中每个字符出现得次数:
var str = 'hellow world';
var arr = [];
for (var i = 0; i < str.length; i++) {
// console.log(str[i])
if (arr[str[i]] === undefined) {
arr[str[i]] = 1;
} else {
arr[str[i]]++;
}
}
console.log(arr)
4、***hash数组的原理:
hash算法:将字符串,计算出一个尽量不重复的数字(地址值)
字符串内容相同,则计算出来的数字也一定是相同的
添加元素:将自定义下标交给hash算法,得到一个数字(地址值),直接将你要保存的数据放到此地址保存起来
获取元素:将指定的自定义下标交给hash算法,得到一个和当初保存时一样的数字(地址值),通过此地址找到你当初保存的数据,取出来使用
5、js里面一切的东西都是对象,万物皆对象,除了undefined和null,【一切对象的底层都是hash数组】
3、*****数组的API:
1、*arr 转 str:
var str=arr.join("自定义连接符");
固定套路:2个
1、鄙视题:将数组里面的内容拼接为一句话/单词 - 无缝拼接,其实就是拼接了一个空字符串
var arr=["h","e","l","l","o"," ","w","o","r","l","d"];
var str=arr.join("");
console.log(str);
2、将数组拼接为DOM页面元素 - 第一次遇到数据渲染页面
//拿数创建变量-创建数组
//将数组拼接为页面标签字符串
var str="<开始标签>"+arr.join("</结束标签><开始标签>")+"</结束标签>";
//巧了:innerHTML能够识别标签
sel.innerHTML
案例:选择城市:1.首先建立两个select,2.两个数组建立3.先找到第一个select的所有,然后再触发第一个select时候,点击第二个数组内容。用到:onchange触发的时候,才改变,3.this.selectedIndex--找到当前触发事件被选中的索引,4,第二组数据提取文字=将数组为页面拼接连字符串。
var sels = document.getElementsByTagName('select');
var arr1 = ['-请选择-', '北京', '东京', '西京', '南京', '重庆'];
var arr2 = [
['-请选择-'],
['-请选择-', '北京1', '北京2', '北京3', '北京4', '北京5'],
['-请选择-', '东京1', '东京2', '东京3', '东京4', '东京5'],
['-请选择-', '西京1', '西京2', '西京3', '西京4', '西京5'],
['-请选择-', '南京1', '南京2', '南京3', '南京4', '南京5'],
['-请选择-', '重庆1', '重庆2', '重庆3', '重庆4', '重庆5'],
];
sels[0].innerHTML = '<option>' + arr1.join('</option><option>') + '</option>'
sels[0].onchange = function () {
var i = (this.selectedIndex);
console.log(arr2[i])
sels[1].innerHTML = '<option>' + arr2[i].join('</option><option>') + '</option>'
}
sels[0].onchange() (当做是函数在调用)
2、*数组拼接:添加元素的新方式
将你传入的实参全部拼接到arr的末尾
var newArr=arr.concat(新值1,arr1,...);
特殊:
1、不修改原数组,只会返回一个新数组
2、concat支持传入数组参数,悄悄的将你传入的数组打散为单个元素再拼接
3、*截取子数组:
根据你传入的开始下标截取到结束下标
var subArr=arr.slice(starti,endi+1);
特殊:
1、不修改原数组,只会返回一个新数组
2、含头不含尾
3、endi可以省略不写,如果省略,会从starti位置一直截取到末尾
4、starti也可以省略,如果两个实参都省略,那么会从头到尾完全的复制一份:此操作也叫做深拷贝 - 复制了一个副本给对方
5、支持负数参数,-1代表倒数第1个
这条线以上的API都是不修改原数组的
这条线以下的API都会修改原数组
4、*删插替:
删除:var dels=arr.splice(starti,n);//n代表删除的个数
特殊:虽然他直接修改原数组,但是也有返回值,返回的是被删除的数据组成的一个新数组,因为前辈们考虑到有可能删除的东西刚好是需要的东西,哪怕没有删除也会返回一个空数组
插入:arr.splice(starti,0,新值,...);
特殊:1、原starti位置的元素以及后续元素都会向后移动
2、尽量的不要插入一个数组,会导致我们的数组一些是一维,一些是二维,遍历的时候就非常不方便
替换:var dels=arr.splice(starti,n,新值,...);
特殊:删除的个数和插入的个数不必相同
5、翻转数组:arr.reverse(); - 今日一见,此生无缘
6、数组排序:
1、鄙视时:冒泡排序:前一个元素和后一个元素进行对比,如果前一个>后一个,两者就交换位置,但是做完一轮发现只有最大的一个数字到了最后,所以再开循环反复使用,固定公式:
var arr=[31,21,54,4376,69,8,8,65,643,52,3,321,5,47,69,87,643,524];
for(var j=1;j<arr.length;j++){
for(var i=0;i<arr.length-j;i++){
if(arr[i]>arr[i+1]){
var m=arr[i];
arr[i]=arr[i+1];
arr[i+1]=m
}
}
}
console.log(arr);
2、正式开发时:arr.sort();
默认:将数组中的元素转为字符串后,再按位PK每个字符的unicode号(ASCII码)
问题1:希望按照数字升序排列:
arr.sort(function(a,b){//此函数叫做匿名回调函数,回调函数不需要我们程序员调用,由前辈们创建好,我们学习如何使用即可,其实前辈们的sort方法悄悄的帮助我们调用了
// console.log(a);//后一个数字 // console.log(b);//前一个数字 return a-b;//如果a-b返回的是一个正数:说明后一个>前一个 //如果a-b返回的是一个负数,说明后一个<前一个 //如果a-b返回的是一个0,说明后一个==前一个 //而sort方法会根据你返回的正数、负数、0,来自动考虑要不要交换位置 })
问题2:希望按照数字降序排列:
arr.sort(function(a,b){
return b-a;
})
强调:切记:1、以后只要网页上有功能带有排序,他的底层一定是数组,因为js中只有数组可以排序
2、以后只要网页上有随机的功能,那么他的底层一定用到了随机数公式!
day2
1、*****数组的API:
1、栈和队列:添加元素和删除元素的新方式:
栈:其实就是数组,只不过是一端封闭了,只能从另一端进出
何时:现实生活中,情况不多:电梯、旅游巴士... 优先使用最新的数据
如何使用:
开头进:arr.unshift(新值,...);//添加元素的新方式,向前添加,缺点:导致其余元素的下标都发生变化
开头出:var first=arr.shift();//删除元素的新方式,向前删除,一次只能删除一个,缺点:导致其余元素的下标都发生变化
结尾进:arr.push(新值,...);//添加元素的新方式,向后添加。
结尾出:var last=arr.pop();//删除元素的新方式,向后添加。
队列:其实就是数组,只不过一端进,从另一端出:
开头进:arr.unshift(新值,...);
结尾出:var last=arr.pop();
结尾进:arr.push(新值,...);
开头出:var first=arr.shift();
ES3的数组的API你就算是学完了,ES5还提供了6个API等你们学习
2、二维数组:数组的元素,又引用着另一个数组
何时:在一个数组,希望再次细分每个分类
创建:
var arr=[
["预判",18,900],
];
访问:arr[行下标][列下标];
特殊:列下标越界,返回undefined
行下标越界,得到是一个报错,因为行下标越界已经得到一个undefined,undefined没有资格在加[]做操作
遍历二维数组:必然两层循环,外层循环控制行,内层循环控制列
for(var r=0;r<arr.length;r++){
for(var c=0;c<arr[r].length;c++){
console.log(arr[r][c]);
}
}
3、ES5还提供了3组6个API:
1、判断:2个
every:每一个,要求所有元素都满足条件才会为true,只要有一个不满足则为false,非常类似于我们的&&
var bool=arr.every(function(val,i,arr){
//val - 当前的值
//i - 当前的值的下标
//arr - 当前数组本身
return 判断条件;
})
some:有一些,要求只要有一个元素都满足条件会为true,所有元素都不满足则为false,非常类似于我们的||
var bool=arr.some(function(val,i,arr){
return 判断条件;
})
2、遍历:拿到数组中的每个元素做相同 或 相似的操作
forEach - 直接修改原数组
arr.forEach(function(val,i,arr){
直接做你想要的操作;
})
map - 不修改原数组返回一个新数组
var newArr=arr.map(function(val,i,arr){
return 直接做你想要的操作;
})
3、过滤和汇总:
过滤:筛选出你需要的部分,但是和现实不一样的是原数组并不会发生变化
var subArr=arr.filter(function(val,i,arr){
return 判断条件;
})
汇总:
var result=arr.reduce(function(prev,val,i,arr){
return prev+val;
},基础值)
以上6个API都是在简化我们的for循环操作,以后数组我们可能真的不会再写for循环
ES6箭头函数:简化一切匿名回调函数的:
固定公式:function去掉,()和{}之间添加=>,如果形参只有一个,那么()可以省略,如果函数体只有一句话,那么{}也可以省略,如果函数体只有一句话并且是return,那么return和{}都可以省略
难****轮播图做法得思路:
1.创建好图片,按钮,li。在js中找到每一个按钮,li,img。首先对遍历,对按钮进行绑定事件。2.绑定当为右边箭头时候 ,就进行计数器++;3.在右边里面判断条件,如果j=lis.length时,就将j=0;r4 遍历每一个对其进行清空。然后再用J做下标,设置他的className="active".反之,左边箭头。j--;当j==-1时,j=lis.length-1最大下标。同理,也进行清控和设置j为下标得激活状态。5.设置周期定时器,timer=setInterval(function(){右边箭头得状态) 2.onmouseover=(function(){clearinterval}3.onmouseout{右边箭头状态)然后再进行封装版
var btns = document.getElementsByTagName("button"),
lis = document.getElementsByTagName("li"), //[li,li,li]
imgs = document.getElementsByTagName("img"), //[img,img,img,img]
j = 0; //计数器
for (var i in btns) {
btns[i].onclick = function () {
if (this.innerText == ">") {
// 右边箭
animate(1);
} else {
// 左边
animate(-1);
}
}
}
for (var i in lis) {
lis[i].onclick = function () {
// 因为这个是取下标,Num不需要传数字
animate(0, this)
}
}
// 周期定时器开启
timer = setInterval(function () {
animate(1);
}, 1000)
// 鼠标移入得时候,关闭周期定时器
car.onmouseover = function () {
clearInterval(timer);
}
// 鼠标移出得时候,开启周期定时器
car.onmouseout = function () {
timer = setInterval(function () {
animate(1);
}, 1000)
}
function animate(num, li) {//num=0 li=this当前li
if (num) {
// 这个公式不带有隐式转换
j += num
if (j == lis.length) {
j = 0
} else if (j == -1) {
j = lis.length - 1;
}
} else {
// 这里必须进行转换
j = parseInt(li.getAttribute("dy"));// "0" "1" "2"
}
for (var i = 0; i < lis.length; i++) {
lis[i].className = "";
imgs[i].className = "";
}
imgs[j].className = "active";
lis[j].className = "active";
}
day3
案例,生成随机验证码:
var arr=[];
function addArr(a,b){
for(var i=a;i<=b;i++){
arr.push(String.fromCharCode(i));
}
}
addArr(48,51);//[0,1,2,3]
// addArr(65,90);
// addArr(97,122);
// addArr(19968,40869);//不推荐加上中文
//生成四位验证码
var codes="";
while(codes.length<4){
var r=parseInt(Math.random()*(arr.length));
if(codes.indexOf(arr[r])==-1){
codes+=arr[r];
}
}
var user=prompt("请输入验证码:"+codes);
if(user.toLowerCase()==codes.toLowerCase()){
document.write(`<h1 style="color: green;">验证通过</h1>`)
}else{
document.write(`<h1 style="color: red;">验证失败</h1>`)
}
1、*****StringAPI:就是一些只有字符串可以使用的函数,不需要我们创建,直接使用
1、转义字符:\
作用:
1、将字符串中和程序冲突的字符转为原文
"\"" '\''
2、包含特殊功能的符号:
换行:\n
制表符:\t -> 大空格,就跟你敲tab按键效果一样
3、*输出unicode编码的字符:
\u4e00 - ascii码:19968
\u9fa5 - ascii码:40869
2、*大小写转换:将字符串中的每个字符统一的转为大写 或 小写
何时:只要程序不区分大小写,就要【先统一】的转为大写 或 小写,再比较 (做验证码)
如何:
大写:var upper=str.toUpperCase();
小写:var upper=str.toLowerCase();
3、获取字符串中指定位置的字符:str.charAt(i) === str[i];
4、*获取字符串中指定位置的字符的ASCII码:
var ascii=str.charCodeAt(i);
*通过ASCII码转回原文:
var 原文=String.fromCharCode(ascii);
5、***检索字符串:检查索引,检查下标:获取关键字的下标
var i=str/arr.indexOf("关键字",starti);
从starti位置开始,查找右侧第一个关键字的第一个字符的位置
starti可以省略,默认从0位置开始查找
*返回值:找到了,返回第一个关键字的第一个字符的下标位置
没找到,返回-1,其实我们根本不关心下标为多少,我们只关心下标为不为-1
作用:判断有没有!
强调:数组也能使用此方法,数组这个方法是后期才添加 上的,原本此方法只有字符串可用,比如老IE的数组就没此方法。
鄙视题:默认只能获取到第一个关键字的下标,如何才能获取到所有的关键字的下标?
var str="no zuo no die no can no bibi no";
var index=-1;
while((index=str.indexOf("no",index+1))!=-1){
console.log("找到了,下标为:"+index);
}
6、拼接字符串:var newStr=str.concat("新字符串",...) 还不如 +运算
7、*截取字符串:3个
var subStr=str/arr.slice(starti,endi+1);//用法和数组的用法完全一致
str.substring(starti,endi+1);//用法几乎和slice一致,但是不支持负数参数
str.substr(starti,n);//n代表的是截取的个数,不必考虑含头不含尾
8、*替换字符串:本身这个方法非常的强大,但是由于我们暂时还不会正则表达式,所以只能替换固定的关键字,暂时比较搓
var newStr=str.replace("固定关键字"/正则表达式,"新内容");
9、*****切割/分割/分隔字符串:
作用:将字符串转为数组:
var arr=str.split("自定义切割符");
注意:
1、切割后,切割符就不存在了
2、如果你的切割符写的是"",切散每一个字符
10、去掉空白字符:str.trim/trimStart/trimEnd()
扩展:JS如何创建元素:3步 1、创建空标签:var elem=document.createElement("标签名"); 2、为其设置必要的属性和事件: elem.属性名="属性值"; elem.on事件名=function(){操作} 3、挂载上树/渲染页面:父元素.appendChild(elem);
day3
StringAPI:就是一些只有字符串可以使用的函数,不需要我们创建,直接使用
1、转义字符:
作用:
1、将字符串中和程序冲突的字符转为原文
""" '''
2、包含特殊功能的符号:
换行:\n
制表符:\t -> 大空格,就跟你敲tab按键效果一样
3、*输出unicode编码的字符:
\u4e00 - ascii码:19968
\u9fa5 - ascii码:40869
2、*大小写转换:将字符串中的每个字符统一的转为大写 或 小写
何时:只要程序不区分大小写,就要【先统一】的转为大写 或 小写,再比较 (做验证码)
如何:
大写:var upper=str.toUpperCase();
小写:var upper=str.toLowerCase();
3、获取字符串中指定位置的字符:str.charAt(i) === str[i];
4、*获取字符串中指定位置的字符的ASCII码:
var ascii=str.charCodeAt(i);
*通过ASCII码转回原文:
var 原文=String.fromCharCode(ascii);
5、***检索字符串:检查索引,检查下标:获取关键字的下标
var i=str/arr.indexOf("关键字",starti);
从starti位置开始,查找右侧第一个关键字的第一个字符的位置
starti可以省略,默认从0位置开始查找
*返回值:找到了,返回第一个关键字的第一个字符的下标位置
没找到,返回-1,其实我们根本不关心下标为多少,我们只关心下标为不为-1
作用:判断有没有!
强调:数组也能使用此方法,数组这个方法是后期才添加 上的,原本此方法只有字符串可用,比如老IE的数组就没此方法。
鄙视题:默认只能获取到第一个关键字的下标,如何才能获取到所有的关键字的下标?
var str="no zuo no die no can no bibi no";
var index=-1;
while((index=str.indexOf("no",index+1))!=-1){
console.log("找到了,下标为:"+index);
}
6、拼接字符串:var newStr=str.concat("新字符串",...) 还不如 +运算
7、*截取字符串:3个
var subStr=str/arr.slice(starti,endi+1);//用法和数组的用法完全一致
str.substring(starti,endi+1);//用法几乎和slice一致,但是不支持负数参数
str.substr(starti,n);//n代表的是截取的个数,不必考虑含头不含尾
8、*替换字符串:本身这个方法非常的强大,但是由于我们暂时还不会正则表达式,所以只能替换固定的关键字,暂时比较搓
var newStr=str.replace("固定关键字"/正则表达式,"新内容");
9、*****切割/分割/分隔字符串:
作用:将字符串转为数组:
var arr=str.split("自定义切割符");
注意:
1、切割后,切割符就不存在了
2、如果你的切割符写的是"",切散每一个字符
10、去掉空白字符:str.trim/trimStart/trimEnd()
扩展:JS如何创建元素:3步*****
1、创建空标签:var elem=document.createElement("标签名");
2、为其设置必要的属性和事件:
elem.属性名="属性值";
elem.on事件名=function(){操作}
3、挂载上树/渲染页面:父元素.appendChild(elem);
生成随机验证码的案例
var arr=[];
function addArr(a,b){
for(var i=a;i<=b;i++){
arr.push(String.fromCharCode(i));
}
}
addArr(48,51);//[0,1,2,3]
// addArr(65,90);
// addArr(97,122);
// addArr(19968,40869);//不推荐加上中文
//生成四位验证码
var codes="";
while(codes.length<4){
var r=parseInt(Math.random()*(arr.length));
if(codes.indexOf(arr[r])==-1){
codes+=arr[r];
}
}
var user=prompt("请输入验证码:"+codes);
if(user.toLowerCase()==codes.toLowerCase()){
document.write(`<h1 style="color: green;">验证通过</h1>`)
}else{
document.write(`<h1 style="color: red;">验证失败</h1>`)
}
随机验证码的升级版本
span.onclick=function(){
for(var i=0,codes="";i<4;i++){
var r=parseInt(Math.random()*(arr.length));
codes+=arr[r];
}
this.innerHTML=codes;
}
失去焦点时候
inp.onblur=function(){
var user=this.value;
if(user.toUpperCase()==span.innerHTML.toUpperCase()){
div.innerHTML="验证成功";
div.style.color="green";
}else{
div.innerHTML="验证失败";
div.style.color="red";
}
}
::selection{background: transparent;} 点击到span框里面的文字背景颜色。
day4
1、Math对象:专门提供了数学计算的API 强调:不需要创建,直接使用
属性:Math有一些属性,涉及到科学计数法,但是几乎用不到,只有Math.PI有可能用到 === 3.1415926...这一串数字我们不需要自己创建,浏览器自带
API:
1、取整:3种
1、上取整:超过一点点,就取下一个整数
var num=Math.ceil(num);//小数位数不能超过15位,否则此方法只能取整,不能上取整
2、下取整:无论超过多少,都会省略小数部分
var num=Math.floor(num);
3、四舍五入取整:
var num=Math.round(num);//只看小数位数的第一位
//以上三个方法都是垃圾:都是在取整,只能取整
//取整的方式:以上三个+*parseInt(str去掉单位)+*num.toFixed(d);
//*num.toFixed(d); 优点:1、可以四舍五入,并且保留指定小数位数,d其实就是保留的小数位数
2、解决浏览器带来的舍入误差,2-1.6=0.3999999999999这种情况就可以使用toFixed来解决
缺点:结果是一个字符串,建议搭配上parseFloat()使用
//*鄙视题:不允许使用toFixed的情况下,自己封装一个函数,由用户传入数字和保留位数,实现四舍五入操作:
function toFixed(num,d){
num*=(10**d);
num=Math.round(num);
num/=(10**d);
return num;
}
var result=toFixed(Math.PI,2);
console.log(result);
2、乘方和开方:
*乘方:Math.pow(底数,幂); -> 更简化:底数**幂
开方:Math.sqrt(num); - 仅仅只能开平方
3、*最大值和最小值:
var max/min=Math.max/min(a,b,c,d,e,f,g,...);//自动在你传入的数字中比较出最大值或最小值
问题:本身不支持数组参数
解决:固定用法:Math.max/min.apply(Math,arr);//apply具有打散数组的功能
4、绝对值:把负数转为正数
Math.abs(-1);//1
5、***随机数:Math.random(); 在0-1之间去一个随机的小数
搭配上parseInt,只能取到0,但是不可能取到1,意味着取不到最大值
公式:parseInt(Math.random()*(max-min+1)+min)
强调:只要以后网页中某一块有随机的功能,他的底层一定用到了随机数
2、Date对象:日期对象,提供了操作日期和时间的API。 创建:4种 1、*创建一个当前日期: var now=new Date();
2、*创建一个自定义时间:
var birth=new Date("yyyy/MM/dd hh:mm:ss");
3、创建一个自定义时间:
var birth=new Date(yyyy,MM,dd,hh,mm,ss);//修改月份,从0~11,0代表1月
4、复制一个日期:
为什么:日期的所有API都是直接修改原日期的,无法获得修改之前的日期
所以,在执行API之前先进行复制,然后再操作复制后的日期
var end=new Date(start);
使用:2类
1、两个日期对象之间,可以相减(大-小),得到一个毫秒差,换算出自己想要的任何一部分 - 日期的本质其实就是保存了一个毫秒数 - 做倒计时的关键
创建日期的最后一种方式,绝对没人用:var date=new Date(毫秒数);//计算机元年:1970年1月1日 8点整
2、API:
分量:时间的单位
年月日星期:FullYear Month Date Day
时分秒毫秒:Hours Minutes Seconds Milliseconds
每一个分量都有一对儿getXXX/setXXX的方法
其中getXXX负责获取一个分量的值
其中setXXX负责设置一个分量的值
特殊:
1、取值范围:
FullYear - 当前年份的数字
Month - 0~11
Date - 1~31
Day - 0~6:0代表是星期天,外国人的眼里星期天才是一周的第一天的
Hours - 0~23
Minutes、Seconds:0~59
日期你知道了取值范围,如果你还故意设置超出范围,他很聪明,会自动进制
2、Day,没有set方法
3、如果希望对某个分量进行加减操作:
date.setXXX(date.getXXX()+/-n)
4、格式化日期为本地字符串:
date.toLocaleString(); - 垃圾:具有兼容性问题,我们一般会选择自己创建一个格式化方法来格式日期
用了此方法会失去一些东西:日期的自动进制、日期的API
但是你也会获得一些东西:字符串的API
3、定时器: 1、周期性定时器:每过一段时间就会执行一次,先等后做 开启:timer=setInterval(callback,间隔毫秒数); 停止:clearInterval(timer);
2、一次性定时器:等待一段时间,只会做一次就结束了
开启:timer=setTimeout(callback,间隔毫秒数);
停止:clearTimeout(timer);
同步技术:代码必须一行一行的执行,前面没做完,后面就等着
定时器是我们第一次见到的异步技术:无论我这一块代码多么的耗时,也不会卡住后续代码
day5
1、BOM:Browser Object Model - 浏览器对象模型:专门用于操作浏览器的,但是它使用的不多,远不如ES和DOM,浏览器很多操作都是自带的,而且BOM没有标准, 各个浏览器都有自己的定义,但是大部分浏览器的都是一致规范的,除了老IE(8-)
2、window对象:扮演着两个角色: 1、全局对象:保存着全局变量和全局函数 2、指代当前窗口本身:
属性:
1、获取浏览器的完整大小:outerWidth/outerHeight
2、*获取浏览器的文档显示区域的大小:innerWidth/innerHeight - 获取每台电脑的浏览器的文档显示区的大小
3、获取屏幕的完整大小:跟window没关系:screen.width/height; - 我们目前学习的都是浏览器应用(网页),并不会去做桌面应用
·
方法:
1、*打开链接的新方式:
1、当前窗口打开,可以后退:
HTML:<a href="url">内容</a>
JS:open("url","_self");
2、当前窗口打开,禁止后退:使用场景:比如电商网站,结账后不允许后退
HTML做不到了,只有JS可以,也不是window能做到的,而是另外一个人:
history:当前【窗口的历史记录】,他其实可以做的事儿就是前进后退
location:当前【窗口正在打开的url】,有一个API:
location.replace("新url");//叫做替换,不叫做跳转,不会产生历史记录,自然也不能后退了,但是网址替换了,网页必然会发生变化
3、新窗口打开,可以打开多个
HTML:<a href="url" target="_blank">内容</a>
JS:open("url","_blank");
4、新窗口打开,只能打开一个:使用场景:比如电商网站,只允许用户打开一个结账页面
HTML:<a href="url" target="自定义一个name">内容</a>
JS:open("url","自定义一个name");
其实窗口的底层都是有一个名字的,如果打开了一个已经开着的名字的窗口的,他会把他关闭掉,再次打开
学完这块,我们知道了两个点:
1、以后的跳转,任何标签都可以
2、提升用户的体验感
3、a标签的其他用途:
1、跳转
2、锚点
3、下载按钮:<a href="xx.exe/rar/zip/7z">下载</a>
4、打开图片和txt文档:<a href="xx.png/jpg/jpeg/gif/txt">打开图片和txt</a>
5、直接书写js-不需要绑定点击事件:<a href="javascript:js代码;">打开图片和txt</a>
2、打开新窗口/新链接:newW=open("url","target","width=?,height=?,left=?,top=?");
特殊:1、如果没有加第三个参数,那么窗口会和浏览器融为一体
2、如果你加了第三个参数,那么窗口会脱离浏览器独立存在
3、关闭窗口:window/newW.close();
4、改变新窗口的大小:newW.resizeTo(新宽,新高);
5、改变新窗口的位置:newW.moveTo(新X,新Y);
6、*window提供了三个框:
警告框:alert("警告文字");
输入框:var user=prompt("提示文字");
确认框:var bool=confirm("提示文字");
7、*****定时器也是window的
8、事件:
1、window.onload事件 - load - 加载:等待其他所有的资源加载完毕后才会执行的代码,放在里面的代码其实要最后才会执行
2、*window.onresize事件 - 窗口如果大小发生了变化,就会触发,搭配上判断innerWidth可以理解为是js版本的css媒体查询
3、***window.onscroll事件 - 滚动事件,一旦滚动就会触发
1、获取滚动条当前的位置:window.scrollY
2、获取元素距离页面顶部有多远:elem.offsetTop/offsetLeft
9、*****本地/客户端存储技术:
cookie:淘汰了,存储的大小只有2kb,而且操作极其麻烦,尤其要到处切割,只能最多保存30天
webStorage:H5带来了一个新特性,存储的大小有8mb,永久保存,而且非常简单
分类2种:
1、sessionStorage - 会话级,只要浏览器一旦关闭,数据就会死亡了
2、localStorage - 本地即,只要你不清空,就会永久存在
两者的用法是一模一样的,不用创建,直接可用
操作:
1、添加:xxxStorage.属性名="属性值";
2、读取:xxxStorage.属性名;
3、删除:xxxStorage.removeItem("属性名");
4、清空:xxxStorage.clear();
每周自己百度搜索得拓展知识点
opacity的值等于0,意思是鼠标不经过时不显示,值越大,代表的颜色越深