浏览器打开HTML文档时会根据文档中的标签创建元素对象。元素对象是如JavaScript访问和操作HTML文档的接口。
文档对象模型(Document Object Model,缩写为DOM)是HTML向JavaScript提供的编程接口。DOM把HTML文档中的标签抽象为JavaScript语言中的对象。如图所示,HTML文档中的标签都可以通过DOM提供的编程接口访问。
下面是一段示例代码,有三层嵌套的标签
<!DOCTYPE html>
<html>
<head>
页面标题
</head>
<body>
章节标题1
段落文字1
章节标题2
段落文字2
</body>
</html>
上面代码3个层次,<html>标签是最外层的元素。下面是<head>和<body>,其中又有各自的内容,他们构成了树形结构。如下图:
DOM也常被称为DOM树,因为它通常具有树形结构。DOM提供了通过这种树状的层次结构,访问HTML 标签对象的能力。
document对象是一个页面全局对象,是自动生成的,也就是浏览器解析每个页面后都会自动生成一个 document对象。document对象就对应着HTML文档中的HTML标签。
复杂的HTML文档或者DOM会有多层错综复杂的结构。这种情况下通过这种层级结构访问很不方便。 HTML提供了多种选择特定元素的方法,比如按照标签属性选择,常用的是根据id属性、name属性和 class属性选择,还可以通过标签名选择
window对象是代表浏览器窗口的全局对象,提供了与浏览器窗口交互的能力。
很多时候需根据窗口显示区域的大小决定内容的大小和布局,从而实现最佳的展示效果
下面代码使用alert方法在对话框中展示了当前窗口的宽度和高度。
<meta charset="utf-8" />
<script>
alert("窗口的高度是" + window.innerHeight + "像素");
alert("窗口的宽度是" + window.innerWidth + "像素");
</script>
当页面文档内容的宽度或高度超过窗口大小时,浏览器窗口只显示当前窗口内可容纳的内容, 同时显示滚动条允许用户滚动窗口从而浏览完整的文档内容
除了只读属性,window对象还提供了一些方法供调用,通过方法的调用,可以产生与用户的 交互。与用户交互简单的说就是向用户传递信息和从用户那里获取信息(即获取用户输入)。
例如在HTML5文档中插入下面的代码,调用alert,confirm与prompt方法。
<script>
alert('来自网页的问侯');
let result = confirm('来自网页的询问');
alert('您刚刚点击的结果是:' + result);result = prompt('请输入文字:');
alert('您刚刚输入的文字是:' + result);
</script>
在Edge浏览器中运行上面代码的效果如下图:
当需要通过程序要滚动窗口时,可通过window对象提供的方法执行。两种用法的示例代码如下:
<script>
window.scrollTo(0, 500);
window.scrollTo({
left: 0,
top: 500,
behavior: 'instant'
});
</script>
window对象还提供了打开或关闭窗口的能力。如下面代码
<script>
window.open('https://es2q.com')
</script>
window对象还提供了许多通用功能。btoa和atob用于实现字符串的base64编码和解码功能。 下面的代码演示了这两个方法的使用。
<script>
let x = window.btoa('https://es2q.com'); // 进行base64编码
let y = window.atob(x); // 进行base64解码
</script>
window对象包含众多的属性,方法和子对象。下面的章节将继续展开介绍window对象的子对象的使用
document对象是window对象的子对象。对于HTML5页面开发至关重要。
document对象对应整个DOM树,是整个页面的可视部分。通过document对象可以选择页面内容,读取页面内容, 和修改页面内容
document.body对应了页面的<body>元素。而document.head对应了文档的<head>标签。
前面介绍过对于有id的标签,浏览器会生成与id同名的全局变量,可以直接在当前页面嵌入JavaScript代码 引用它们。
createElement方法用于创建新的元素对象,而append方法则用于把创建出来的元素插入到页面中。
console对象对应开发者工具中的控制台标签。可以用于输出调试信息。普通用户很少会打开控制台, 一般不会察觉到这里输出的内容。但这些输出对于调试非常重要。开发人员可以在这里输出代码调试信息。
最常用的输出方法是console.log()。该方法不仅可以输出文本信息,还可以直接输出JavaScript中的对象 ,输出的对象可以直接在控制台中查看,甚至有的浏览器提供了保存输出的对象为全局变量的功能,可以继续 进行交互式调试。
console.assert提供了断言功能,即console.assert可以接受一个参数,如果该参数为false,程序终止 执行并提示错误信息。如果参数为true则什么也不发生。assert的参数往往是一个条件判断表达式,这个表 达式按照开发者的期望应该永远为真。
location对象用于与浏览器的地址交互。
location.href属性可以读取到当前正在访问的地址。而修改这个值可以直接使页面跳转到指定网址。 如下面代码:
<script>
location.href = 'https://es2q.com/html5/';
</script>
location.host可以获取当前页面的主机名。location.pathname获取路径名。location.protocol 获取当前使用的协议。location.search获取页面的query参数。location.hash获取URL的hash信息。 location.port可以获取URL的主机的端口号。
URL参数主要有query和hash。通常来说query改变会导致浏览器页面刷新,而hash改变则不会引发浏览器页面的 刷新。可以通过字符串处理的方式从URL中提取参数。
navigator代表浏览器对象,通过navigator对象可以获得关于浏览器的信息,比如浏览器版本,浏览器运行的 操作系统等多种信息
navigator.userAgent是一个字符串,它是浏览器的User Agent信息,也会包含在浏览器发送给服务器的HTTP 请求头中。常用来鉴别浏览器以及操作系统。
navigator对象有多种应用,比如区分设备的操作系统和浏览器版本。如今浏览网页的设备多种多样,通过navigator 的信息可以区分不同设备,并在界面上予以不同的优化以提升用户体验
本章介绍了HTML5中的对象,他们是HTML和JavaScript间沟通的桥梁。因为有了这些对象,JavaScript可以方便高效 的操作HTML页面,HTML也经有它们获得了JavaScript动态的力量。
综合本章内容实现一个综合项目,动态获取信息,并动态修改页面元素,把这些信息展示给用户。
开发一个单页面小工具,利用navigator对象获取浏览器和操作系统信息。使用document对象的接口写在页面上。
根据要求可以通过location.href或document.URL拿到当前页面地址信息。navigator的userAgent获取浏览器 User Agent。通过navigator.platform获取用户浏览器运行的系统平台名称。
<script>
let ua = navigator. userAgent;
let url = location.href;
let platform = navigator.platform;
</script>
通过向document.body写入HTML信息把上一步获取到的信息展示在页面中,代码如下所示:
<meta charset='utf8'>
<body>
</body>
<script>
let ua = navigator. userAgent;
let url = location.href;
let platform = navigator.platform;
document.body.innerHTML += '操作系统平台:' + platform + '
';
document.body.innerHTML += 'User Agent:' + ua + '
';
document.body.innerHTML += '当前访问:' + url + '
';
</script>
显示结果如图:
本小节将开发一个自动适应屏幕大小的HTML5正方形游戏界面,如棋类游戏的棋盘,2048或数独类游戏的方格 都可以用这样的技术实现。
HTML5常常用来开发游戏、数据大屏等应用类页面。这类应用可能需要在不同尺寸的屏幕上运行。如何在这些 屏幕上均能取得良好的显示效果是一个非常重要的问题。
2048小游戏通常由一个4×4的正方形界面构成。效果如图:
从本小节开始,直到后面章节,将一步一步实现一个可以真正运行的2048小游戏。
一般来说开发人员不必关心窗口外部大小,只需要关注innerHeight和innerWidth即窗口内,展示内容的区域 的大小。
编写下面的代码,把屏幕宽高保持在变量中,比较他们的大小并生成输出提示内容,使用alert方法提 示用户。
<meta charset='utf8'/>
<script>
let width = window.innerWidth; // 窗口内宽度
let height = window.innerHeight; // 窗口内高度
let msg = "" // 关于窗口宽高的提示信息,先设为空字符串
if (width > height) {
msg = "窗口宽度大于高度";
}
else if (width < height) {
msg = "窗口高度大于宽度";
}
else {
msg = "窗口宽高相等";
}
alert("窗口宽度是:" + width + "像素\n" + "窗口高度是:" + height + "像素\n" + msg);
<
/script>
在浏览器中打开,若使用开发者工具模拟iPad Pro的竖屏状态的屏幕,可以看到程序正确提示出了窗口的大小,并 判断出屏幕高度大于宽度,可以根据这样的判断结果对屏幕进行不同的布局处理。
对于单页面HTML5应用的主页,有的可以设置为全屏不可滚动的入口页,有的可以纵向滚动以展示更多内容,有的 可以向任意方向滚动,有的可以在不同的视频间切换。上述种种情况均需要在应用或页面初始化的时候获取屏幕 高度,并根据设计进行布局。
可以根据元素id属性来选择元素。更简单的方法是,浏览器会自动生成与元素id同名的全局变量。直接使用全局变量 名即可操作对应的HTML5元素。实现如下代码:
<script>
let width = window.innerWidth; // 窗口内宽度
let height = window.innerHeight; // 窗口内高度
if (width > height) {
svg.style.height = height + "px";
svg.style.width = height + "px";
}
else {
svg.style.height = width + "px";
svg.style.width = width + "px";
}
</script>
将<svg>标签的背景颜色设为黑色。效果如图
本练习将在上节基础上,给游戏界面中添加方格,并通过本章学习的URL参数的方法实现方格行列数量根据参数 动态调整的功能。
3.10的课堂练习中仅绘制了黑色的背景,学习完本节,可以继续完善这个项目,绘制4×4的方块。
仅需要在绘制方格之前,预先读取URL的hash参数,转换为整数,并赋值给cnt即可实现方格数量动态变化。