BOM
(浏览器对象模型)则无疑才是真正的核心。window
对象window
,它表示浏览器的一个实例。在浏览器中window
对象既是经过JavaScript访问浏览器窗口的一个接口,又是ECMAScript规定的Global
对象,所以有权访问parseInt()
等方法window
对象的属性和方法。window
对象上定义属性仍是有一点差异:全局变量不能经过delete
操做符删除,而直接定义在window
对象上的属性能够var age = 29; window.color = "red"; // 在IE < 9 时抛出错误,在其余浏览器里返回 false delete window.age; // 在IE < 9 时抛出错误,在其余浏览器里返回 true delete window.color; console.log(window.age); // 29 console.log(window.color); // undefined
var
语句添加的window
属性有一个名为[[Configruable]]的特性,这个特性的值被设置为false
,所以不可经过delete
删除。IE8及更早版本在遇到使用delete
删除window
属性的语句时,无论该属性最初如何建立的,都会抛出错误,以示警告。window
对象,能够知道某个可能未声明的变量是否存在// 这里会抛出错误 oldValue 未定义 var newValue = oldValue; // 这里不会抛出错误,由于这是一次属性查询 // newValue的值是 undefined var newValue = window.oldValue;
window
对象,而且保存在frames
集合中。frames
集合中,能够经过数值索引(从0开始,从左至右,从上到下)或者框架名称来访问相应的window
对象。每一个window
对象都有一个name
属性,其中包含框架的名称。<html> <head> <title> Frameset Example</title> </head> <frameset rows="160, *"> <frame src="frame.htm" name="topFrame"> <frameset cols="50%, 50%"> <frame src="anotherframe.htm" name="leftFrame"> <frame src="yetanotherframe.htm" name="rightFrame"> </frameset> </frameset> </html>
window.frames[0]
或者window.frames["topFrame"]
来引用上方的框架,不过最好使用top
而非window
。例如 top.frames[0]
top
对象始终指向最高(最外层)的框架,也就是浏览器窗口。top
相对的另外一个window
对象是parent
。parent
(父)对象始终指向当前框架的直接上层框架。在某些状况下parent
有可能等于top
,但在没有框架的状况下,parent
必定等于top
。此时他们都是window
用来肯定和修改window
对象位置的属性和方法有不少。javascript
screenLeft
和 screenTop
属性,分别用于表示相对屏幕左边和上边的位置。screenX
和 screenY
属性中提供相同的窗口位置信息, Safari, Chrome也同时支持这两个属性。screenX
和 screenY
属性,但与 screenLeft
和 screenTop
并不对应,所以建议你们不要在 Opera中使用。// 肯定 screenLeft 和 screenTop 属性是否存在 // 存在,是在 IE, Safari, Opera, Chrome // 不然,是在 Firefox中 var leftPos = (typeof window.screenLeft == "number") ? window.screenLeft : window.screenX; var topPos = (typeof window.screenTop == "number") ? window.screenTop : window.screenY;
top.screenX
top.screenY
值。即便在页面因为被设置了外边距发生偏移的状况下,相对于window
对象使用top.screenX
top.screenY
每次也都会返回相同的值。而IE Opera则会给出框架相对于屏幕辩解的精确坐标值。moveTo()
和 moveBy()
方法,却是有可能将窗口的精确地移动到一个新位置。这两个方法都接受两个参数// 将窗口移动到屏幕左上角 window.moveTo(0, 0); // 将窗口向下移动100像素 window.moveBy(0, 100); // 将窗口移动到(200, 300) window.moveTo(200, 300); // 将窗口向左移动50像素 window.moveBy(-50, 0);
window
对象使用。跨浏览器肯定一个窗口的大小不是一件简单的事情。html
innerwidth
innerHeight
outerWidth
outerHeight
。outerWidth
outerHeight
返回浏览器窗口自己的尺寸(不管是从最外层的window
对象仍是从某个框架访问)。innerwidth
innerHeight
则表示容器中页面视图区的大小(减去边框宽度)。var pageWidth = window.innerWidth; var pageHeight = window.innerHeight; // document.compatMode 这个属性将在第10章讨论 if (typeof pageWidth != "number") { if (document.compatMode == "CSS1Compat") { pageWidth = document.documentElement.clientWidth; pageHeight = document.documentElement.clientHeight; } else { pageWidth = document.body.clientWidth; pageHeight = document.body.clientHeight; } }
resizeTo()
和 resizeBy()
方法能够调整浏览器窗口的大小。须要注意,这两个方法也可能被浏览器禁用。在Opera和IE7+中默认禁止window
对象使用// 调整到 100 x 100 window.resizeTo(100, 100); // 调整到 200 x 150 window.resizeBy(100, 50); // 调整到 300 x 300 window.resizeTo(300, 300);
window.open()
方法既能够导航到一个特定的URL,也能够打开一个新的浏览器窗口。接受四个参数:java
_self
, _parent
, _top
, _blank
)// 等同于 <a href="http://www.wrox.com" target="topFrame"></a> window.open("http://www.wrox.com", "topFrame");
window.open()
传递的第二个参数并非一个已经存在的窗口或者框架,那么该方法就会根据在第三个参数位置上传入的字符串建立一个新窗口或者新标签。设置 | 值 | 说明 |
---|---|---|
fullscreen | yes/no | 表示浏览器窗口是否最大化。仅限IE |
height | 数值 | 表示新窗口的高度。不能小于100 |
width | 数值 | 表示新窗口的宽度。不能小于100 |
left | 数值 | 左坐标,不能是负值 |
top | 数值 | 上坐标。不能是负值 |
location | yes/no | 表示是否在浏览器窗口中显示地址栏。不一样浏览器的默认值不一样。若是设置为no,地址栏可能会隐藏,也可能会禁用,取决于浏览器 |
menubar | yes/no | 是否显示菜单栏。默认no |
resizeable | yes/no | 是能够拖动窗口大小。默认值no |
scrollbars | yes/no | 是否容许滚动。默认no |
status | yes/no | 是否显示状态栏。默认no |
toolbar | yes/no | 是否显示工具栏。默认no |
window.open()
方法会返回一个指向新窗口的引用,大体与其余window
对象一致,但咱们能够进行更多操做控制。数组
window.open()
建立的还口不容许咱们针对朱浏览器窗口调整大小或移动位置,但却容许咱们针对经过window.open()
建立的窗口调整大小或移动位置。var wroxWin = window.open("http://www.wrox.com", "wroxWindow", "height=400,width=400,top=10,left=10,resizable=yes"); // 新建立的window对象有一个opener属性 // 保存打开它的原始窗口对象 // 而原始窗口不跟踪打开的新窗口,没有指向新窗口对象的属性 console.log(wroxWin.opener == window); // true // 调整大小 wroxWin.resizeTo(500, 500); // 移动位置 wroxWin.moveTo(100, 100); // 关闭新打开的窗口 // 这个方法仅限于经过 window.open() 打开的弹出窗口 // 对于主窗口若是没有获得用于的容许是不能关闭它的。 wroxWin.close(); // 弹窗关闭后,窗口的引用仍然还在 // 但除了检测其closed属性没有其余用处 console.log(wroxWin.closed); // true
window
对象之间须要彼此通讯,那么新标签就不能运行在独立的进程中。null
,即表示在单独的进程中运行新标签var wroxWin = window.open("http://www.wrox.com", "wroxWindow", "height=400,width=400,top=10,left=10,resizable=yes"); wroxWin.opener = null;
window.open()
极可能返回null
。此时只要检查这个返回值就能够肯定弹窗是否被屏蔽。var wroxWin = window.open("http://www.wrox.com", "_blank"); if (wroxWin == null) { console.log("The popup was blocked!"); }
window.open()
一般会抛出错误。所以不但要检测返回值,还要将对 window.open()
的调用封装在一个 try-catch
块中var bloacked = false; try { var wroxWin = window.open("http://www.wrox.com", "_blank"); if (wroxWin == null) { bloacked = true; } } catch (ex) { bloacked = true; } if (blocked) { console.log("The popup was blocked!"); }
// 第一个参数传递字符串,不推荐! setTimeout('alert("Hello World!");', 1000); // 推荐的方式 setTimeout(() => { alert("Hello World!"); }, 1000);
var timeoutId = setTimeout(() => { alert("Hello World!"); }, 1000); // 取消执行 clearTimeout(timeoutId);
this
的值在非严格模式下 指向 window
,在严格模式下是 undefined
。setInterval()
用法与上述相似alert()
, confirm()
, prompt()
方法能够调用系统对话框向用户显示消息。系统对话框与浏览器中显示的网页没有关系,不包含HTML,外观由操做系统和浏览器设置决定。打开对话框都是同步和模态的。也就是说,这些对话显示的时候,代码会中止执行,而关掉这些对话框又会恢复执行。confim()
返回一个布尔值,表明用户选择"ok"仍是"cancel"prompt()
返回一个字符串或者null
,输入了值并肯定,返回字符串,其余方法关闭返回null
print()
find()
。没什么卵用location
对象location
是最有用的BOM对象之一,它提供了与当前窗口中加载的文档有关的信息,还提供一些导航功能。location
对象既是window
对象的属性,也是document
对象的属性;换言之,window.location
document.location
引用的是同一个对象。属性名 | 例子 | 说明 |
---|---|---|
hash | "#contents" | 返回 URL 中的hash(#号后跟零或多个字符),若是URL中不包含散列,则返回空字符串 |
host | "www.wrox.com:80" | 返回服务器名称和端口号(若是有) |
hostname | "www.wrox.com" | 返回服务器名称不带端口号 |
href | "http:/www.wrox.com" | 返回当前加载页面的完整URL。而location对象的toString()方法也返回这个值 |
pathname | "/WileyCDA/" | 返回URL中的目录或者文件名 |
port | "www.wrox.com" | 返回端口号。若是没有端口号,返回空字符串 |
protocol | "http:" | 返回页面使用的协议。一般是 http: https: |
search | "?q=javascript | 返回URL查询字符串。这个字符串以问号开头 |
location
对象大多数信息,可是其中访问URL包含查询字符串的属性并不方便。尽管location.search
返回从问号到URL末尾的全部内容,但却没有办法逐个访问其中的每一个查询字符串参数。funcction getQueryStringArgs() { // 取得查询字符串并去掉开头的问号 var qs = (location.search.length > 0 ? location.search.substring(1) : ""); // 保存数据的对象 var args = {}; // 取得每一项 var items = qs.length ? qs.split("&") : []; var item = null; var name = null; var value = null; // 在for循环中使用 var i = 0; var len = items.length; // 逐个将每一项添加到args对象中 for (var 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; }
assign()
方法,并为其传递一个URL。当即打开新的URL并在浏览器的历史记录中生成一条记录。若是是将location.href
或window.location
设置为一个URL值,也会以该值调用assign()
方法。location.assign("http://www.wrox.com"); window.location = "http://www.wrox.com"; location.href = "http://www.wrox.com";
hash
, search
, hostname
, pathname
, prot
属性设置为新值来改变URL// 假设初始URL为 http://www.wrox.com/WileyCDA/ // 将URL修改成 http://www.wrox.com/wileyCDA/#section1 location.hash = "#section1"; // 将URL修改成 http://www.wrox.com/wileyCDA/?q=javascript location.search = "?q=javascript"; // 将URL修改成 http://www.wrox.com/wileyCDA/ location.hostname = "www.yahoo.com" // 将URL修改成 http://www.yahoo.com/mydir/ location.pathname = "mydir" // 将URL修改成 http://www.yahoo.com:8080/wileyCDA/ location.port = 8080;
replace()
方法。这个方法只接受一个参数,即要盗号的URL。虽然结果会致使浏览器位置改变,但不会在历史记录中生成新记录。在调用replace()
方法后,用户不能回到前一个页面reload()
做用是从新加载当前页面的显示。若是不传参,页面就会以最有效的方式从新加载。若是页面上次请求一来并无改变过,页面就会从浏览器缓存中从新加载。若是要强制从服务器从新加载,则须要像下面这样为该方法传递参数true
reload()
调用以后的代码可能会也可能不会执行,这要取决于网络延迟或系统资源等因素。为此最好将reload()
放在代码的最后一行navigator
对象navigator
对象表现是一致的,也有一套本身的属性属性或方法 | 说明 | IE | Firefox | Safari/Chrome | Opera |
---|---|---|---|---|---|
appCodeName | 浏览器的名称。一般都是Mozilla ,即便在非Mozilla浏览器中也是如此 |
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+ |
mineTypes | 表示当前浏览中注册的MIME类型数组 | 4.0+ | 1.0+ | 1.0+ | 7.0+ |
onLine | 表示浏览器是否链接到了因特网 | 4.0+ | 1.0+ | - | 9.5+ |
oscpu | 客户端计算机的操做系统或使用的CPU | - | 1.5+ | - | - |
platform | 浏览器所在的系统平台 | 4.0+ | 1.0+ | 1.0+ | 7.0+ |
plugins | 浏览器中安装的插件信息的数组 | 4.0+ | 1.0+ | 1.0+ | 7.0+ |
preference | 设置用户的首选项 | - | 1.5+ | - | - |
product | 产品名称 如Gecko | - | 1.0+ | 1.0+ | - |
productSub | 关于产品的次要信息 | - | 1.0+ | 1.0+ | - |
registerContentHandler() | 针对特定的MIME类型将一个站点注册为处理程序 | - | 2.0+ | - | - |
registerProtocolHandler() | 针对特定的协议将一个站点注册为处理程序 | - | 2.0+ | - | - |
securityPolicy | 已经废弃。安全策略的名称。为了与Netscape Navigator4向后兼容而保留下来 | - | 1.0+ | - | - |
systemLanguage | 操做系统的语言 | 4.0+ | - | - | - |
taintEnabled() | 已废弃。表示是否容许变量被修改。为了与Netscape Navigator3向后兼容而保留下来 | 4.0+ | 1.0+ | - | 7.0 |
userAgent | 浏览器的用户代码字符串 | 3.0+ | 1.0+ | 1.0+ | 7.0+ |
userLanguage | 操做系统的默认语言 | 4.0+ | - | - | 7.0+ |
userProfile | 借以访问用户我的信息的对象 | 4.0+ | - | - | - |
vendor | 浏览器的品牌 | - | 1.0+ | 1.0+ | - |
vendorSub | 有关供应商的次要信息 | - | 1.0+ | 1.0+ | - |
检测浏览器中是否安装了特定的插件是一种最多见的检测历程。对于非IE浏览器,可使用plugins数组来达到这个目的。该数组中的每一项都包含下列属性。浏览器
// 检测插件(在IE中无效) function hasPlugin(name) { name = name.toLowerCase(); for (var i=0; i < navigator.plugins.length; i++) { if (navigator.plugins[i].name.toLowerCase().indexOf(name) > -1) { return true; } } return false; } // 检测flash console.log(hasPlugin("Flash")); // 检测QuickTime console.log(hasPlugin("QuickTime"));
ActiveXObject
类型,并尝试建立一个特定插件的实例。IE是以COM对象的方式实现插件的,而COM对象使用惟一标识符来标识。所以要想检测特定的插件,就必须知道其COM标识符,例如Flash的标识符是ShockwaveFlash.ShockwaveFlash
。知道惟一标识符后,就能够编写下面的函数来检测// 检测IE中的插件 function hasIEPlugin(name) { try { new ActiveXObject(name); return true } catch (ex) { return false; } } // 检测flash console.log(hasIEPlugin("ShockwaveFlash.ShockwaveFlash")); // 检测QuickTime console.log(hasIEPlugin("QuickTime.QuickTime"));
// 检测全部浏览器中的Flash function hasFlash() { var result = hasPlugin("Flash"); if (!result) { result = hasIEPlugin("ShockwaveFlash.ShockwaveFlash"); } return result; }
plugins
集合有一个名叫refresh()
的方法,用于刷新plugins
以反映最新安装的插件。这个方法接收一个参数:表示是否应该从新加载页面的一个布尔值。若是将这个值设为true,则会从新加载包含插件的全部页面;不然只更新plugins
集合,不从新加载页面。registerContentHandler()
和 registerProtocolHandler()
方法可让一个站点知名它能够处理特定类型的信息。随着RSS阅读器和在线电子邮件程序的信息,注册处理程序就为像使用桌面应用程序同样默认使用这些在线应用程序提供了一种方式。registerContentHandler()
接收三个参数:缓存
// 要将一个站点注册为处理RSS源的处理程序 navigator.registerContentHandler("application/rss+xml", "http://www.somereader.com?feed=%s", "Some Reader");
registerProtocolHandler()
也是三个参数安全
// 要将一个应用程序注册为默认的邮件客户端 navigator.registerProtocolHandler("mailto", "http://www.somemailclient.com?cmd=%s", "Some Mail Client");
history
对象history
对象保存着用户上网的历史记录,从窗口被打开的那一刻算起。由于history
是window
对象的属性,所以每一个浏览器窗口,每一个标签页,乃至每一个框架都有本身的history
对象与特定的window
对象关联。go()
方法能够在用户的历史记录中任意跳转,能够向前向后,接受一个参数整数值或者字符串。// 后退一页 history.go(-1); // 前进一页 history.go(1); // 前进两页 history.go(2); // 传入字符串会跳转到历史记录中包含该字符串的第一个位置 // 若是没有包含的记录,则什么都不作 history.go("wrox.com");
back()
和 forward()
。这两个方法模仿浏览器的“后退”“前进”按钮history
还有一个length
属性,保存着历史记录的数量。包括全部的历史记录,即全部向前和向后的记录。对于加载到窗口、标签页或框架中的第一个页面而言,hitosty.length
等于0if (history.length == 0) { // 这里应该是用户打开窗口后的第一个页面 ... }