BOM对象和方法

442 阅读9分钟

BOM对象和方法

什么是BOM

BOM是browser object model的缩写 简称浏览器对象模型 是浏览器的额一个实例

主要处理浏览器窗口和框架 秒速与浏览器进行交互的方法和接口 访问和操作浏览器窗口 通常浏览器特定的JavaScript扩展都被看做BOM的一部分

BOM的主要扩展

  1. 弹出新的浏览器窗口
  2. 移动关闭浏览器窗口以及调整窗口大小
  3. 提供WEB浏览器详细信息的定位对象
  4. 提供用户屏幕分辨率详细信息的屏幕对象
  5. 对Cookie的支持
  6. IE扩展了BOM 加入了ActiveXObject类 可以通过JavaScript实例化Active对象

BOM的组成

  1. Window JavaScript层级中顶层对象表示浏览器窗口
  2. Navigator 包含客户端浏览器的信息
  3. History 包含了浏览器窗口访问过的URL
  4. Location 包含了当前URL的信息
  5. Screen 包含了客户端显示屏的信息

BOM和DOM的关系

JavaScript语法的标准化组织是ECMA

DOM的标准化组织是W3C

BOM每个浏览器都有自己的标准

BOM包括window对象上面的属性和方法 还包括window的属性中的对象的属性和方法

这些对象上面有构造函数 构造函数定义了方法 通过原型的方式来继承 通过原型的方式来继承

比如screen屏幕中提供了一些具体方法 navigator导航中提供了一些具体方法…

