JavaScript高级程序设计 第8章 BOM 对象

本文详细介绍了JavaScript中的全局对象window,包括全局作用域、窗口关系与框架、窗口位置和大小的操作,以及导航和打开窗口的方法。还讨论了location对象、history对象以及screen对象的属性和方法。此外,提到了如何检测浏览器插件和处理注册程序。内容涵盖了JavaScript在浏览器环境中的重要概念和技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

8.1 window 对象
8.1.1 全局作用域
  • window 对象同时扮演着 ECMAScript 中的 Global 对象的角色
  • 在全局作用域定义的变量和函数,它们会被自动归在 window 对象名下
  • 全局变量和 window对象上直接定义的变量的差别是:
    • 全局变量不能通过 delete 删除,因为它的 configurable 为 false
    • window 对象上直接定义的变量可以通过 delete 删除
    • 访问声明的变量会报错,但是访问 window 下未声明的属性不会,因为是通过查询 window 对象下的属性
 
8.1.2 窗口关系及框架
  • 如果页面包含框架,则每个框架都拥有自己的 window 对象,并且保存在 frames 集合中。
  • 在 frames 集合中,可以通过数值索引(从 0 开始,从左至由,从上到下)。
  • 也可以通过框架名称来访问相应的 window 对象。每个 window 对象都有一个 name 属性,其中包含框架的名称。
<frameset rows="160, *"> // 第一个占160像素,第二个自适应占满剩下的全部
  <frame src="./1.html" name="topFrame">
  <frameset cols="50%,50%">
    <frame src="./2.html" name="leftFrame">
    <frame src="./3.html" name="rightFrame">
  </frameset>
</frameset>

 

  • top对象始终指向最高(最外)层的框架,也就是浏览器窗口。其中的 window 对象指向的都是那个框架的特定实例。
 
  • parent对象:parent对象始终指向当前框架的直接上层框架。在某些情况下,parent 有可能等于 top,但在没有框架的情况下 parent 一定等于 top。
  • 除非最高层窗口是通过 window.open() 打开的,否则其 window 对象的 name 属性不会包含任何值。
 
  • self 对象。它始终指向 window 
 
8.1.3 窗口位置
表示窗口左边和上边的位置
  • screenLeft、screenTop
    • 支持浏览器: IE、Safari、Chrome、Opera
  • screenX、screenY
    • 支持浏览器:Firefox、Safari、Chrome
 
跨浏览器取得窗口左边和上边的位置:
const leftPos = (typeof window.screenLeft === 'number') ? window.screenLeft : window.screenX
const topPos = (typeof window.screenTop === 'number') ? window.screenTop : window.screenY

 

问题:
  • Opera、IE 返回的是屏幕距离 页面可视区域的距离(返回的高度会少了浏览器工具栏的像素高度)
  • Chrome、Firefox、Safari 返回的是屏幕距离 整个浏览器窗口距离的距离
 
  • moveTo(x, y):把浏览器窗口移动到 x,y 坐标的位置。
  • moveBy(x, y):把浏览器窗口向左移动 x 的单位,向下移动 y 的单位。
 
8.1.4 窗口大小
  • innerWidth、innerHeight:表示该容器中页面视图的大小(减去边框宽度)
  • outerWidth、outerHeight:返回浏览器窗口本身尺寸(每个浏览器返回的值不一样)
let pageWidth = window.innerWidth, // IE8及以上不支持
  pageHeight = window.innerHeight
if (typeof pageWidth !== 'number') {
  if (document.compatMode === 'CSS1Compat') { // 判断页面是否属于标准模式
    pageWidth = document.documentElement.clientWidth
    pageHeight = document.documentElement.clientHeight
  } else {
    clientWidth = document.body.clientWidth
    pageHeight = document.body.clientHeight
  }
}

 

  • 移动设备
    • innerHeight、innerWidth 保存的是可见视口(屏幕上可见页面区域大小)
      • 移动 IE 不支持,只能通过 document.documentElement.clientWidth 访问
  • 在其他浏览器中,document.documentElement 保存的是布局视口,即渲染后页面的实际大小
    • 移动 IE 的话保存在 document.body 之中
 
