ECMAScript是JavaScript的外围,而BOM(浏览器对象模型,Browser Object Model)是在Web中应用JavaScript的外围。

BOM对象中,window对象是最顶层对象,在浏览器环境中它是一个Global全局对象,其它对象是window对象的子对象(属性)。BOM次要用于治理浏览器窗口及窗口之间的通信。上面是BOM对象的组成构造。

window对象

windowBOM的外围对象,示意浏览器的一个实例。有双重角色,即是通过JavaScript拜访浏览器窗口的一个接口,又是ES规定的Global对象。这意味着在网页中定义的任何一个对象、变量和函数,都以window作为其Global对象。

var age = 29;function sayAge() {    console.log(this.age);}console.log(window.age);    // 29sayAge();                    // 29window.sayAge();            // 29

如上所示,在全局作用域中定义的变量和函数都被主动归在了window对象名下。而sayAge()存在于全局作用域中,办法中的this.age被映射到window.age,因而显示的依然是正确的后果。

然而,定义的全局变量不能通过delete操作符删除,定义在window对象上的属性却能够。

window除了locationnavigatorscreenhistorydocument外,还有一些属性。

  • window.console:返回Console对象的援用,能够向浏览器控制台输入日志信息。仅用于调试,不应该给用户出现。(只读)
  • window.frames:数组对象,列出以后窗口的所有间接子窗口。(只读)
  • window.frameElement:以后窗口嵌入另一个窗口(嵌入<object>、<iframe>),如果以后窗口是顶层,返回null。(只读)
  • window.innerHeight:窗口的视图可见高度(单位:像素),也包含滚动条高度。(只读)
  • window.innerWidth:窗口的视图可见宽度(单位:像素),也包含滚动条的宽度。(只读)
  • window.length:以后窗口中蕴含框架数量。框架为<frame><iframe>。(只读)
  • window.locationbar:查看visibility属性的地址栏对象,用来示意是否可见。(只读)
  • window.localStorage:拜访Document源的对象Storage;将数据存储在浏览器会话中。相似sessionStorage,但数据可长期保留;而页面会话完结时,sessionStorage数据会革除。(只读)
  • window.menubar:查看visibility属性的菜单栏对象,用来示意是否可见。(只读)
  • window.outerHeight:整个浏览器窗口的高度(单位:像素)。(只读)
  • window.outerWidth:整个浏览器窗口的宽度(单位:像素)。(只读)
  • window.parent:以后窗口或子窗口的父窗口的援用。(只读)
  • window.personalbar:查看visibility属性的集体工具栏对象,用来示意是否可见。(只读)
  • window.scrollX:页面程度方向滚动间隔(单位:像素),window.pageXOffset是别名。(只读)
  • window.scrollY:页面垂直方向已滚动间隔(单位:像素),window.pageYOffset是别名。(只读)
  • window.scrollbars:查看visibility属性的滚动条对象,用来示意是否可见。(只读)
  • window.self:指向以后window对象的援用。
  • window.sessionStorage:容许拜访以后源的sessionStorage对象。与localStorage类似,不同在于sessionStorage在页面会话完结时革除,而localStorage没有过期工夫。
  • window.top:窗口层级最顶层窗口的援用。
  • window.windowwindow对象自身。

介绍了一些window的属性,上面咱们看一下对于window的办法。

音讯框

window有三种音讯框:正告框 alert、确认框confirm和提示框prompt

window.alert(message)会显示一个正告对话框,下面显示有指定的文本内容以及一个确定按钮。例如window.alert("正告框来袭");的显示如下:

window.confirm(message)是一个具备可选音讯的模态框。用于验证是否承受用户操作的确认框。

