notebooks
  • notebooks
  • _planning
    • 2022 OKR
    • basketball
    • swimming
  • communication
    • Dubbo
    • Kafka
    • Messaging
    • RPC
    • Thrift
  • computation
    • map-reduce
  • cs-basic-knowledge
    • computer-architecture
    • data-structure-and-algorithms
    • networks
    • os
  • devops
    • Docker
    • Linux
    • Prometheus
    • operations
    • security
    • trouble-shooting
  • distributed-knowledge
    • Zookeeper_CMD
    • distributed-system
  • game-engine
    • Unity
  • others
    • appium使用
  • protocols
    • http(s)协议
    • 官方链接
    • sip
  • storage
    • Elasticsearch
    • GuavaCache
    • MySQL
    • MySQL_CMD
    • NoSQL
    • Redis
    • Redis_CMD
  • system-design
    • system-design
  • tools
    • Git
    • IDEA
    • Mac
    • VScode
    • Vim
  • _working
    • doc-template
      • backend-design-review
      • correction-of-error
      • service-review
    • process
      • domain-backup
      • oncall
  • blogs
    • history
      • 8088/8086微处理器
      • 8088/8086指令系统
      • CSS-DOM
      • CSS定位
      • CSS工作原理
      • CSS控制背景
      • CSS浮动布局
      • CSS盒模型
      • Chrome开发者工具使用方法
      • DOM
      • Django Model模型层学习
      • Django-REST-framework Serializers学习
      • Django-REST-framework Views和ViewSets学习
      • Django View视图层学习
      • Gvim下Emmet安装及使用教程
      • HTTP协议简介
      • HashMap原理初探
      • JavaScript简史
      • JavaScript语法
      • Java内存模型和GC机制
      • Java基础——Lambda学习
      • Java基础——方法引用
      • Java基础——枚举类型
      • Java类加载机制
      • KMP算法
      • Kafka学习
      • Linux下用命令行编译Java程序
      • MathJax简介和基本用法
      • Python实现常见数据结构
      • Python装饰器总结
      • TCP协议的三次握手和四次挥手
      • Thrift学习
      • asyncio学习
      • markdown的常用语法
      • 修改hosts文件实现翻墙
      • 充实文档的内容
      • 关系数据库
      • 关系数据库标准语言SQL(一)
      • 关系数据库标准语言SQL(二)
      • 关系数据理论
      • 关系查询处理和查询优化
      • 内联元素和块级元素
      • 剑指offer算法题练习
      • 动态创建标记
      • 图形化用户界面
      • 在Eclipse中使用Maven构建Java Web项目
      • 增加微博秀遇到的一些问题
      • 处理机调度
      • 如何用github和hexo搭建个人博客
      • 存储管理
      • 存储系统的层次结构
      • 学习模仿lionhit网站首页的过程总结
      • 实用的GitHub小技巧
      • 并发控制
      • 循环与分支程序设计
      • 指令系统的设计
      • 指令级并行及其开发——硬件方法
      • 搭建自己的VPN服务器
      • 操作系统用户界面
      • 数据库安全性
      • 数据库完整性
      • 数据库恢复技术
      • 数据库绪论
      • 数据库编程
      • 数据库设计
      • 数据抽象
      • 文件系统
      • 文法和语言
      • 最佳实践
      • 案例研究:JavaScript图片库
      • 案例研究:图片库改进版
      • 汇编语言程序格式
      • 汇编语言程序设计基础知识
      • 流水线技术
      • 深度优先搜索和广度优先搜索
      • 牛客网——网易2017秋招编程题集合
      • 用JavaScript实现动画效果
      • 第一篇博客
      • 经典排序算法总结(Java实现)
      • 经典查找算法总结(Java实现)
      • 综合示例
      • 编译原理引论
      • 背包、队列和栈
      • 虚拟机安装Linux系统及常用软件
      • 计算机操作系统绪论
      • 计算机系统结构的基础知识
      • 设备管理
      • 设计模式之代理模式
      • 设计模式之单例模式
      • 设计模式之工厂模式
      • 设计模式之策略模式
      • 设计模式之观察者模式
      • 词法分析
      • 进程管理
      • 闭包
      • 阻止Google自动跳转到香港服务器的方法
      • 项目部署过程
  • programming-language
    • C#
      • C#
    • C&C++
      • C
    • C&C++
      • C++
    • Java
      • GoogleGuice
    • Java
      • JVM
    • Java
      • Java
    • Java
      • Maven
    • Java
      • Mybatis
    • Java
      • Spring知识
    • Java
      • SpringBoot
    • Java
      • Tomcat
    • Python
      • Python
    • Shell
      • Shell
  • wheels
    • dcc
      • 产品调研
      • 方案设计
    • red-envelope
      • 方案设计
    • short-url
      • 短链接服务
    • sso
      • 方案设计
