[关闭]
@demonly 2017-01-23T12:19:27.000000Z 字数 5917 阅读 1144

BOM

JavaScript


window 对象

window对象表示浏览器的实例。在网页中定义的任何一个对象、变量和函数都以 window 对象作为其 Global 对象。

全局作用域

由于 window 对象同时也是 global 对象,全局作用域下声明的变量和函数都会成为 window 对象的变量和方法。但是这之间又有所区别,它作为 window 对象的属性时可以被 delete 操作符删除,而作为 var 声明的全局变量时则不行。

另外,尝试访问未声明的变量会报错但是通过查询 window 对象的属性不会报错。

窗口关系及框架

页面中的每个框架都拥有自己的 window 对象,保存在 frames 集合中。可以通过数值索引(从0开始,从左至右,从上到下)或者框架的 name 特性来访问相应的 window 对象。

parent 对象始终指向当前框架的上层框架。self 始终指向 window 对象。

窗口位置

关于窗口位置 Firefox 使用 screenX 和 screeY 来表示,其他浏览器中同时使用 screenX、screenY、screenLeft 和 screenTop 表示。

使用 moveTo()方法和 moveBy() 方法可以移动浏览器位置,这两个方法都接受两个参数,x 和 y。

窗口大小

IE9+, Firefox, Chrome, Opera 和 Safari 均提供 innerWieght 和innerHeight 属性来表示浏览器视口大小 outerWieght 和outerHeight 表示浏览器窗口大小。

对于 IE8及以下在标准模式下要使用 document.document.clientWeight,混杂模式下要使用 document.body.clientWeight
对于各种浏览器的兼容,W3C 给出的解决方法是

  1. var w=window.innerWidth
  2. || document.documentElement.clientWidth
  3. || document.body.clientWidth;

使用 resizeTo()方法和 resizeBy()方法可以调整浏览器窗口大小,这两个方法都接受两个参数,x 和 y。

导航和打开窗口

window.open()方法可以接受四个参数。
需要加载的 URL、窗口目标、一个特性字符串以及一个表示新页面是否取代浏览器历史记录中当前页面的布尔值。

第二个参数可以是已有窗口名或者是框架名,如果不传入窗口目标就是在当前页打开。如果传入一个当前不存在的窗口或框架名则打开一个新窗口并命名为此。也可以是特殊窗口名称_self、_parent、_top、_blank。

弹出窗口

