第四周 BOM

96 阅读8分钟

BOM:Browser Object Model:

浏览器对象模型:提供专门用操作浏览器的一些对象(属性和方法),没有标准(大部分浏览器还是统一的,唯独老IE与众不同)- 使用率相对较低

重点:定时器、事件对象event

DOM:是有标准的:w3c规定的,几乎没有兼容性问题

window对象介绍:扮演着两个角色

1、代替了ES中的global,充当全局对象 - 保存全局变量和全局函数

2、自己也带有一些属性和方法,指代当前窗口本身

网页打开新链接的方式:4种 - 目的:提升用户的体验感

            1、替换当前页面,可以后退
			HTML:<a href="url">内容</a>
			     JSopen("url","_self");

            2、替换当前页面,禁止后退 - 场景:电商网站,付款后不允许退回去再次付款
		history对象:记录着【当前窗口】的历史记录,只有有了历史才能前进后退
		location对象:记录着【当前窗口】正在打开的url,而他又一个方法叫做替换,替换是不会产生任何历史记录的,但是url替换后网页必然跳转
                    JSlocation.replace("新url")

	3、新窗口打开,可以打开多个
		HTML:<a href="url" target="_blank">内容</a>
                    JSopen("url","_blank");

	4、新窗口打开,只能打开一个 - 场景:电商网站,只允许用户打开一个付款页面
		HTML:<a href="url" target="自定义name">内容</a>
		自定义name的意思:每一个窗口底层都有一个名字,target其实就是在设置名字,name如果相同,新打开的窗口就会把旧窗口给替换掉(刷新)
                    JSopen("url","自定义的name");
	
	总结:HTML能做的,JS都能做,JS能做的,HTML不一定可以

扩展a标签的作用:

                            1、跳转
			2、锚点
			3、下载:<a href="xx.exe/zip/rar/7z">内容</a>
			4、打开:<a href="xx.图片后缀/txt">内容</a>
			5、直接书写js:<a href="javascript:js代码;">内容</a>

window提供了属性和方法:

属性:获取浏览器的完整大小:outerWidth/outerHeight;

获取浏览器的文档显示区域的大小innerWidth/innerHeight

获取屏幕的完整大小:screen.width/height;

弹出窗口

方法:1、打开窗口:var newWindow=open("url","自定义的name","width=,height=,left=,top=");
        注意:1、第三个配置参数没有传入时,窗口大小和浏览器一样,并且黏在浏览器上面(融为一体)
              2、写入了第三个实参,则会脱离浏览器并且一个独立的小窗口,并且可以保存起来,设置为他绑定事件
              3、宽高不能设置的太小了,有最小值
    2、关闭窗口:window/newW.close();
    3、修改窗口的大小:newW.resizeTo(new宽,new高);
    4、修改窗口的位置:newW.moveTo(x,y);

浏览器一共提供了3种弹出框

    1、警告框:alert();
2、用户输入框:var user=prompt("提示文字","默认值");
3、用户输入框:var bool=confirm("提示文字");

定时器:

	1、周期性定时器
		开启:timer=setInterval(callback,间隔毫秒数);
		停止:clearInterval(timer)

	2、一次性定时器
		开启:timer=setTimeout(callback,间隔毫秒数);
		停止:clearTimeout(timer)

	注意:一次性和周星期底层都是一样的,甚至可以呼唤,所以你到底以后用哪个无所谓

	面试题:函数 和 循环 和 定时器都能反复执行操作,区别? - 时机
		1、函数 - 用户触发、程序员调用
		2、循环 - 一瞬间基本就结束了
		3、定时器 - 等待一段时间做一次

history对象:

保存【当前窗口】的历史记录(打开【过】的url),可用于

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

*navigator对象:

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

属性:navigator.userAgent; - 能够得到一个字符串,包含着是什么浏览器以及版本号,想办法去拿到你需要的部分

HTML5(语义化标签、增强型表单、音频视频)和CSS3(过渡、动画、转换、媒体查询、阴影、弹性盒子、rem...)和ES5以上的任何东西,老IE都是不支持的,所以要做兼容

BOM确实有很多具有兼容性问题,但是我们不需要自己使用navigator去做兼容,前辈们帮我们已经做好了

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

一个url网址由哪些部分组成 - 5部分

http://127.0.0.1:8020/bom02/new/03navigator%E5%AF%B9%E8%B1%A1.html?__hbt=1663118768002