var result = window.confirm("你要来到吗?");if (result) {    // 按下确定后执行的操作    console.log("确定");} else {    // 按下勾销后执行的操作    console.log("勾销");}

运行后果:

window.prompt(text, value) 是用于显示文字信息提醒用户输出文字的提示框。

  • text参数为提醒用户输出信息的提醒内容,可省略。
  • value参数为文本输入框中的默认值,可省略。
var result = window.prompt("你的生日是什么时候的?", "1997-01-01");if (result == "2011-10-23") {    alert("你和我生日一样耶!");}

成果如下:

点击确定后,文本输入框中文字被返回。如果为空,则返回一个空字符串。点击勾销后,返回null

三个办法都具备梗塞效应,一旦弹出对话框,整个页面就暂停执行,期待用户做出反馈。

window还有几种办法管制窗口。例如open()close()stop()moveBy()/moveTo()resizeBy()/resizeTo()。上面介绍一下他们的性能。

窗口关上 & 敞开

window.open(url, target, features, replace)办法用于创立新的窗口。

  • url参数为新窗口加载的URL
  • target参数为新窗口的名字。每个窗口都有一个window.name,这里能够指定窗口用于弹窗,如果不存在,新建窗口。这个名字可用作<a><form>的属性target的值。字符串中不能含有空白字符。留神:target不是新窗口题目。
  • features参数为字符串值,内容用逗号分隔,参数不能有空格,例如width=200,height=100
var params = 'scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no,width=0,height=0,left=-1000,top=-1000';window.open('/', 'test', params);

features能够设置的值有:

  • left/top:新窗口的最右边(left)与最顶部(top)的间隔(单位:像素)。新窗口可见,不能设置在屏幕以外。
  • width/height:新窗口的宽度和高度(单位:像素)。宽高不得小于100
  • outerWidth/outerHeight:整个浏览器窗口的宽高。(单位:像素)。宽高不得小于100
  • menubar:是否显示菜单栏。
  • toolbar:是否显示工具栏。
  • location是否显示地址栏。
  • personalbar:是否显示用户装置的工具栏。
  • status:是否显示状态栏。
  • resizable:新窗口是否可调整大小。
  • scrollbars:是否呈现滚动条。
  • titlebar:是否显示标题栏。
  • close:是否显示敞开按钮。

同源策略,窗口只可拜访雷同协定下的内容(雷同协定://domain:port)。

window.close()办法用于敞开以后窗口,个别只用来敞开window.open()办法新建的窗口。应用window.closed属性来判断窗口是否被敞开。

在以后窗口中敞开窗口:

window.close();

window.stop()办法等同于单击浏览器的进行按钮。因为脚本加载程序,该办法不能阻止曾经蕴含在加载中的文档,但能阻止图片、新窗口和提早加载的对象的加载。

window.stop();

窗口挪动

window.moveBy(deltaX, deltaY)办法依据指定的值,挪动以后窗口。

  • deltaX:窗口在程度方向挪动的像素值。
  • deltaY:窗口在垂直方向挪动的像素值。

window.moveTo(x, y)办法将以后窗口挪动到指定的坐标地位。

  • x:程度方向挪动的横坐标
  • y:竖直方向挪动的纵坐标

moveBy()产生的是绝对挪动,moveTo()产生的是相对挪动。

当合乎下列状况时,一般网页中的JavaScript无奈通过调用该函数来挪动浏览器窗口:

  1. 以后窗口或标签页不是由window.open办法创立的;
  2. 以后标签页所在的窗口蕴含有多个标签页。

window.resizeBy(xDelta, yDelta)办法用于调整窗口的大小。

  • xDelta:窗口程度方向变动的像素值。
  • yDelta:窗口垂直方向变动的像素值。

window.resizeTo(aWidth, aHeight)办法用于调整窗口的大小。

  • aWidth:整数,示意新的outerWidth(单位:像素)。
  • aHeight:整数,示意新的outerHeight(单位:像素)。

resizeBy()绝对大小形式调整窗口大小,resizeTo()相对大小形式调整窗口大小。

根据上面的规定,一般网页中的JavaScript无奈通过调用该函数来调整浏览器窗口大小:

  1. 不能设置哪些不是通过window.open创立的窗口或Tab的大小;
  2. 当一个窗口外面蕴含有一个以上Tab时,无奈设置窗口的大小。

窗口滚动

window.scroll()滚动窗口至文档中的特定地位,
window.scrollBy()按窗口指定偏移量滚动文档,
window.scrollTo()滚动窗口至文档中的特定地位。

下面的三个办法的参数都能够是x-coordy-coord两个参数,或者options一个参数。

  • x-coord:程度方向像素点横坐标。
  • y-coord:垂直方向像素点纵坐标。

或者

  • options:一个ScrollToOptions字典。
// 在横轴上挪动到第100个像素置于窗口右边,在纵轴上挪动到第100个像素置于窗口顶部window.scroll(100, 100);// 或者window.scroll({    top: 100,    left: 100,    behavior: 'smooth'});

options有三个属性:

  • top:垂直方向滚动的像素值
  • left:程度方向滚动的像素值
  • behavior:滚动形式,smoothinstantauto,默认值auto

写法也一样,然而性能不一样。window.scrollBy()滚动指定的间隔,window.scroll()滚动至文档中的相对地位,window.scrollTo()实际上和window.scroll()办法是雷同的。

打印

window.print()办法关上打印对话框打印以后文档。

在开发我的项目中,有网页提供打印服务的话,咱们能够在页面中设置一个按钮,调用打印性能;但在之前,咱们须要判断是否反对打印性能。

if (typeof window.print === 'function') {    // 反对打印性能        document.getElementById('printLink').onclick = function () {        window.print();    }}

弹窗的聚焦/失焦

应用window.focus()window.blur()办法能够是窗口取得或失去焦点。

还有一些办法,这里就不介绍了。

location

location对象提供以后窗口中加载的文档无关信息,还提供了一些导航性能。即是window对象的属性,也是document对象的属性。还能够解析URL。上面列出一些location的属性。

  • location.href:残缺的URL值,容许更新。
  • location.origin:域名规范模式。蕴含协定、域名、端口号。
  • location.protocol:以后URL的协定,包含冒号(:)。
  • location.host:域名,蕴含:前面的端口号。
  • location.hostname:域名,不包含端口号。
  • location.port:端口号。
  • location.pathnameURL中门路的局部,从/开始。
  • location.searchURL参数局部,从问号?开始。
  • location.hash:块标识符局部,从#开始。
  • location.usernameURL域名前的用户名。
  • location.passwordURL域名前的明码。

只有origin属性是只读的,其它属性都可写。

咱们给出一个网址http://localhost:8088/mall/?page=1&userid=2#part=top,应用下面的属性来获取它。

location.href;        // http://localhost:8088/mall/?page=1&userid=2#part=toplocation.origin;    // http://localhost:8088location.protocol;    // http:location.host;        // localhost:8080location.hostname;    // localhostlocation.port;        // 8088location.pathname;    // /mall/location.search;    // ?page=1&userid=2location.hash;        // #part=top

然而location.search获取的是所有内容,没方法一一获取每个查问字符串参数。咱们能够创立一个函数用以解析并返回蕴含所有参数的对象。

function getQueryArgs() {    // 取的查问字符串并去掉结尾问号    var qa = (location.search.length > 0 ? location.search.substring(1) : ""),    // 保留数据的对象    args = {},    // 取的每一项    items = qa.length ? qa.split("&") : [],    // 每一项和该项的键值    item = null,name = null,value = null,    len = items.length;    // 一一将每一项增加到args对象中    for (let i = 0; i < len; i++) {        item = items[i].split("=");        name = decodeURIComponent(item[0]);        value = decodeURIComponent(item[1]);        if (name.length) {            args[name] = value;        }    }    return args;}

留神,如果对location.href写入新的URL地址,浏览器会立即跳转到这个新地址。

除了上述的属性外,location还有几个办法。

assign

location.assign(url)办法接管URL字符串来使浏览器立刻跳转。而参数有效时会报错。

location.assign('http://www.sample.com');

而给window.locationlocation.href两个属性赋值与调用assign()办法成果一样。

replace

location.replace()location.assign()办法相似,都是跳转到新的URL,但不会在浏览历史History外面生成新的记录,后退按钮无奈回到以后页面。当脚本发现以后是挪动设施时,能够应用replace跳转到挪动版网页。

// 跳转到新的网址location.replace('http://www.sample.com');

reload

location.reload(boolean)办法用于从新加载以后页面。当参数为false或为空时,浏览器将该网页从本地缓存从新加载并定位到以后地位。参数为true时,浏览器向服务器从新申请,并定位到顶部(即scroillTop===0)。

location.reload();            // 从新加载(有可能从缓存中加载)location.reload(true);        // 从新加载(从服务器从新加载)

reload()之后的代码有可能不会执行,取决于网络提早或系统资源等因素。最好将reload()放在代码最初一行。

location.toString()办法返回整个URL字符串,相当于读取location.href属性。

navigator对象

navigator用于获取以后浏览器信息。能够应用window.navigator属性检索navigator对象。

  • appCodeName:浏览器的代号名称。Mozilla,Netscape 6和IE5的外部名称都是Mozilla。(只读)
  • appName:浏览器的名称。因为兼容性问题,HTML5标准容许该属性返回Netscape。(只读)
  • appVersion:浏览器版本号。个别不与理论版本对应。(只读)
  • connection:提供NetworkInformation对象来获取设施的网络连接信息。(只读)
  • cookieEnabled:浏览器以后页面是否启用cookie。(只读)
  • geolocation:返回Geolocation对象,可拜访设施的地位信息。平安思考会提醒受权。(只读)
  • hardwareConcurrency:浏览器环境领有的CPU外围数。(只读)
  • keyboard:返回Keyboard对象,提供检索键盘布局图和切换从物理键盘捕捉按键的性能。(只读)
  • language:浏览器主语言。(只读)
  • languages:访客所应用的语言数组,按优先顺序排列。第一个元素赋给language,当值扭转时,window触发languagechange事件。(只读)
  • mimeTypes:返回MimeTypeArray对象,蕴含可被辨认的MimeType对象的数组。(只读)
  • maxTouchPoints:返回以后设施同时反对触摸接触点的最大数量。(只读)
  • onLine:示意浏览器以后是否联网。(只读)
  • oscpu:返回客户端计算机的操作系统或应用的CPU。在Firefox中能够获取此值。
  • permissions:返回一个可用于查问或更新某些APIs的权限状态的对象。(只读)
  • platform:浏览器所在零碎平台类型。不确定此值是否无效。(只读)
  • plugins:返回PluginArray对象,蕴含浏览器装置的所有插件。(只读)
  • product:以后浏览器产品名称。以兼容为目标,返回"Gecko"值。(只读)
  • serviceWorker:返回ServiceWorkerContainer对象,提供对ServiceWorker的注册、删除、降级和通信的拜访。(只读)
  • storage:返回单例StorageManager对象,用于保护数据的长久化存储,大抵确定存储数据的空间。(只读)
  • userAgent:返回以后浏览器的用户代理。(只读)
  • vendor:浏览器的供应商。例如Chrome中显示Google Inc.
  • vendorSub:无关供应商的主要信息。

在介绍一下navigator对象中的一些办法。

javaEnabled

javaEnabled()表明浏览器是否启用Java。是以后配置文件是否容许应用Java,而不是浏览器是否反对Java。

if (window.navigator.javaEnabled()) {    // 浏览器中Java可用}

sendBeacon

sendBeacon(url, data)是用于通过HTTP将大量数据异步传输到Web服务器。当传输胜利时会返回true

  • url为发送的地址;
  • dataArrayBufferViewBlobDOMString或者FormData类型的数据。

上面的例子展现了一个实践的统计代码——卸载事件处理器中尝试通过一个同步的XMLHttpRequest向服务器发送数据。这导致了页面卸载被提早。

window.addEventListener('unload', logData, false);func logData() {    var client = new XMLHttpRequest();    client.open("POST", "/log", flase);    // 第三个参数表明是同步的xhr    client.setRequestHeader("Content-Type", "text/plain;charset=UTF-8");    client.send(analyticsData);}

这就是sendBeacon()办法存在的意义。应用sendBeacon()办法会使用户代理在有机会时异步地向服务器发送数据,同时不会提早页面的卸载或影响下一导航的载入性能。这就解决了提交剖析数据时的所有的问题:数据牢靠,传输异步并且不会影响下一页面的加载。此外,代码实际上还要比其它技术简略许多!

上面的例子展现了一个实践上的统计代码模式——通过应用sendBeacon()办法向服务器发送数据。

window.addEventListener('unload', logData, false);function logData() {    navigator.sendBeacon("/log", analyticsData);}

registerProtocolHandler

registerProtocolHandler(scheme, url, title)能够让Web站点为本身注册能用于关上或解决特定协定的性能。

  • scheme:蕴含站点解决协定的字符串。例如,传入"sms"来注册解决SMS文本信息链接。
  • url:处理器的URL字符串。应该蕴含一个"%"占位符,会被将要受理的文档的escaped链接所替换。这个链接可能是一个实在URL,或者是一个电话号码,邮件地址之类的。
  • title:处理器题目。展现给用户,例如弹出"容许站点解决[scheme]链接吗?"或者在浏览器设置中列出注册的处理器时。
处理器的URL必须以http或者https协定标记结尾,最好是https,以满足一些浏览器出于平安思考的要求。

screen对象

screen对象示意以后屏幕窗口,往往指以后正被渲染的window对象,提供显示设施的信息。用途不大。次要介绍几种属性。

  • availTop:返回浏览器可用空间在屏幕上边的像素值。
  • availLeft:返回浏览器可用空间在屏幕右边的像素值。
  • availWidth:返回浏览器可用空间的程度宽度。
  • availHeight:返回浏览器可用空间的垂直高度。
  • colorDepth:返回屏幕的色彩深度(color depth)。依据CSSOM(CSS对象模型)视图,为兼容起见,该值总为24。
  • height:返回屏幕的高度(单位:像素)。
  • orientation:返回一个ScreenOrientation实例,示意以后屏幕的方向。
  • pixelDepth:返回屏幕的位深度/色调深度(bit depth)。依据CSSOM(CSS对象模型)视图,为兼容起见,该值总为24。
  • width:返回屏幕的宽度(单位:像素)。

history对象

history对象保留着浏览器的历史记录。出于平安思考,开发人员无奈得悉用户浏览器的URL。但能通过历史列表实现后退和后退。上面是history对象次要的属性。

  • length:返回以后窗口历史列表中的URL数量。
  • scrollRestoration:容许Web应用程序在历史列表上显示地设置默认滚动复原行为。
  • statehistory堆栈最上层的状态值。
const scrollRestoration = history.scrollRestoration;if (scrollRestoration) {    // 避免主动复原页面地位    history.scrollRestoration = 'manual';} else {    // 查看以后页面滚动复原行为    console.log('The location on the page is not restored, user will need to scroll manually.');}

还能够通过history提供的办法来拜访历史记录。

go

go()办法能够在用户的历史记录中任意跳转。传递数值为跳转的页数。

history.go(-1);        // 返回一页history.go(2);        // 后退两页

也能够传递历史记录中存在的字符串参数,如果历史记录中不蕴含传递的字符串,那什么也不做。

history.go("sample.com");

还能够应用 back() 办法后退和应用forward()办法后退来代替go()办法的性能。

留神,挪动到以前拜访过的页面时,页面通常是从浏览器缓存之中加载,而不是从新要求服务器发送新的网页。

pushState

pushState(state, title, url)办法可能在不加载页面的状况下在历史中增加一条记录。这个办法接管三个参数:

  • state参数是状态对象,与pushState增加的记录相关联。示意浏览器的state属性。
  • title参数是document.title的值,个别设定为null。浏览器大多会疏忽。
  • url参数指定新历史记录,用以扭转以后url。这个参数不能跨域,即协定,域名,端口必须是雷同的,如果呈现跨域的状况,即会提醒。
history.pushState({id:1}, null, '?page=1');

replaceState

replaceState(stateObj, title, url)办法用来批改history对象的以后记录,它是替换以后页面在浏览器的历史记录。假如以后网页是sample.com/index.html

history.pushState({id:1}, 'title1', '?page=1');    // URL显示为http://sample.com/index.html?page=1history.pushState({id:2}, 'title2', '?page=2');    // URL显示为http://sample.com/index.html?page=2history.replaceState({id:3}, 'title3', '?page=3');    // URL显示为http://sample.com/index.html?page=3history.back();    // URL显示为http://sample.com/index.html?page=1history.back();    // URL显示为http://sample.com/index.htmlhistory.go(2);    // URL显示为http://sample.com/index.html?page=3

postate事件

当增加或更改历史记录时,会触发popstate事件。如果被激活的历史记录条目是通过对history.pushState()的调用创立的,或者受到对history.replaceState()的调用的影响,popstate事件的state属性蕴含历史条目标状态的正本。

须要留神的是调用history.pushState()history.replaceState()不会触发popstate事件。只有在做出浏览器动作时,才会触发该事件,如用户点击浏览器返回按钮(或者在JavaScript代码中调用history.back()或者history.forward()办法)。

总结

BOM是以window对象为依靠的浏览器对象模型,它将浏览器当作一个对象,用于与浏览器窗口进行交互。window对象还是Global对象,全局变量和函数都是它的属性和办法,且所有原生的构造函数及其它函数也在它的命名空间下。但每个浏览器厂商都有本人的BOM实现,因而兼容性较差。

更多内容请关注公众号「海人的博客」,回复「资源」即可取得收费学习资源!