Powered by GitBook
On this page
  • 不应该做什么
  • 把“不可见”变成“可见”
  • 内容
  • 选用HTML、XHTML还是HTML5
  • CSS
  • JavaScript
  • 显示“缩略语列表”
  • 编写displayAbbreviations函数
  • 创建标记
  • 显示“文献来源链接表”
  • 编写displayCitations函数
  1. blogs
  2. history

充实文档的内容

Previous修改hosts文件实现翻墙Next关系数据库

Last updated 3 years ago

不应该做什么

理论上,你可以用JavaScript把一些重要的内容添加到网页上。事实上这是一个坏主意,因为这样一来JavaScript就没有任何空间去平稳退化。那些缺乏必要的JavaScript支持的访问者就会永远看不到你的重要内容。至少到现在为止,各大搜素引擎网站的搜索机器人还几乎不支持JavaScript。

在中,我们要牢记下面这两项原则:

  • 渐进增强。渐进增强原则基于这样一种思想:你应该总是从最核心的部分,也就是从内容开始。应该根据内容使用标记实现良好的结构;然后再逐步加强这些内容。这些增强工作既可以是通过CSS改进呈现效果,也可以是通过DOM添加各种行为。

  • 平稳退化。渐进增强的实现必然支持平稳退化。如果你按照渐进增强的原则去充实内容,你为内容添加的样式和行为就自然支持平稳退化,那些缺乏必要的CSS和DOM支持的访问者仍可以访问到你的核心内容。

把“不可见”变成“可见”

绝大多数属性的内容(即属性值)在web浏览器里都是不显示的,只有极少数属性例外,但不同的浏览器在呈现这些例外的属性时却常常千姿百态。比如说,有些浏览器会把title属性的内容显示为弹出式的提示框,另一些浏览器则会把它们显示在状态栏里。在显示属性这个问题上,你只能听任浏览器的摆布。其实只需要一点点DOM编程,我们就能够把这种控制器重新掌握在自己的手里。本文着眼于使用DOM技术为网页添加一些使用的小部件。

  • 得到隐藏在属性里的信息。

  • 创建标记封装这些信息。

  • 把这些标记插入到文档。

内容

内容:

What is the Document Object Model?
The W3C defines the DOM as: 
A platform- and language-neutral interface that will allow programs and scripts to dynamically acess and update the content,structure and style of documents.
It is an API that can be used to navigate HTML and XML documents.

添加标记:

<h1>What is the Document Object Model?</h1>
<p>
  The <abbr title="World Wide Web Consortium">W3C</abbr> defines the <abbr title="Document Object Model">DOM</abbr> as:
</p>
<blockquote cite="http://www.w3.org/DOM/">
  <p>
     A platform- and language-neutral interface that will allow programs and scripts to dynamically acess and update the content,structure and style of documents.
  </p>
</blockquote>
<p>
  It is an <abbr title="Application Programming Interface">API</abbr> that can be used to navigate <abbr title="HyperText Markup Language">HTML</abbr> and <abbr title="eXtensible Markup Language">XML</abbr> documents.
</p>

选用HTML、XHTML还是HTML5