www.baidu.com/swd=%E5%B1%…

协议名://域名:端口号/路由?请求消息

协议名:https、http、ftp、ws(直播)...

域名/主机号:底层大家都是主机号,域名是需要花钱购买的

端口号:默认端口可以省略不写,https默认端口为443,http默认端口为80

*文件的相对路径/路由:百度把他加密了隐藏起来了 - 决定着用户看到的是哪个网页

*查询字符串/请求消息:客户端发送到服务器端的东西,服务器端需要接住然后判断我们请求的是什么,才能进行响应 - 和后端进行沟通交流的关键点

目的:为了学习全栈开发而准备

获取这五个部分

我们可以通过location得到这个url的每一个部分,但是不要记忆,直接console.log输出location就能直接看到

                        协议名:location.protocal
			域名:location.hostname
			端口号:location.port
			路由:location.pathname//重要
			请求消息:location.search//重要

跳转

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

event对象:事件对象

事件:用户触发的 或 浏览器自动触发的(onload)

绑定事件:3种

在HTML页面上绑定事件

        <elem on事件名="js语句"></elem>

缺点:

1、不符合内容(html)与样式(css)与行为(js)的分离的原则

2、无法动态绑定事件(一次只能绑定一个元素)

3、无法同时绑定多个函数对象

**在js中使用元素的事件处理函数属性:

			elem.on事件名=function(){
				操作
			}

优点:

1、符合内容(html)与样式(css)与行为(js)的分离的原则

2、动态绑定事件

3、*没有兼容性问题

缺点: 1、无法同时绑定多个函数对象 - 个人觉得其实不是缺点,为什么不把两个功能放到一起

使用专门的事件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、具有兼容性问题

事件周期:

主流:3个阶段

1、捕获阶段,记录着要发生的事件有哪些

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

3、冒泡触发,向上触发所有的记录着的事件

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

获取事件对象event:

主流:会自动作为事件处理函数的第一个形参传入

                    elem.on事件名=function(e){e->event}

老IE:

                          event;
		

兼容:

        var e=event//不光老IE可用,主流也可以用 - 小三上位

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

获取鼠标的坐标/位置

1、绑定事件:事件处理函数形参可以写一个e,自动获取到事件对象event - 明日的重点

2、获取坐标:3种

                            e.screenX/Y - 获取鼠标相对于屏幕的位置
			e.clientX/Y   - 获取鼠标相对于客户端/浏览器的位置
			**e.pageX/Y    - 获取鼠标相对于页面的坐标

应用:点不到的广告,鼠标跟随动画

鼠标跟随动画

1、事件window/document.onmousemove

2、js的加载速度比图片的加载速度快,加载事件:onload事件(加载完成)

3、删除图片,实在动画开始时开启了定时器

    提前设置好图片的html和css(定位)
    在window.onmousemove事件中渲染图片设置其绝对定位的位置
    又在onload事件中设置你的动画和删除图片的定时器
阻止冒泡 - 笔试面试中:开发几乎不用

主流: e.stopPropagation()

老IE:

            e.cancelBubble=true;

兼容:

        e.cancelBubble=true; //不光老IE可用,主流也可以用 - 小三上位\
*事件委托/利用冒泡 - 笔试面试开发中

优化:如果多个子元素定义了相同 或 相似的事件,最好只给父元素定义一次

为什么:每次绑定一个事件函数,其实都是创建了一个事件对象,创建的事件对象越多,网站的性能越差

淘汰this:水性杨花,当前元素

认识一个目标元素:target:你点击的是哪一个,永远就是那一个

主流:e.target;

老IE:e.srcElement;

兼容:e.srcElement; //不光老IE可用,主流也可以用 - 小三上位 例

                  bigbox.onclick = function (e) {
                            var el = e.srcElement
                            if (el.nodeName == "BUTTON") {
                            //操作(nodeName是当前点击的冒泡元素的标签名)
                            }
                 }
阻止浏览器的默认行为:

a标签默认跳转页面,右键自带一个弹出框,F12打开一个控制台,F5会刷新

主流:e.preventDefault();

老IE:e.returnValue=false;

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

新事件:

    window.oncontextmenu=()=>{//鼠标右键事件}
    window.onkeydown=()=>{//键盘事件 - 我们不做游戏开发}
获取键盘的键码:
	e.keyCode; // 不需要去记忆键码,要么百度查看,要么直接输出查看
		

最后强调:1、BOM重要的只有两个:定时器 和 event