文章目录
- 一、window对象
- 二、frames
- 三、窗口位置
- 四、窗口大小
- 五、导航和打开窗口
- 六、定时器
- 七、系统对话框
- 八、location对象
- 九、查询字符串参数
- 九、位置操作
- 十、navigator对象
- 十一、插件检测
- 十二、screen对象(几乎不用)
- 十三、history对象
- 总结
一、window对象
BOM核心对象是window,代表浏览器实例!
window有双重意思。1:是指JS访问浏览器窗口的接口。2:是ECMAScript规定的Global对象。
1
2
3
4*window(Global)对象 特点是全局作用域,并且在全局创建的变量是无法被删除的* 因为在创建全局变量的时候 该属性有一个configurable的属性,值为false (configurable参考javascript访问器属性Object.defineProperties)
1
2
3
4
5
6
7
8
9let newName = "crethy"; let person = { name:"bobra" }; window.newName //crethy delete window.newName; //false window.person.name //bobra delete window.person.name //true
二、frames
如果页面上包含多个框架,则每个框架都有自己的window对象,并且保存在frames集合中
可以通过window.frames[0] 或者 frames[0] 去访问
也可以通过frame标签的 name属性来访问 window.frames[“one”] 或者 frames[“one”]
1
2
3
4
5
6
7
8
9
10
11
12
13<html> <frameset row="160,*"> <!--frames[0] --> <frame src="one.html" name="one"></frame> <frameset cols="50%,50%"> <!--frames[1] --> <frame src="two.html" name="two"></frame> <!--frames[2] --> <frame src="three.html" name="three"></frame> </frameset> </frameset> </html>
window都有个name属性。这个属性通常情况下没有信息,
window.name // ’ ’
只有在最高层窗口 调用window.open() 打开的窗口这个name才有值
顺便提一下top对象和parent对象
top对象始终只想最外围的框架
parent对象表示包含当前框架的框架
三、窗口位置
因为opra和chrom支持的属性不一样所以要做一下判断
在IE、Opra中,screenLeft和screenTop中保存的是从屏幕左边和上边到浏览器左上角的距离px
在Chrome、Firefox、Safari中screenX或者screenLeft, screenY或者screenTop保存的是浏览器左上角相对于屏幕的坐标值(X,Y)
移动窗口这需要用到moveTo() 或者moveBy()函数 ***IE7以下版本是被禁止的
1
2
3
4
5
6
7
8
9//获取浏览器window对象的位置 let leftPosition = (typeof window.screenLeft == "number")?window.screenLeft:window.screenX: let topPosition = (typeof window.screenLeft == "number")?window.screenLeft:window.screenX: //将窗口移动到左上角(参照坐标屏幕左上角) window.moveTo(0,0); //将窗口当前位置向下移动100PX (参照坐标浏览器左上角) window.moveBy(0,100);
四、窗口大小
innerWidth innerHerght 保存的是浏览器 页面区域尺寸
outerWidth outerHeight 保存的是浏览器本身尺寸
document.documentElement.clientWidth document.documentElement.clientHeight 保存的是页面可视区域尺寸
1
2
3
4
5
6
7
8
9
10
11
12
13
14let pageWidth = window.innerWidth; let pageHeight = window.innerHeight; //BackCompat:标准兼容模式关闭;CSS1Compat:标准兼容模式开启 if(typeof pageWidth != "number"){ if(document.compatMode === "CSS1Compat"){ pageWidth = document.document.documentElement.clientWidth; pageHeight = document.document.documentElement.clientHeight; }else{ //混杂模式下兼容IE用的 pageWidth = document.document.body.clientWidth; pageHeight = document.document.body.clientHeight; } }
resizeTo()和resizeBy()可以调整浏览器窗口的大小
1
2
3window.resizeTo(100,100) // 调整到100*100 window.resizeBy(100,50) // 从目前大小新增 100 50
五、导航和打开窗口
window.open()可以导航到一个指定的URL,也可以打开一个新的浏览器窗口。这个函数可能接收4个参数
URL,窗口目标,一个特性字符串,一个表示新页面是否取代浏览器历史记录中当前加载页面的布尔值
最后一个参数只在不打开新窗口的情况下使用
在只传递两个参数的情况下
window.open(“https://www.xxxx.com”,“frameName”) 等同于
<a href=“https://www.xxxx.com” target=“frameName”>
window.open()第三个参数则是传递一串字符串包括以下属性
设置 | 值 | 说明 |
---|---|---|
fillscreen | yes/no | 代表浏览器窗口是否最大化 |
height | 数值 | 代表新窗口的高度 最低100px |
width | 数值 | 代表新窗口的宽度 最低100px |
location | yes/no | 代表浏览器窗口中是否显示地址栏(有的浏览器会禁用) |
menu把人 | yes/no | 代表浏是否在览器窗口显示菜单栏 默认no |
resizable | yes/no | 代表浏览器窗口是否最大 |
scrollbars | yes/no | 代表浏览器窗口是否最大化 |
status | yes/no | 代表浏览器窗口是否最大化 |
toolbar | yes/no | 代表浏览器窗口是否最大化 |
top | 数值 | 代表新开浏览器的上坐标 不能为负值(参照点屏幕左上角) |
left | 数值 | 代表新开浏览器的左坐标 不能为负值(参照点屏幕左上角) |
1
2window.open("https://www.xxxx.com","frameName","height=400,width=400,top=10,left=10");
window.open()函数不只是执行还会返回一个新窗口实例
可以通过实例对象属性去调整窗口
window.close() 关闭窗口函数,顶层窗口是不生效的,只能关闭顶层窗口调用window.open()新开的窗口
window.opener 这个属性保存着打开他的原始窗口对象,如果新开窗口和上层窗口存在通信的话那么
新的标签页就不能运行在独立的进程中,将此属性设置为null 就可以就表示在单独的进程中运行新的标签页
window.opener = null 一旦设置将无法恢复
1
2
3
4
5
6
7
8
9
10let newWindow = window.open("https://www.xxxx.com","frameName","width=100","height=100"); //调整窗口大小为(500px,500px) newWindow.resizeTo(500,500) //移动到距离屏幕左上角 20,20的位置 newWindow.moveTo(20,20) //关闭这个新窗口 newWindow.close() //切断和上一层窗口的通信,独立开一个进程 newWindow.opener = null
六、定时器
setTimeOut() 一次性定时器
setInterval() 周期性定时器
两者都是可以接受两个参数
第一个参数是 类似于eval()的功能的参数,无论输入什么都回去执行。
第二个参数是 需要执行的时间
两者都会返回一个定时器数值ID 可以通过接收这个返回数值去控制定时器的执行
1
2
3
4
5
6
7
8
9
10
11
12
13let timeOut = setTimeout(fucntion(){ console.log('666') },5000) //如果要清除它则需要在它触发之前调用 clearTimeout(timeOut) //周期性定时器 每3秒执行一次 let interval = setInterval(fucntion(){ console.log('666') },3000) clearInterval (interval)
七、系统对话框
浏览器通过alert()、confirm()、prompt() 函数可以调用系统对话框向用户展示消息。
系统对话框是浏览器自带的 跟网页没有任何关系,也无法通过CSS去更改样式。
好用的是这三个对话框是 同步执行的 ,也就是说显示这些对话框的时候代码会停止运行,关掉对话框代码才会继续运行
1
2
3
4
5
6
7
8
9
10//只有一个OK 调用完继续执行代码 alert('isOk?'); //一个cancel和一个OK 返回bool值可控制后续代码执行或者停止 let alertRes = confirm('isOk?'); //prompt('','') 接受两个参数 并且提供一个输入框 和OK cancel //第一个参数是提示信息,第二个参数类似input的palaceholder起到提示作用 let promptRes = prompt('Are you ok?','crethy'); //cancel返回null,OK返回用户输入的值
另外还有两个浏览器对话框可以通过JavaScript打开
window.print() //功能是 鼠标右键 打印当前网页
window.find() //功能是 键盘Ctrl + F 搜索当前页相同的字段
八、location对象
location是最有用的BOM对象之一,并且还是一个特殊的对象,既是BOM属性也是DOM属性
window.location ==>代表的就是BOM属性
document.location ==>代表的是DOM属性
但是 它们两引用的是同一个对象,所以属性key是一样的
- 图标省略了开头的location
属性名 | 例子 | 说明 |
---|---|---|
hash | “#content” | 返回URL中的hash(也就是#后跟0或者多个字符),如果URL不包含散列,则返回空字符串 ‘ ’ |
host | www.xxxx.com:80 | 返回服务器名称和端口号(如果有的话) |
hostname | www.xxxx.com | 返回服务器名称 |
href | http://www.xxxx.com | 返回完整的URL |
pathname | /pageOne/ | 返回RUL中的目录或者(文件名) |
port | “8080” | 返回端口号 |
protocal | “http” | 返回页面使用的通信协议 |
search | “?name=father” | 返回URL的查询字符串,以?号开头 |
九、查询字符串参数
虽然location对象可以访问大多数信息,但是对方问URL包含的查询字符串并不方便。尽管有location.search但是只是返回URL末尾的所有内容,没办法逐个返回,因此需要封装一个函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20//转行查询字符串为对象 let getQueryString = function(){ //获取查询的字符串 let queryStr = (location.search.length > 0 ? location.search.substring(1) : ''); //创建空的的查询对象 let queryObj = {}; let items = queryStr.length ? queryStr.split('&') : []; for(let i = 0;i < items.length; i++){ let item = items[i].split('='); let name = decodeURIComponent(item[0]); let value = decodeURIComponent(item[0]); name.length && queryObj[name] = value; } return queryObj; } //调用 //假设location.search的查询字符串是'?name=crethy&age=28'; let { name,age } = getQueryString() console.log(name); //creathy,28
九、位置操作
location对象可以通过很多方式改变浏览器的位置地址,通常用的以下三种方式
location.assign(url) 打开新的URL并在浏览器的历史记录中生成一条新的记录
location.href = url 该方式是最常用的
window.location = url
三种方式作用都是一样的,其实本质上都是调用了第一种方法 location.assign()
每次修改location的属性(hash除外),页面都会以新的URL重新加载
1
2
3
4
5
6
7
8
9
10
11
12//假设初始URL为 https://www.baidu.com/date/ //将URL修改为 https://www.baidu.com/date/#section1 location.hash = "#section1"; //将URL修改为 https://www.baidu.com/date/?name=crethy location.search = "?name=crethy"; //将URL修改为 https://www.CSDN.com/date/ location.hostname = "CSDN"; //将URL修改为 https://www.CSDN.com/newdate/ location.pathname = "newdate"; //将URL修改为 https://www.baidu.com:8080/date/ location.port = 8080;
使用以上的方法修改URL后,用户铁锅单机“后退”按钮,可以导航到上一个页面。要禁止这种行为的话可以使用replace()方法
replace()方法也能改变当前加载的URL,但不会在浏览器的历史记录中产生新的记录
1
2location.replace('URL');
与位置有关的最后一个方法是reload()
作用是重新加载当前页面,reload可以传递一个参数true,区别如下
- 最好将reload方法放在最后一行,因为reload调用后的代码可能会执行也有可能不会执行。这取决于网络延迟或者系统资源等因素
1
2
3location.reload(); //重新加载(有可能从缓存中加载) location.reload(true); //重新加载(从服务器重新加载)
十、navigator对象
navigator对象是所有支持javascript的浏览器所共有的对象,下表列出了存在于所有浏览器中的属性和方法
navigator对象的信息通常用来检测浏览器类型,是开发中浏览器兼容必要的信息
属性或方法 | 说明 | IE | Firefox | Safari/Chrome | Opera |
---|---|---|---|---|---|
appCodeName | 浏览器的名称 | 3.0+ | 1.0+ | 1.0+ | 7.0+ |
appMinorVersion | 次版本信息 | 4.0+ | - | - | 9.5+ |
appName | 完整的浏览器名称 | 3.0+ | 1.0+ | 1.0+ | 7.0+ |
appVersion | 浏览器版本 | 3.0+ | 1.0+ | 1.0+ | 7.0+ |
buildID | 浏览器编译版本 | - | 2.0+ | - | - |
cookieEnabled | 表示cookie是否启用 | 4.0+ | 1.0+ | 1.0+ | 7.0+ |
cpuClass | 计算机的CPU类型 | 4.0+ | - | - | - |
javaEnabled() | 表示浏览器中是否启用了Java | 4.0+ | 1.0+ | 1.0+ | 7.0+ |
language | 浏览器的主语言 | - | 1.0+ | 1.0+ | 7.0+ |
mimeTypes | 在浏览器中注册的MIME类型数组 | 4.0+ | 1.0+ | 1.0+ | 7.0+ |
onLoine | 表示浏览器是否联网 | 4.0+ | 1.0+ | - | 9.5+ |
opsProfile | 4.0+ | - | - | - | |
oscpu | 客户端的操作系统或者使用的CPU | - | 1.0+ | - | - |
platform | 浏览器所在的系统平台 | 4.0+ | 1.0+ | 1.0+ | 7.0+ |
plugins | 浏览器安装的插件信息数组 | 4.0+ | 1.0+ | 1.0+ | 7.0+ |
preference() | 设置用户的首选项 | - | 1.5+ | - | - |
product | 产品名称 | - | 1.0+ | 1.0+ | - |
prudoctSub | 关于产品的次要信息 | - | 1.0+ | 1.0+ | - |
register-ContentHandler() | 针对特定的MIME类型将一个站点注册为处理程序 | - | 2.0+ | - | - |
register-ProtocalHandler() | 针对特定协议将一个站点注册为处理程序 | - | 2.0 | - | - |
securityPolicy | 已废弃 | - | - | - | - |
systemLanguage | 操作系统的语言 | 4.0+ | - | - | - |
taintEnabled() | 已废弃 | - | - | - | - |
userAgent | 浏览器的用户代理字符串 | 3.0+ | 1.0+ | 1.0+ | 7.0+ |
userLanguage | 操作系统默认语言 | 4.0+ | - | - | 7.0+ |
userProfile | 介意访问用户个人信息的对象 | 4.0+ | - | - | - |
vendor | 浏览器品牌 | - | 1.0+ | 1.0+ | - |
venderSub | 有关供应商的次要信息 | - | 1.0+ | 1.0+ | - |
十一、插件检测
检测浏览器中是否安装了特定的插件是一种最常见的流程。可以使用plugins数组来达到这个目的(IE除外)
name:插件的名字
describtion:插件的描述
filename:插件的文件名
length:查检所处理的MIME类型数量
原始检测方法如下
1
2
3
4
5
6
7
8
9
10
11
12let hasPlugin = function(name){ let name = name.toLowerCase(); for(let i = 0;i < navigator.plugins.length;i++){ if(navigator.plugins[i].name.toLowerCase().indexOf(name) > -1){ return true; } } return false; } //检测Falsh插件 console.log(hasPlugin('Falsh'));
IE浏览器比较特殊,只有一种方法检测插件
IE是以COM对象方法实现插件的,而COM对象使用唯一标识符来标识
1
2
3
4
5
6
7
8
9
10
11
12let hasPlugin = function(name){ try{ //尝试创建一个特定的插件实例 new ActiveXObject(name); return true; //成功则为true } catch(err){ return false; //失败就是false } } //检测Falsh Falsh的唯一标识符是ShockwaveFlash.ShockwaveFlash console.log(hasPlugin('ShockwaveFlash.ShockwaveFlash'));
十二、screen对象(几乎不用)
W3C查看,菜鸟教程,或者《javascript高级程序设计》上面都有介绍
十三、history对象
每个窗口,每个框架(frame)都有自己的history对象,它可以通过go()方法在不知道URL的情况下做出浏览器前进后退的功能
history.go() 可以传递数字也可以传递字符串
1
2
3
4
5
6
7
8
9//后退一页 history.go(-1) //前进一页 history.go(1) //前进两页 history.go(2) //传递字符串的的话 有可能前进,也有可能后退 history.go("baidu.com") //跳转到距离当前页最近的baidu.com网页
另外还有两个简写的history.go()方法
history.back() //等于history.go(-1)
history.forward() //等于history.go(1)
总结
文章有点长,参考《javaScript高级程序设计这本书》。
毕竟谁会拒绝在摸鱼的时候复习一下以前忘掉的知识呢。
最后
以上就是鲤鱼哈密瓜最近收集整理的关于前端BOM详解的全部内容,更多相关前端BOM详解内容请搜索靠谱客的其他文章。
发表评论 取消回复