对于标记而言,选用HTML还是XHTML是你的自由。重要的是不管选用的哪种文档类型,你使用的标记必须与你选用的DOCTYPE声明一致。 HTML5文档类型声明:

<!DOCTYPE html>

而且这个文档声明同样也支持HTML和XHTML标记。 下面是按照HTML5规范完成的最终标记文件explanation.html:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Explaining the Document Object Model</title>
</head>
<body>
  <h1>What is the Document Object Model?</h1>
<p>
  The <abbr title="World Wide Web Consortium">W3C</abbr> defines the <abbr title="Document Object Model">DOM</abbr> as:
</p>
<blockquote cite="http://www.w3.org/DOM/">
  <p>
     A platform- and language-neutral interface that will allow programs and scripts to dynamically acess and update the content,structure and style of documents.
  </p>
</blockquote>
<p>
  It is an <abbr title="Application Programming Interface">API</abbr> that can be used to navigate <abbr title="HyperText Markup Language">HTML</abbr> and <abbr title="eXtensible Markup Language">XML</abbr> documents.
</p>
</body>
</html>

CSS

把下面样式表保存到typography.css文件,并将其放到子目录styles中。

body {
			font-family:"Helvetica","Arial",sans-serif;
			font-size:10pt;
		}
abbr {
			text-decoration:none;
			boder:0;
			font-style:normal;
		}

JavaScript

有些浏览器会在你把鼠标指针悬停在缩略语上时,将它的title属性显示为一个弹出式的提示消息。就像浏览器所使用的默认样式一样,浏览器对缩略语的默认呈现行为也是各有各的做法。就像我们可以用自己的CSS样式表去取代浏览器所使用的默认样式那样,你也可以用DOM去改变浏览器的默认行为。

显示“缩略语列表”

将<abbr>标签中的title属性集中显示在一个页面: 定义列表:

<dl>
  <dt>W3C</dt>
  <dd>World Wide Web Consortium</dd>
  <dt>DOM</dt>
  <dd>Document Object Model</dd>
  <dt>API</dt>
  <dd>Application Programming Interface</dd>
  <dt>HTML</dt>
  <dd>HyperText Markup Language</dd>
  <dt>XML</dt>
  <dd>eXtensible Markup Language</dd>
</dl>

编写displayAbbreviations函数

具体步骤: 1.遍历这份文档的所有abbr元素。 2.保存每个abbr元素的title属性。 3.保存每个abbr元素包含的文本。 4.创建一个“定义列表”元素(即dl元素)。 5.遍历刚才保存的title属性和abbr元素的文本。 6.创建一个“定义标题”元素(即dt元素)。 7.把abbr元素的文本插入到这个dt元素。 8.创建一个“定义描述”元素(即dd元素)。 9.把title属性插入到这个dd元素。 10.把dt元素追加到第4步创建的dl元素上。 11.把dd元素追加到第4步创建的dl元素上。 12.把dl元素追加到explanation.html文档的body元素上。

var abbreviations=document.getElementsByTagName("abbr");
var defs=new Array();
for(var i=0;i<abbreviations.length;i++){
		var definition=abbreviations[i].getAttribute("title");
		var key=abbreviations[i].lastChild.nodeValue;     //firstChild也可以,但若文本本<em>包含则只能用lastChild
		defs[key]=definition;         //将key用作数组元素的下标
	}

创建标记

var dlist=document.createElement("dl");
for(key in defs){           //含义:对于defs关联数组里的每个键,把它的值赋给变量key
		var definition=defs[key];
		var dtitle=document.createElement("dt");
		var dtitle_text=document.createTextNode(key);
		dtitle.appendChild(dtitle_text);
		var ddesc=document.createElement("dd");
		var ddesc_text=document.createTextNode(definition);
		ddesc.appendChild(ddesc_text);
		dlist.appendChild(dtitle);
		dlist.appendChild(ddesc);
	}

插入这个定义列表

创建一个描述性标题并将它们插入文档中。 displayAbbreviations()函数代码:

