JavaScript中BOM知识总结

1 何为BOM

  • BOM(Browser Object Model)即浏览器对象模型。
  • BOM提供了独立于内容 而与浏览器窗口进行交互的对象;
  • 由于BOM主要用于管理窗口与窗口之间的通讯,因此其核心对象是window;
  • BOM由一系列相关的对象构成,并且每个对象都提供了很多方法与属性;
  • BOM缺乏标准,JavaScript语法的标准化组织是ECMA,DOM的标准化组织是W3C,BOM最初是Netscape浏览器标准的一部分。

2 BOM学习内容

主要学习与浏览器窗口交互的一些对象,例如可以移动、调整浏览器大小的window对象,可以用于导航的location对象与history对象,可以获取浏览器、操作系统与用户屏幕信息的navigator与screen对象,可以使用document作为访问HTML文档的入口,管理框架的frames对象等。
BOM和DOM结构关系如下图所示:
这里写图片描述
BOM的核心是Window,而Window对象又具有双重角色,它既是通过js访问浏览器窗口的一个接口,又是一个Global(全局)对象。这意味着在网页中定义的任何对象,变量和函数,都以window作为其global对象。

Window对象包含属性:document、location、navigator、screen、history、frames;

Document根节点包含子节点:forms、location、anchors、images、links;

从window.document已然可以看出,DOM的最根本的对象是BOM的window对象的子对象。

区别:DOM描述了处理网页内容的方法和接口,BOM描述了与浏览器进行交互的方法和接口。

2.1 window对象

  • 所有浏览器都支持 window 对象,它表示浏览器窗口。
  • 所有 JavaScript 全局对象、函数以及变量均自动成为 window 对象的成员。
  • 全局变量是 window 对象的属性。
  • 全局函数是 window 对象的方法。

window对象的属性:

属性 描述
window 指示当前窗口,与self等效
document 对Document对象的只读引用,参阅Document对象
history 对History对象的只读引用,参阅History对象
location 用于窗口或框架的Location对象,参阅Location对象
screen 对Screen对象的只读引用,参阅Screen对象
navigator 对Navigator对象的只读引用,参阅Navigator对象
defaultStatus 窗口底部状态栏显示的默认状态消息
innerheight / innerwidth 返回窗口文档显示区的高度/宽度
outerheight / outerwidth 返回窗口文外部的高度/宽度
pageXOffset / pageYOffset 设置或返回当前页面相对于窗口显示区左上角的X/Y位置
parent 指向包含另一个窗口的窗口(由框架使用)
top 包含特定窗口的最顶层窗口
status 描述由用户交互导致的状态栏的临时消息
frames 窗口中的框架对象数组
length 窗口中的框架数
offscreenBuffering 用于绘制新窗口内容并在完成后复制已存在的内容,控制屏幕更新

window对象方法

方法 描述
window.close() 关闭窗口
window.alert(“message”) 弹出一个具有OK按钮的系统消息框,显示指定的文本
window.confirm(“Are you sure?”) 弹出一个具有OK和Cancel按钮的询问对话框,返回一个布尔值
window.prompt(“What’s your name?”, “Default”) 提示用户输入信息,接受两个参数,即要显示给用户的文本和文本框中的默认值,将文本框中的值作为函数值返回
window.status 可以使状态栏的文本暂时改变
window.defaultStatus 默认的状态栏信息,可在用户离开当前页面前一直改变文本
window.setTimeout(“alert(‘xxx’)”, 1000) 设置在指定的毫秒数后执行指定的代码,接受2个参数,要执行的代码和等待的毫秒数
window.clearTimeout(“ID”) 取消还未执行的暂停,将暂停ID传递给它
window.setInterval(function, 1000) 无限次地每隔指定的时间段重复一次指定的代码,参数同setTimeout()一样
window.clearInterval(“ID”) 取消时间间隔,将间隔ID传递给它
window.history.go(-1) 访问浏览器窗口的历史,负数为后退,正数为前进
window.history.back() 同上
window.history.forward() 同上
window.history.length 可以查看历史中的页面数
clearInterval() 取消由 setInterval() 设置的 timeout
clearTimeout() 取消由 setTimeout() 方法设置的 timeout
createPopup() 创建一个 pop-up 窗口
moveBy() 可相对窗口的当前坐标把它移动指定的像素
moveTo() 把窗口的左上角移动到一个指定的坐标
open() 打开一个新的浏览器窗口或查找一个已命名的窗口
print() 打印当前窗口的内容
resizeBy() 按照指定的像素调整窗口的大小
resizeTo() 把窗口的大小调整到指定的宽度和高度
scrollBy() 按照指定的像素值来滚动内容
scrollTo() 把内容滚动到指定的坐标
setInterval() 按照指定的周期(以毫秒计)来调用函数或计算表达式
setTimeout(方法,秒数) 在指定的毫秒数后调用函数或计算表达式
timeOutEvent = setTimeout(“longPress(‘” + obj + “’)”,1500) 定时器传参数