BOM的组成

  • Window JavaScript 层级中的顶层对象表示浏览器窗口

    window对象是BOM的顶层对象 他有双重角色 是通过JavaScript访问浏览器窗口的一个接口 也是ES规定的Global对象(有权访问parseInt等方法)

    • 全局中声明的变量 对象和函数都会变成window对象的属性和方法

      定义在全局上和定义在window上的区别:全局变量不能通过delete操作符删除 因为var添加的window属性有一个[Configrable]特性 并且被设置为false 而定义在window对象上的属性可以 在IE8及以下 delete删除window属性会报错 IE9以上不会

      尝试访问未声明的变量会抛出错误 但是通过查询window对象可以知道这个变量是否存在

    • window.inner包含滚动条的宽度 clientwidth这两个可视区域不包含滚动条的宽度 各个浏览器提供了一样的几个属性 innerWidth outerWidth等 但是范围不一样 例如outerWidth 有的是返回浏览器本身尺寸 有的是浏览器窗口大小

    • window.resize调整浏览器窗口大小 但是也可能被禁用

    • window.screenX(firefox)||window.screenLeft(opera中使用这个)

      typeof window.screenLeft == "number" ? window.screenLeft : window.screenX

      在IE和欧鹏中 即使浏览器上面紧贴屏幕上面 也会返回工具栏的高度 而且窗口由于设置外边距而偏移的时候会返回精确计算的值 而其他浏览器会返回0 而且窗口由于设置外边距而偏移的时候不会返回精确计算的值 会返回不偏移的时候的值

    • window.moveTo||window.moveBy 让浏览器窗口移动到某个位置 但是可能会被禁用 在欧鹏和IE7最高版本中就是禁用的

    • window.parent表示包含当前框架的框架 在子页面中使用window.parent可以得到父页面的window对象 也可以得到属性 但是不能操作父页面的dom元素(iframe:再页面中又嵌套一个完整的页面 可以通过数值或框架的名称来索引) 在页面中没有框架的时候window.parent=window.top=window

    • window.top拿到页面最顶级的框架 也就是浏览器窗口 它可以确保在一个框架中正确的访问另一个框架 而window指的都是当前框架自己的实例

      在全局上var parent=10其实是取出window的属性进行赋值了 top也是 可以直接用top.xxx进行访问框架 window.top不能被赋值

    • window.self之前window是可以被赋值的 用 window.self==window可以防止冲突赋值 引入的目的只是为了与top和parent对象对应起来 属性返回指向当前 window 对象的引用 window、self、window.self 是等价的

      if (window.top!=window.self) {
          document.write("<p>这个窗口不是最顶层窗口!当前窗口在一个框架中</p>")
      }
      else{ 
          document.write("<p>这个窗口是最顶层窗口!当前窗口不在一个框架中</p>")
      } 
      //在一个框架表示是不是被其他框架包含在内
      
    • window.name设置后在不同的网页中都可以取到这个值 也是iframe形成父子之间通信的媒介之一 除非最高层窗口是通过window.oped打开的 否则其对象的name属性不会包含任何值

    • window.confirm 确定或取消 返回布尔值

    • window.alert

    • window.prompt 弹出输入框 没输入就返回null

      在一些浏览器中如果打开了多个对话框 那么从第二个对话框开始每个对话框都会显示一个复选框 用来阻止后续对话框的显示

    • window.find查找对话框

    • window.print打印对话框

      其他两个可以用js打开的对话框 不会受对话框计数器控制 也不受禁用后续对话框显示的影响

    • window.onbeforeunload ie10以下可以写提示信息

    • window.open打开一个新窗口 参数为网址、名字、特征值、在浏览历史中创建新的url还是替换当前url 写了特征值会在另外一个浏览器打开 没写会在当前浏览器中打开 可以打印新窗口里面的属性 但是不能操作 最后一个参数只在不打开新窗口的情况下使用 返回一个指向新窗口的引用

      可以用close方法关闭新打开的窗口 关闭之后对象的引用还在 但是由于很多人用于广告 所以浏览器激起了限制 也有很多浏览器设置了弹出窗口屏蔽程序

    • 超时调用setTimeout和间歇调用setInterval

      //用setTimeout模拟setInterval
      var num = 0
      var max = 10
      function incrementNumber(){
          num++
          if(num < max){
              setTimeout(incrementNumber, 500)
          }else{
              alert("done")
          }
      }
      console.log("hahah")
      
  • Navigator包含客户端浏览器的信息 他是所有支持JavaScript的浏览器所共有的 navigator的属性通常用于检测浏览器类型

    • navigator.name(输出的全是navigator)

    • navigator.plugins检测插件 非ie浏览器可以使用plugins数组检测 包括name(插件名) description(插件描述) filename(文件名) length(插件处理的MIME类型数量)等属性 检测IE的插件比较麻烦

    • navigator.codename(输出的全是mozilla)

    • navigator.appVeison(比userAgent少一个信息)

    • navigator.userAgent:返回内核 操作系统 浏览器 版本号等等 浏览器发送请求的时候会把这个浏览器的信息放在http协议中一起发送到服务器上,得到相应的请求结果 可以再headers中->provisional headers are shown中找到

    • navigator.cookieEnabled:浏览器自动把cookie发送到服务器之中 true表示启用

    • navigator.online:是否处于脱机状态

    • navigator.registerContentHandler/registerProtocolHandler注册处理程序 可以让一个站点知名他可以处理特定类型的消息 默认使用一些在线应用程序来处理消息

  • History包含了浏览器窗口访问过的URL 从窗口被打开的那一刻起 因为history是window对象的属性 因此每个浏览器窗口 每个标签页乃至每个框架都有自己的history对象 该对象和特定的window对象相关联

    • history.forward

    • history.back

    • history.go(负数往回跳 正数往前跳) 也可以传递一个字符串参数 此时会跳转到历史记录中包含该字符串的第一个位置 可能后退也可能前进 具体要看哪个位置最近 如果历史记录不包含该字符串则这个方法什么也不做

      history.go("worx.com")
      //跳转到最近的worx.com页面
      
    • history.screen可用的属性有width和height

    • history.length保存历史记录的数量 这个数量包括所有(向前和向后的)历史记录 对于加载到窗口.框架中的第一个页面而言 该属性值为0

  • Location包含了当前URL的信息 都是可读可写的属性

    location是最有用的bom对象之一 提供了与当前窗口中加载的文档有关的信息 还提供了一些导航功能

    它是window对象的属性 也是document对象的属性 也就是说window.locationdocument.location引用的是同一个对象

    • location.host:主机 hostname可以修改

    • location.pathname:路径

    • location.search:参数 会显示编码之后的参数 设置的时候必须加? 可以创建一个函数用来解析参数

    • location.hash:锚点 设置的时候必须加# 改变的时候页面不会刷新 可以做单页面应用 点击导航改变锚点 路由监听到锚点变化会对页面做出改变 而且不会刷新

    • location.port:端口号

      以上的属性重写之后都会为url设置一个新的值 页面会重新以该url加载 在浏览器历史记录中生成一条新纪录 用户可以通过后退回到前一个页面 如果不想让用户回到跳转之前的页面 要使用location.replace方法

    • location.replace 这个方法不会在历史记录中生成新纪录 而是用新文档代替旧文档(得到一个新的url并且会替换浏览器历史记录中当前显示页面的url) 不能回退到跳转之前的文档

    • location.href:改变路径

    • location.protocol:协议

    • location.assign:加载新的页面资源 传递一个url作为参数即可

      如果是将location.href或者window.location设置为一个url值 也会以该值调用assign()方法

      下面两行代码与显式调用assign方法的效果完全一样

    • location.reload:重新加载显示房钱页面 参数为false或不填:可能会取缓存的文档 true从服务器重新拉取页面 位于reload调用之后的diamagnetic可能会也可能不会执行 取决于网络延迟或系统资源等因素 最好把reload代码放在最后一行

  • Screen包含客户端显示屏的信息 兼容性很差 只用来表明客户端的能力 其中包括显示器的信息如像素高度和像素宽度等 这些信息集中出现在测定客户端能力的站点跟踪工具中

    有可能会用到其中信息来 调整浏览器窗口大小 如window.resizeTo(screen.availWidth, screen.availHeight)

    运行ios的设备始终返回竖着拿手机的值 而安卓设备会调用screen.width和screen.height

小结

  1. 在使用框架的时候 每个框架都有自己的window对象以及所有原生构造函数及其他函数的副本 每个框架都存在frames集合中 可以通过位置或通过名称来访问

    有一些窗口指针可以用来引用其他框架如父框架

  2. navigator对象提供了与浏览器相关的信息 具体提供哪些信息由用户浏览器决定 不过也有一些公共属性userAgent存在所有浏览器中