第三周JS知识梳理

116 阅读6分钟

day01

1、Math:

不需要创建的,JS的解释器自动创建,可以直接使用 属性:Math.PI

API:
	1、取整:
		1、上取整:Math.ceil(num);
		2、下取整:Math.floor(num);
		3、四舍五入取整:Math.round(num);

		我们以前学的*parseInt(),不光可以取整,还可以将字符串转为数字,并且去掉单位
		*num.toFixed(d);//四舍五入,小数位数有你自己决定,解决浏览器带来的舍入误差,唯一的缺陷就是返回是一个字符串,所以建议搭配上parseFloat使用

	2、*乘方:Math.pow(底数,幂) ===> 底数**幂
	     开方:Math.sqrt(num)

	3、最大值和最小值:Math.max/min(123,26,5,897,0,98,3,42,875)
		支持数组:Math.max/min.apply(Math,arr)

	4、绝对值:Math.abs(-1);

	5、随机数公式:parseInt(Math.random()*(max-min+1)+min);//只要有随机功能,底层一定用到了随机数

	其实还有Math.tan/sin/cos,但是我们绝对用不上

2、Date:日期对象,提供了一些操作

创建:构造函数方式

1、*当前时间:var now=new Date();

2、自定义时间: *var birth=new Date("1986/02/21 12:45:45"); var birth=new Date(1986,1,21,12,45,45);

3、复制日期:日期所有的API都是修改原日期对象的,导致我无法同时获取修改前和修改后的日期,所以操作API之前都要先复制 *var end=new Date(start);

4、可以传入一个毫秒数,也可以创建时间,但是不方便 var end=new Date(1000);

操作:

1、两个日期相减,可以得到毫秒差,换算出自己想要的部分 - 倒计时

2、分量:FullYear Month Date Day Hours Minutes Seconds Milliseconds 每一个分量都有一对儿getXXX/setXXX,唯独Day没有set 如果你希望对某个分量做加减操作:

3、格式化日期为本地时间:date.toLocaleString();//虽然这个方法不好,具有兼容性问题,但是我们可以自己封装一个格式化方法

而且转为字符串,其实并不是坏事:得到了所有字符串的API

day02

1、BOM:Browser Object Model:

浏览器对象模型,专门用于操作浏览器的,但是老IE和其他浏览器的标准不同,导致在BOM的学习中可能会遇到很多的兼容性问题

2、window对象:

1、充当全局作用域 2、指代当前窗口本身 属性: 1、获取浏览器的完整大小:outerWidth/Height; 2、获取浏览器的文档显示区域大小:innerWidth/Height; 3、屏幕大小:screen.width/height

API:

1、打开新窗口:

var newW=open("url","target/自定义","width=?,height=?,left=?,top=?"); 如果写了第三个参数,小窗口会脱离浏览器独立存在,也可以改变大小和位置

2、关闭窗口:

window/newW.close();

3、改变新窗口的大小:

newW.resizeTo(新宽,新高);

4、改变新窗口的位置:

newW.moveTo(新x,新y);

5、提供了3个弹出框:

警告框:alert(); 输入框:var user=prompt(); 确认框:var bool=comfirm();

6、专属事件:

1、onload - 只要把js代码放到html的后面,此事件可以不使用

2、onresize - 只要浏览器的大小发生了变化就会触发,搭配上innerWidth就可以做出JS版本的CSS媒体查询

3、onscroll - 只要滚动条一旦滚动就会触发 1、获取滚动到哪里:scrollY 2、获取某个元素距离页面顶部/左侧有多远:elem.offsetTop/Left; 3、搭配上ajax可以越往下滚,东西越多

7、定时器也是属于window的

8、本地/客户端存储技术:

webStorage:sessionStorage(会话级:一旦关闭浏览器,数据就会死亡)和localStorage(本地级:永久存在的)

如何使用:

添加:xxxStorage.属性名=属性值;

读取:xxxStorage.属性名

删除:xxxStorage.removeItem("属性名");

清空:xxxStorage.clear();

a标签的其他用途:

1、跳转

2、锚点:

3、下载:

4、打开图片和记事本:

5、直接书写JS:

day03

1、BOM:两个对象:

1、history:保存着当前窗口的历史记录(过去的url)

前进:history.go(正数)

后退:history.go(负数)

刷新:history.go(0);

2、location:保存着当前窗口的正在打开的url(现在的url)