function displayAbbreviations(){
		var abbreviations=document.getElementsByTagName("abbr");
		var defs=new Array();
		for(var i=0;i<abbreviations.length;i++){
				var definition=abbreviations[i].getAttribute("title");
				var key=abbreviations[i].lastChild.nodeValue;     
				defs[key]=definition;        
		}
		var dlist=document.createElement("dl");
		for(key in defs){           
				var definition=defs[key];
				var dtitle=document.createElement("dt");
				var dtitle_text=document.createTextNode(key);
				dtitle.appendChild(dtitle_text);
				var ddesc=document.createElement("dd");
				var ddesc_text=document.createTextNode(definition);
				ddesc.appendChild(ddesc_text);
				dlist.appendChild(dtitle);
				dlist.appendChild(ddesc);
		}
		var header=document.createElement("h2");
		var header_text=document.createTextNode("Abbreviations");
		header.appendChild(header_text);
		document.body.appendChild(header);
		document.body.appendChild(dlist);
	}

检查兼容性

函数用到了getElementsByTagName、createElement和createTextNode:

if(!document.getElementsByTagName) return false;
if(!document.createElement) return false;
if(!document.createTextNode) return false;

显示“文献来源链接表”

blockquote元素包含一个属性cite。这是一个可选属性,你可以给它一个URL地址,告诉人们blockquote元素的内容引自哪里。但在实践中,浏览器会完全忽视cite属性的存在。利用JavaScript语言和DOM,我们完全可以把那些信息收集起来,并以一种更有意义的方式把它们显示在网页上。步骤如下: 1.遍历这个文档里所有blockquote元素。 2.从blockquote元素提取出cite属性的值。 3.创建一个标识文本是source的链接。 4.把这个链接赋值为blockquote元素的cite属性值。 5.把这个链接插入到文献节选的末尾。

编写displayCitations函数

遍历并提取cite属性值:

var quotes=document.getElementsByTagName("blockquote");
for(var i=0;i<quotes.length;i++){
		if(!quotes[i].getAttribute("cite")){
						continue;      //跳到下一次循环
				}
		var url=quotes[i].getAttribute("cite");
	}

查找你的元素

把“文献来源链接”放在blockquote元素所包含的最后一个子元素节点之后,直接想到的是用lastChild属性,可是在</p>标签和</blockquote>标签之间还存在着一个换行符,有些浏览器会把这个换行符解释为一个文本节点。但可以通过把通配符“*”作为参数传递给getElementsByTagName方法,它会把所有的元素一一返回给我们。

var quoteChildren=quotes[i].getElementsByTagName("*");
if(quoteChildren.length<1) continue;
var elem=quoteChildren[quoteChildren.length-1];

创建链接

var link=document.createElement("a");
var link_text=document.createTextNode("source");
link.appendChild(link_text);
link.setAttribute("href",url);

插入链接

var superscript=document.createElement("sup");
superscript.appendChild(link);     //呈现上标的效果
elem.appendChild(superscript);

代码清单

function displayCitations(){
		if(!document.getElementsByTagName) return false;
		if(!document.createElement) return false;
		if(!document.createTextNode) return false;
		var quotes=document.getElementsByTagName("blockquote");
		for(var i=0;i<quotes.length;i++){
			if(!quotes[i].getAttribute("cite")){
					continue;      
				}
			var url=quotes[i].getAttribute("cite");
			var quoteChildren=quotes[i].getElementsByTagName("*");
			if(quoteChildren.length<1) continue;
			var elem=quoteChildren[quoteChildren.length-1];
			var link=document.createElement("a");
			var link_text=document.createTextNode("source");
			link.appendChild(link_text);
			link.setAttribute("href",url);
			var superscript=document.createElement("sup");
			superscript.appendChild(link);     
			elem.appendChild(superscript);
		}
	}
addLoadEvent(displayCitations);

还需要用到window.onload事件。 浏览器效果:

效果预览:

最佳实践
充实文档的内容1
充实文档的内容2