BOM02 day021

82 阅读5分钟

BOM的其他对象

1、history对象:保存【当前窗口】的历史记录(打开【过】的url),可用于

	前进:history.go(1);
	后退:history.go(-1);
	刷新:history.go(0);

2、*navigator对象:保存了当前浏览器的基本信息,可以使用js来判断我们是什么浏览器以及版本号 - 类似于css hack(浏览器兼容性问题的,专门针对老IE),但是更强大,单独为老IE写js

	属性:navigator.userAgent;	-   能够得到一个字符串,包含着是什么浏览器以及版本号,想办法去拿到你需要的部分
	
	HTML5(语义化标签、增强型表单、音频视频)和CSS3(过渡、动画、转换、媒体查询、阴影、弹性盒子、rem...)和ES5以上的任何东西,老IE都是不支持的,所以要做兼容
		
	BOM确实有很多具有兼容性问题,但是我们不需要自己使用navigator去做兼容,前辈们帮我们已经做好了

3、*location对象:保存当前窗口【正在打开】的url

	1、***常识:一个url网址由哪些部分组成 - 5部分
		http://127.0.0.1:8020/bom02/new/03navigator%E5%AF%B9%E8%B1%A1.html?__hbt=1663118768002
		https://www.baidu.com/s?wd=%E5%B1%8C%E7%88%86%E5%95%A6&rsv_spt=1&rsv_iqid=0x9a5c128800018a49&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_dl=tb&rsv_enter=1&rsv_sug3=10&rsv_sug1=7&rsv_sug7=100&rsv_sug2=0&rsv_btype=i&inputT=4415&rsv_sug4=4416
		
		协议名:https、http、ftp、ws(直播)...
		域名/主机号:底层大家都是主机号,域名是需要花钱购买的
		端口号:默认端口可以省略不写,https默认端口为443,http默认端口为80
		*文件的相对路径/路由:百度把他加密了隐藏起来了 - 决定着用户看到的是哪个网页
		*查询字符串/请求消息:客户端发送到服务器端的东西,服务器端需要接住然后判断我们请求的是什么,才能进行响应 - 和后端进行沟通交流的关键点

		目的:为了学习全栈开发而准备
		协议名://域名:端口号/路由?请求消息

		我们可以通过location得到这个url的每一个部分,但是不要记忆,直接console.log输出location就能直接看到
			协议名:location.protocal
			域名:location.hostname
			端口号:location.port
			路由:location.pathname
			请求消息:location.search

	2、作用:跳转
		location="新url"
		跳转后禁止后退:location.replace("新url");
		刷新:location.reload();

4、 *event对象:事件对象

1、绑定事件:3种

		1、在HTML页面上绑定事件
			<elem on事件名="js语句"></elem>

			缺点:
				1、不符合内容(html)与样式(css)与行为(js)的分离的原则
				2、无法动态绑定事件(一次只能绑定一个元素)
				3、无法同时绑定多个函数对象
				
				2、*在js种使用元素的事件处理函数属性:
				elem.on事件名=function(){
					操作
				}

				优点:
					1、符合内容(html)与样式(css)与行为(js)的分离的原则
					2、动态绑定事件
					3、*没有兼容性问题
				
				缺点:      1、无法同时绑定多个函数对象 - 个人觉得其实不是缺点,为什么不把两个功能放到一起

			3、使用专门的事件API绑定事件
				主流:elem.addEventListener("事件名",callback);
				老IE:elem.attachEvent("on事件名",callback);
				兼容:if(elem.addEventListener){
						elem.addEventListener("事件名",callback);
				           }else{
						elem.attachEvent("on事件名",callback);
				           }

				优点:
					1、符合内容(html)与样式(css)与行为(js)的分离的原则
					2、动态绑定事件
					3、同时绑定多个函数对象
				缺点:      1、具有兼容性问题

2、事件周期:

		主流:3个阶段
			1、捕获阶段,记录着要发生的事件有哪些
			2、目标元素优先触发,目标元素->实际触发事件的元素
			3、冒泡触发,向上触发所有的记录着的事件

		老IE:2个阶段,没有捕获阶段

3、 *获取事件对象event:

		主流:会自动作为事件处理函数的第一个形参传入
			elem.on事件名=e=>{}
		老IE:event;
		兼容:var e=event//不光老IE可用,主流也可以用 - 小三上位

*获取到event事件对象,我们可以干什么?

1、*获取鼠标的坐标/位置

2、*阻止冒泡 - 笔试面试中:开发几乎不用

				主流:e.stopPropagation()
				老IE:e.cancelBubble=true;
				兼容:e.cancelBubble=true; //不光老IE可用,主流也可以用 - 小三上位\

3、 *事件委托/利用冒泡 - 笔试面试开发中

				优化:如果多个子元素定义了相同 或 相似的事件,最好只给父元素定义一次
				为什么:每次绑定一个事件函数,其实都是创建了一个事件对象,创建的事件对象越多,网站的性能越差
				淘汰this:水性杨花,当前元素
				认识一个目标元素:target:你点击的是哪一个,永远就是那一个
				主流:e.target;
				老IE:e.srcElement;
				兼容:e.srcElement; //不光老IE可用,主流也可以用 - 小三上位

4、*阻止浏览器的默认行为:a标签默认跳转页面,右键自带一个弹出框,F12打开一个控制台,F5会刷新

				主流:e.preventDefault();
				老IE:e.returnValue=false;
				兼容:e.returnValue=false; //不光老IE可用,主流也可以用 - 小三上位

				新事件:
					window.oncontextmenu=()=>{//鼠标右键事件}

					window.onkeydown=()=>{//键盘事件 - 我们不做游戏开发}
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		<a id="a" href="https://www.baidu.com">a标签</a>
		
		<form method="get">
			<input id="sub" type="submit"/>
		</form>
		<script type="text/javascript">
			a.onclick=e=>{
				e.preventDefault();
			}
			
			sub.onclick=e=>{//这其实就是第二种阻止提交的方式
				e.preventDefault();
			}
			
			window.oncontextmenu=e=>{
				console.log(1);
				e.returnValue=false;
			}
			
			window.onkeydown=e=>{//键盘按下事件
				if(e.keyCode==112||e.keyCode==116||e.keyCode==123){
					e.returnValue=false;
				}
			}
		</script>
	</body>
</html>

5、获取键盘的键码:

	e.keyCode; === 不需要去记忆键码,要么百度查看,要么直接输出查看

用户一点回车就提交案例

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		<form id="form" method="get">
			用户名:<input name="username" />
			<input type="submit" value="提交"/>
		</form>
		
		<script type="text/javascript">
			window.onkeydown=e=>{
				if(e.keyCode==13){
					form.submit();
				}
			}
		</script>
	</body>
</html>

扩展:客户端存储技术:

	1、cookie:淘汰了,使用很麻烦 - 最大只能传2kb
	2、请求消息部分/查询字符串部分/路由 - 也可以存储,但是不适合多页面传输
	3、***webStorage:HTML5(综合性概念)提出来的一个新特性:2种
		1、sessionStorage - 会话级,只要浏览器一旦关闭,数据就会死亡
		2、localStorage - 本地级,永久存在的
			1、添加:xxxxStorage.属性名=值;
			2、获取:xxxxStorage.属性名;
			3、删除:xxxxStorage.removeItem("属性名"); - 只会删除一个
			4、清空:xxxxStorage.clear(); - 删除全部