第三个参数可以设置弹出的新窗口的一系列属性,如果不打开新窗口则会忽略第三个参数。不传入第三个参数,则会打开新的标签页,传入第三个参数(即使是无意义的)则会打开新的窗口,默认的窗口样式是没有工具栏只有导航栏的窗口化窗口(FireFox下为最大化)。
`

  1. window.open("https://www.baidu.com/","_blank","left=0,toolbar=yes")
设置 说明
height 表示新窗口的高度,仅 Chrome 不支持
weight 表示新窗口的宽度,仅 Chrome 不支持
left 表示新窗口的 x 坐标,仅 IE 支持
top 表示新窗口的 y 坐标,仅 IE 支持
fullscreen 表示浏览器是否最大化,仅 IE 支持
resizable 表示是否能够通过拖动浏览器边框改变窗口大小,仅 IE 支持
scrollbars 表示页面超出视口时是否允许滚动,仅 IE 和 FireFox支持
toolbar 表示是否显示工具栏,仅 FireFox 支持

安全限制

为了防止弹出窗口的滥用,大多浏览器都对弹出窗口进行了诸多的限制。

在 IE 中会屏蔽自动弹窗,在 onclick 触发后到打开窗口前有异步任务完成也会被认为是自动打开的窗口,解决方法是先打开一个空白窗口,异步任务结束之后再为其指定路径。

弹出窗口屏蔽程序

对于弹窗的屏蔽有两种,一种是浏览器内置的弹窗屏蔽,一种是外部程序的弹窗屏蔽功能。

  1. var block = false;
  2. try {
  3. var wroxWin = window.open("https://www.baidu.com/","_blank");
  4. if (wroxWin == null) {
  5. blocked = true;
  6. }
  7. } catch (ex) {
  8. blocked = true;
  9. }
  10. if (blocked) {
  11. alert("The popup was blocked");
  12. }

系统对话框

在弹出对话框时 JS 会暂停运行,对话框关闭后恢复。

locatin 对象

location 对象提供了与所加载的文档有关的信息还提供了一些导航功能,它既是 window 的属性也是 document 的属性。

属性名 示例 说明
hash "#430842" 返回 URL 中的 hash(#后面跟着的字符)
host "www.zybuluo.com:80" 返回服务器名称和端口号
hostname "www.zybuluo.com" 返回服务器名称
href "https://www.zybuluo.com/mdeditor#430842" 返回完整 URL
pathname "/mdeditor" 返回目录或文件夹名
port "80" 返回端口号
protocol "https:" 返回页面使用的协议
search "?q=javascript" 返回 URL 的查询字符串,即问号后面的内容

查询字符串参数

查询字符串中包含多个参数,它们之间使用 & 连接。每一个参数又是由 name = value 的形式构成,其中的 name 和 value 都是编码过的.
因此,如果需要查看每个字符串就要首先取得查询字符串并去掉开头的问号。然后通过&来分隔各个参数。对于每个参数通过 = 分割出 name 和 value 两个部分,最后通过 decodeURIComponent() 来对 name 和value 解码。

  1. function getQueryStringArgs () {
  2. //获取查询字符串并去掉问号
  3. var qs = (location.search.length > 0 ? location.search.substring(1) : ""),
  4. //初始化变量
  5. args = {},
  6. items = qs.length ? qs.split("&") : [],
  7. item = null,
  8. name = null,
  9. value = null,
  10. i = 0,
  11. len = items.length;
  12. //对每一项参数添加到 args 中作为 args 的属性
  13. for (i=0; i < len; i++) {
  14. item = items[i].split("=");
  15. name = decodeURIComponent(item[0]);
  16. value = decodeURIComponent(item[1]);
  17. if (name.length) {
  18. args[name] = value;
  19. }
  20. }
  21. return args;
  22. }
  23. var args = getQueryStringArgs();

对于编码有三种方式

位置操作

使用 location 对象可以改变浏览器的位置。

navigator 对象中记录了与浏览器和系统有关的许多属性,以下是部分属性。

属性 描述
cookieEnabled 返回指明浏览器中是否启用 cookie 的布尔值。
onLine 返回指明系统是否处于脱机模式的布尔值。
platform 返回运行浏览器的操作系统平台。
plugins 浏览器中安装的插件信息的数组
systemLanguage 返回 OS 使用的默认语言。
userAgent 返回由客户机发送服务器的 user-agent 头部的值。
userLanguage 返回 OS 的自然语言设置。

顺便补充一点浏览器标识
userAgent 返回浏览器标识,以下是 win10 下的 Edge 浏览器的返回值。
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586"

只有 Firefox 在的 user-agent 中没有进行伪装。
"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0"
appVersion 在其他浏览器中都是 useragent 去掉开头的 Mozilla,如:
"5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586"
Firefox 中的 appVersion 为"5.0 (Windows)"

检测插件

对于非 IE 浏览器,navigator.plugins[]数组储存了所安装的所有插件,每一项都包含有以下属性。

只要对插件名进行检索就可以知道插件是否存在。

  1. function hasPlugin(name) {
  2. name = name.toLowerCase();
  3. for (var i=0; i < navigator.plugin.length; i++) {
  4. if (navigator.plugin [i].name.toLowerCase().indexOf(name) > -1){
  5. return true;
  6. }
  7. }
  8. return false;
  9. }

IE 中的插件是以 COM 对象的方式实现的,COM 对象以 COM 标识符来标识。在 IE 中插件有专有的类型 ActiveXObject,尝试创建一个插件的实例创建成功就说明插件存在。

  1. function hasIEPlugin(name){
  2. try {
  3. new ActiveXObject(name);
  4. return true;
  5. } catch (ex){
  6. return false;
  7. }
  8. }

screen 对象

screen 对象储存了关于显示器的信息,其中大多属性为只读。以下为部分属性。

属性 说明
width 屏幕像素宽度
availWidth 屏幕除去系统部件后的可用宽度
availLeft 未被系统部件占用的最左侧的像素值
colorDepth 颜色位数
deviceXDPI 屏幕实际的水平像素密度
logicalXDPI 屏幕逻辑水平像素密度
pixelDepth 屏幕位分辨率

screen 对象可以用来通过屏幕大小调整浏览器窗口大小。另外 IOS 中屏幕大小始终返回竖屏下大小。

history 对象

history 对象保存着用户的历史记录,出于安全考虑,无法获取用户历史记录的实际 URL,但是依然可以调用 history 对象的方法来实现前进和后退。下面给出几个例子。

  1. //后退一页
  2. history.go(-1);
  3. //前进两页
  4. history.go(2);
  5. //跳转到最近的 wrox.com 页面中,可以前进也可以后退
  6. history.go("worx.com");
  7. //后退一页
  8. history.back();
  9. //前进一页
  10. history.forward();

在大量使用 ajax 的今天,页面往往都不需要再刷新,因此就无法在使用前进与后退。因此 history 对象中提供了一个 state 属性来保存一些与 ajax 的历史记录有关的数据。可以通过 pushState()方法和 replaceState()方法来写入这个属性。这两个属性都接受三个参数,要储存的数据、页面标题和页面 URL。其中页面 URL 必须与页面在同一个域内。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注