浏览器对象
JavaScript 可以获取浏览器提供的很多对象,并进行操作。
window
window
对象不但充当全局作用域,而且表示浏览器窗口。
window
对象有 innerWidth
和 innerHeight
属性,可以获取浏览器窗口的内部宽度和高度。内部宽高是指除去菜单栏、工具栏、边框等占位元素后,用于显示网页的净宽高。
兼容性
IE <= 8 不支持。
"use strict";
// 可以调整浏览器窗口大小试试:
console.log(`window inner size: ${window.innerWidth} x ${window.innerHeight}`);
对应的,还有一个 outerWidth
和 outerHeight
属性,可以获取浏览器窗口的整个宽高。
navigator
navigator
对象表示浏览器的信息,最常用的属性包括:
navigator.appName
: 浏览器名称;navigator.appVersion
: 浏览器版本;navigator.language
: 浏览器设置的语言;navigator.platform
: 操作系统类型;navigator.userAgent
: 浏览器设定的 User-Agent 字符串。
"use strict";
console.log(`appName = ${navigator.appName}`);
console.log(`appVersion = ${navigator.appVersion}`);
console.log(`language = ${navigator.language}`);
console.log(`platform = ${navigator.platform}`);
console.log(`userAgent = ${navigator.userAgent}`);
请注意,navigator
的信息可以很容易地被用户修改,所以 JavaScript 读取的值不一定是正确的。很多初学者为了针对不同浏览器编写不同的代码,喜欢用 if
判断浏览器版本,例如:
let width;
if (getIEVersion(navigator.userAgent) < 9) width = document.body.clientWidth;
else width = window.innerWidth;
但这样既可能判断不准确,也很难维护代码。正确的方法是充分利用 JavaScript 对不存在属性返回 undefined
的特性,直接用短路运算符 ||
计算:
const width = window.innerWidth || document.body.clientWidth;
screen
screen
对象表示屏幕的信息,常用的属性有:
screen.width
: 屏幕宽度,以像素为单位;screen.height
: 屏幕高度,以像素为单位;screen.colorDepth
: 返回颜色位数,如 8、16、24。
"use strict";
console.log(`Screen size = ${screen.width} x ${screen.height}`);
location
location
对象表示当前页面的 URL 信息。例如,一个完整的 URL:
https://www.example.com:8080/path/index.html?a=1&b=2#TOP
可以用 location.href
获取。要获得 URL 各个部分的值,可以这么写:
location.protocol; // 'http'
location.host; // 'www.example.com'
location.port; // '8080'
location.pathname; // '/path/index.html'
location.search; // '?a=1&b=2'
location.hash; // 'TOP'
要加载一个新页面,可以调用 location.assign()
。如果要重新加载当前页面,调用 location.reload()
方法非常方便。
"use strict";
if (confirm("重新加载当前页" + location.href + "?")) location.reload();
else location.assign("/"); // 设置一个新的 URL 地址
document
document
对象表示当前页面。由于 HTML 在浏览器中以 DOM 形式表示为树形结构,document
对象就是整个 DOM 树的根节点。
document
的 title 属性是从 HTML 文档中的 <title>xxx</title>
读取的,但是可以动态改变:
"use strict";
document.title = "努力学习JavaScript!";
要查找 DOM 树的某个节点,需要从 document 对象开始查找。最常用的查找是根据 ID 和 Tag Name。
我们先准备 HTML 数据:
<dl id="drink-menu" style="border:solid 1px #ccc;padding:6px;">
<dt>摩卡</dt>
<dd>热摩卡咖啡</dd>
<dt>酸奶</dt>
<dd>北京老酸奶</dd>
<dt>果汁</dt>
<dd>鲜榨苹果汁</dd>
</dl>
用 document
对象提供的 getElementById()
和 getElementsByTagName()
可以按 ID 获得一个 DOM 节点和按 Tag 名称获得一组 DOM 节点:
"use strict";
let menu = document.getElementById("drink-menu");
let drinks = document.getElementsByTagName("dt");
let s, menu, drinks;
menu = document.getElementById("drink-menu");
menu.tagName; // 'DL'
drinks = document.getElementsByTagName("dt");
s = "提供的饮料有:";
for (let i = 0; i < drinks.length; i++) s = s + drinks[i].innerHTML + ",";
console.log(s);
摩卡
热摩卡咖啡
酸奶
北京老酸奶
果汁
鲜榨苹果汁
document
对象还有一个 cookie
属性,可以获取当前页面的 Cookie。
Cookie 是由服务器发送的 key-value
标示符。因为 HTTP 协议是无状态的,但是服务器要区分到底是哪个用户发过来的请求,就可以用 Cookie 来区分。当一个用户成功登录后,服务器发送一个 Cookie 给浏览器,例如 user=ABC123XYZ
(加密的字符串)...,此后,浏览器访问该网站时,会在请求头附上这个 Cookie,服务器根据 Cookie 即可区分出用户。
Cookie 还可以存储网站的一些设置,例如,页面显示的语言等等。
JavaScript 可以通过 document.cookie
读取到当前页面的 Cookie:
document.cookie; // 'v=123; remember=true; prefer=zh'
由于 JavaScript 能读取到页面的 Cookie,而用户的登录信息通常也存在 Cookie 中,这就造成了巨大的安全隐患,这是因为在 HTML 页面中引入第三方的 JavaScript 代码是允许的:
<!-- 当前页面在 www.example.com -->
<html>
<head>
<script src="https://www.foo.com/jquery.js"></script>
</head>
...
</html>
如果引入的第三方的 JavaScript 中存在恶意代码,则 www.foo.com
网站将直接获取到 www.example.com
网站的用户登录信息。
为了解决这个问题,服务器在设置 Cookie 时可以使用 httpOnly
,设定了 httpOnly 的 Cookie 将不能被 JavaScript 读取。这个行为由浏览器实现,主流浏览器均支持 httpOnly 选项,IE 从 IE6 SP1 开始支持
为了确保安全,服务器端在设置 Cookie 时,应该始终坚持使用 httpOnly
。
history
history
对象保存了浏览器的历史记录,JavaScript 可以调用 history 对象的 back()
或 forward ()
,相当于用户点击了浏览器的“后退”或“前进”按钮。
这个对象属于历史遗留对象,对于现代 Web 页面来说,由于大量使用 Ajax 和页面交互,简单粗暴地调用 history.back()
可能会让用户感到非常愤怒。
新手开始设计 Web 页面时喜欢在登录页登录成功时调用 history.back()
,试图回到登录前的页面。这是一种错误的方法。