注:setTimeout只执行一次code,如果要多次调用,可以让code自身再次调用setTimeout();setInteval()会不停地调用code,直到clearInterval()被调用。

  • 在使用框架时,每个框架都有自己的 window 对象以及所有原生构造函数及其他函数的副本。每个框架都保存在 frames 集合中,可以通过位置或通过名称来访问。
  • 有一些窗口指针,可以用来引用其他框架,包括父框架。
  • top 对象始终指向最外围的框架,也就是整个浏览器窗口。

窗口位置:
IE、Safari、Opera和Chrome 都提供了screenLeft 和 screenTop 属性,分别用于表示窗口相对于屏幕左边和上边的位置。Firefox 则在screenX 和 screenY 属性中提供相同的窗口位置信息,Safari和Chrome也同时支持这两个属性。Opera虽然也支持 screenX和screenY属性,但与screenLeft和screenTop属性并不对应。
可以使用如下方法跨浏览器获得窗口左边和上边位置:

var leftPos = (typeof window.screenLeft == "number") ?
                    window.screenLeft : window.screenX;
var topPos = (typeof window.screenTop == "number") ?
                    window.screenTop : window.screenY;

2.2 Location对象

location 对象是很特别的一个对象,因为它既是 window 对象的属性,也是
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 “8080” 返回URL中指定的端口号。如果URL中不包含端口号,则这个属性返回空字符串
protocol “http:” 返回页面使用的协议。通常是http:或https:
search “?q=javascript” 返回URL的查询字符串。这个字符串以问号开头

location.search 返回从问号到 URL 末尾的所有内容,解析查询字符串,然后返
回包含所有参数的一个对象。
与位置有关的方法
使用location.assign("http://www.wrox.com")可以立即打开新 URL 并在浏览器的历史记录中生成一条记录。等同于:

window.location = "http://www.wrox.com";
location.href = "http://www.wrox.com";

replace()方法可以导航到新页面,但不会在历史记录中生成新记录,不能回到前一个页面。
reload()方法作用是重新加载当前显示的页面。如果调用 reload()时不传递任何参数,页面就会以最有效的方式重新加载。也就是说,如果页面自上次请求以来并没有改变过,页面就会从浏览器缓存中重新加载。如果要强制从服务器重新加载,则需要为该方法传递参数 true。

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

2.3 Navigator对象

navigator`对象:包含大量有关Web浏览器的信息,在检测浏览器及操作系统上非常有用。

2.4 Screen对象

用于获取某些关于用户屏幕的信息,也可用window.screen引用它。

2.5 History对象

history 对象有一个 length 属性,保存着历史记录的数量。这个数量包括所有历史记录,即所有向后和向前的记录。
go()方法可以在用户的历史记录中任意跳转,可以向后也可以向前。这个方法接受一个参数,表示向后或向前跳转的页面数的一个整数值。负数表示向后跳转,正数表示向前跳转。给go()方法传递一个字符串参数,此时浏览器会跳转到历史记录中包含该字符串的第一个位置——可能后退,也可能前进,具体要看哪个位置最近。如果历史记录中不包含该字符串,那么这个方法什么也不做。可以使用两个简写方法back()forward()来代替 go()
这里写图片描述
能力检测(特性检测)
两个原则:

  • 先检测达成目的的最常用的特性。先检测最常用的特性可以保证代码最优化,因为在多数情况下都可以避免测试多个条件。
  • 必须测试实际要用到的特性。一个特性存在,不一定意味着另一个特性也存在。

更可靠的方式是使用typeof 进行能力检测。

//检查 sort 是不是函数
function isSortable(object){
return typeof object.sort == "function";
}

在浏览器环境下测试任何对象的某个特性是否存在,要使用下面这个函数:

function isHostMethod(object, property) {
var t = typeof object[property];
return t=='function' ||(!!(t=='object' && object[property])) ||
                t=='unknown';
}

事件参数e
当事件发生的时候,系统会自动的给事件处理函数传递一个参数,会提供事件相关的一些数据,事件参数e浏览器的兼容性检测:

e = e || window.event

IE的document对象有一个all属性,它的里面存放了页面的所有标签,而其它浏览器是没有的,所以在IE中,事件对象的传播会绑定在全局的windows上,所以IE浏览器肯定是都支持window.event的;firefox只支持事件对象作为参数传入,而这又恰恰是IE6~8所无法实现的。IE9/chrome/opera/safari,则两种方式都支持。

获得计算后的样式方法
w3c标准:window.get ComputedStyle(element, null)[attr]
IE浏览器:element.currentStyle[attr]
兼容方法:

function getStyle(element, attr) {
        if(window.getComputedStyle) {
            return window.getComputedStyle(element, null)[attr];
        } else {
            return element.currentStyle[attr];
        }
    }

猜你喜欢

转载自blog.csdn.net/shiyangxu/article/details/81480770