属性:

            协议:location.protocal; - https/http/ftp/ws...
		
            域名:location.hostname; - 主机号|IP地址,不方便记忆,域名是要花钱购买的
		
            端口号:location.port - https(443)/http(80);
		
            路由:location.pathname - 文件相对路径
		
            请求消息:location.search - form(GET)表单提交后带来的

常识:一个url总共有5部分组成:协议://域名:端口号/路由?请求消息

	作用:
		跳转:location="新url"
		跳转后禁止后退:location.replace("新url") - 替换当前url是不产生历史记录的
		刷新:location.reload();

2、DOM:补全了!增、删、改、查(元素、内容、属性、样式)

1、元素:
	增:31var elem=document.createElement("标签名")
		2、elem.属性名="属性值"
		      elem.on事件名=function(){}
		3、父元素.appendChild(elem);
		      父元素.insertBefore(elem,已有子元素);
		      
	删:elem.remove();

	改:父元素.replaceChild(elem,已有子元素);

	查:2大类:
		1、直接找:2类:
			1var elems=document/父元素.getElementsByTag/ClassName("标签/class名");//动态集合HTMLCollection,效率低下,而且不支持forEach
			2var elems=document.querySelectorAll("任意css选择器");//复杂查找,静态集合NodeList,效率高,而且支持forEach
		
		2、关系:

2、内容:innerHTML/innerText/value
	增:elem.属性名+="新内容"

	删:elem.属性名=""

	改:elem.属性名="新内容"

	查:elem.属性名

3、属性:HTML DOMclass必须写为className 而且只能操作标准属性,不能操作自定义属性
	增:elem.setAttribute("属性名","属性值");	===	elem.属性名="属性值"

	删:elem.removeAttribute("属性名");		===	elem.属性名=""

	改:elem.setAttribute("class","d1 d2");		===	elem.属性名="属性值"

	查:elem.getAttribute("属性名");		===	elem.属性名;

4、样式:内联样式
	增:elem.style.css属性名="css属性值";

	删:elem.style.css属性名="";

	改:elem.style.css属性名="css属性值";

	查:elem.style.css属性名;

day04

1、递归:函数内再次调用了函数自己,但迟早有一天会停下来

何时:专门用于遍历层级不明确的DOM或数据 如何:

    function 函数名(形参){
        1、第一层要做什么直接走

        2、判断有没有下一层,如果有再次调用此方法,只不过传入的实参是自己的下一层
	}
	函数名(实际的根元素/根数据)`

缺点:同时开启大量的函数调用,消耗内存

`

2、绑定事件的新方式:

主流:elem.addEventListener("事件名",callback);

老IE:elem.attachEvent("on事件名",callback);

兼容: if(elem.addEventListener){ elem.addEventListener("事件名",callback); }else{ elem.attachEvent("on事件名",callback); }

day05

1、event:事件对象 - BOM的最重要的一个对象:

1、事件周期:3个

1、捕获阶段:由外向内,记录着要发生的事件有哪些

2、目标优先触发:目标元素->实际发生事件的元素

3、冒泡触发:由内向外,依次执行记录着的事件

2、获取事件对象event:

	主流:事件函数的第一个形参会自动接住event对象
	老IE:event;
	兼容:event;

	获取到事件对象event可以做5个操作:
		1、阻止冒泡:
			主流:e.stopPropagation();
			老IE:e.cancelBubble=true;
			兼容:e.cancelBubble=true;

		2、事件委托/利用冒泡:绑定的事件越多,创建的事件对象就会越多,网页的性能就会越低下,把事件委托在父元素身上一次即可
			父元素.on事件名=e=>{
				目标元素:
				主流:e.target; -> 代替掉了this,甚至可以搭配上nodeName判断标签->返回的是一个全大写组成的标签名
				老IE:e.srcElement;
				兼容:e.srcElement;
			}

		3、阻止浏览器的默认行为:
			主流:e.preventDefault();
			老IE:e.returnValue=false;
			兼容:e.returnValue=false;
			新接触到的事件:
				右键:window.oncontextmenu
				键盘:window.onkeydown/press/up

		4、获取键盘的键码:
			e.keyCode;

		5、获取鼠标的位置:
			获取相对于屏幕的坐标:e.screenX/Y
			获取相对于文档显示区域的坐标:e.clientX/Y
			获取相对于页面的坐标:e.pageX/Y