8.1.5 导航和打开窗口
  • window.open() 既可以导航到一个特定的URL,也可以打开一个新的浏览器窗口
    • 参数:
      • URL
      • 打开的窗口目标或 _self、_parent、_top、_blank
      • 以逗号分隔的特性字符串,表示在新窗口都显示哪些特性
      • 是否取代浏览器历史记录中当前页面的布尔值
    • 返回值:返回一个指向新窗口的引用
    • PS:
      • 通过 window.open() 打开的新窗口可以调整大小或移动位置。
      • 新创建的 window 对象有一个 opener 属性,保存这打开它的原始窗口。如果把这个属性设置为 null,则表示不需要与原来的窗口进行通信。一旦切断,将无法恢复。
    • 弹出窗口屏蔽程序:
      • 如果是浏览器窗口内置的屏蔽程序阻止弹出的窗口,那么返回值有可能为null
      • 如果是浏览器插件或其他程序阻止的,window.open() 通常会抛出一个错误。
      • 以下是准确地检测出弹出窗口是否被屏蔽
let blocked = false
try {
  let wroxWin = window.open('https://www.baidu.com', '_black')
  if (wroxWin == null) {
    blocked = true
  }
} catch (e) {
  blocked = true
}

if (blocked)
  console.log('The popup was blocked')

 

 
 
8.1.6 间歇调用和超时调用
JavaScript 是一个单线程的解释器,因此在一定时间内只能执行一段代码。就有了 JavaScript 任务队列,这些任务会按照它们添加到队列的顺序执行。
 
  • 超时调用:setTImeout()
  • 间歇调用:setInterval()
    • 超时调用和间接调用的第一个参数都是要执行的代码,第二个参数表示告诉 JS 再过多久把当前任务添加到队列中。
    • 返回值是一个 ID(数字),表示超时调用,这个超时调用 ID 是计划执行代码的唯一标识,可以用它来取消超时调用。可以通过 clearTimeout(ID) 来取消超时调用
    • 在开发中一般很少使用 setInterval 因为间接调用的后一个调用可以在前一个调用之前执行
 
8.2 location 对象
  • 属性:
    • hash(哈希值带#)
    • host(主机名)
    • hostname(带端口主机名)
    • href(链接)
    • pathname(文件路径)
    • port(端口)
    • protocol(协议)
    • search(查询字符串)
  • 方法:
    • assign(url):跳转到url,有历史记录,location.href 底层就是调用这个函数
    • replace(url):跳转到url,无历史记录
    • reload(boolean):重新加载当前页面,如果不传 true 有可能从缓存加载,传 true 从服务器重新加载
 
8.2.1 查询字符串
function getQueryStringArgs() {
    var qs = (location.search.length > 0 ? location.search.substring(1) : ''),
    args = {},
    items = qs.length ? qs.split('&') : [],
    item = null, name = null, value = null
    
    items.forEach(item => {
        item = item.split('=')
        name = item[0].decodeURIComponent(item[0])
        value = item[1].decodeURIComponent(item[0])
        if(name.length) {
            args[name] = value
        }
    })
    return args
}

 

 
8.3 navigation 对象
8.3.1 检测插件
// IE 中无效
function hasPlugin(name) {
    name = name.toLowerCase()
    for (let i = 0; i < navigator.plugins.length; i++) {
        if (navigator.plugins[i].toLowerCase().indexOf(name) >-1)
            return true
    }
    return false
}

// IE 不支持 Netscape 插件,只能用专有的 ActiveXObject
// IE 中检测插件
function hasIEPlugin(name) {
    try {
        new ActiveXObject(name)
        return true
    } catch(e) {
        return false
    }
}

 

 
8.3.2 处理注册程序(没用过)
navigator.registerContentHandler
navigator.registerProtocoIHandler
这两个方法可以让一个站点指明它可以处理特定类型的信息。
 
8.4 screen 对象
主要用来报错浏览器窗口外部显示器信息
 
8.5 history 对象
  • history.go(1):前进一页等同于 history.forward()
  • history.go(-1):后退一页等同于 history.back()
  • 也可以给 go() 方法传递一个字符串,此时浏览器会跳转到历史记录中包含该字符串的第一个位置(可能前进,也可以后退)
  • history.length
    • 保存着历史记录的数量,包括前进和后退的记录,当 length = 0 的时候为第一个打开的页面
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值