HTML5_05_WebWorkers_SSE_WebSocket




HTML5 Web Workers


web worker 是运行在后台的 JavaScript,不会影响页面的性能,

更好的解释是,你可以使用web worker提供的一种简单的方法:

来为web内容在后台线程中运行脚本,

这些线程在执行任务的过程中并不会干扰用户界面


什么是 Web Worker?

当在 HTML 页面中执行脚本时,页面的状态是不可响应的,直到脚本已完成。

web worker 是运行在后台的 JavaScript,独立于其他脚本,不会影响页面的性能。

您可以继续做任何愿意做的事情,比如:

点击、选取内容等等,而此时 web worker 在后台运行。


浏览器支持

Internet ExplorerFirefoxOperaGoogle ChromeSafari

IE 10, Firefox, Chrome, Safari 和 Opera 都支持Web workers.


HTML5 Web Workers 实例 (必须运行在服务器上才有效果)

注意: IE 9 及更早 IE 版本浏览器不支持 Web Workers.

下面的例子创建了一个简单的 web worker,在后台计数:

html_155.html的代码如下:

<!DOCTPYE html>
<html>
<head>
	<link rel="icon" href="beyond.jpg" type="image/x-icon"/>
	<meta charset="UTF-8">
	<meta name="author" content="beyond">
	<meta http-equiv="refresh" content="520">
	<meta name="description" content="免费零基础教程">
	<meta name="viewport" content="width=device-width, 
	initial-scale=1.0, maximum-scale=1.0,minimum-scale=1.0,user-scalable=0" />
	<meta name="keywords" content="HTML,CSS,JAVASCRIPT">
	<title>beyondの心中の动漫神作</title>
	<link rel="stylesheet" type="text/css" href="beyondbasestylewhite2.css">

	<!--[if lt IE 9]>
		<script src="//apps.bdimg.com/libs/html5shiv/3.7/html5shiv.min.js"></script>
	<![endif]-->
</head>

<body>
	<p class="fontStyleNormal">注意:必须运行在服务器上才有效果!<br/><br/>真正多线程计数:
		<output id="id_result">0</output>
	</p>
	<div style="margin:0 auto;">
		<button οnclick="startWork()">开始计数</button>
		<button οnclick="stopWork()">停止计数</button>
	</div>

	<script type="text/javascript">
		var w;
		function startWork () {
			
			// 先判断
			if(typeof(Worker) !== "undefined" ){
				
				// 首次创建 Worker
				if(typeof(w) == "undefined"){
					w = new Worker("/static/js/html155worker.js");
					alert(w);
					// 监听消息
					w.onmessage = function (event) {
						document.getElementById("id_result").innerHTML = event.data;
					}
				}
			}else{
				document.getElementById("id_result").innerHTML = "对不起,您的浏览器不支持Web Worker";
			}
			
		}

		// 停止后台js worker
		function stopWork () {
			w.terminate();
			w = undefined;
		}
	</script>
	<footer>
		<p style="font-size:14px;text-align:center;font-style:italic;">
		Copyright © <a>2018</a> Powered by <a>beyond</a>
		</p>

		<p><time pubdate datetime="2018-03-09" ></time>
		</p>
	</footer>
</body>
</html>

位于网站/static/js/目录下的html155worker.js代码如下:

var i = 0;
function numberCount() {
	i = i + 1;
	// Web Worker 核心代码
	postMessage(i);
	// 开启定时器
	setTimeout("numberCount()",500);
}

// 手动运行
numberCount();


效果如下:




检测浏览器是否支持 Web Worker

在创建 web worker 之前,请检测用户的浏览器是否支持它:

if(typeof(Worker)!=="undefined")
  {
  // YEAH! Web worker 支持!
  // 一些代码.....
  }
else
  {
  // //抱歉! Web Worker 不支持
  }
提示:

这步的检测非常重要!你必须先检测才能保证接下来可以顺利操作 web worker!




创建 web worker 文件

现在,让我们在一个外部 JavaScript 中创建我们的 web worker。

在这里,我们创建了计数脚本。

该脚本存储于/static/is/ 目录下的 "html155work.js" 文件中:

var i = 0;
function numberCount() {
	i = i + 1;
	// Web Worker 核心代码
	postMessage(i);
	// 开启定时器
	setTimeout("numberCount()",500);
}

// 手动运行
numberCount();


以上代码中重要的部分是 postMessage() 方法 - 它用于向 HTML 页面传回一段消息。

注意: 

web worker 通常不用于如此简单的脚本,

而是用于更耗费 CPU 资源的任务,比如统计1-99999以内的质数。


创建 Web Worker 对象

我们已经有了 web worker 文件,现在我们需要从 HTML 页面调用它。

下面的代码检测是否存在 worker,如果不存在,

 它会创建一个新的 web worker 对象,

然后运行位于网站/static/js/目录下的 "html155worker.js" 中的代码:

if(typeof(w)=="undefined")
  {
  w=new Worker("/static/js/html155worker.js");
  }

然后我们就可以从 web worker 发送和接收消息了。

向 web worker 添加一个 "onmessage" 事件监听器:

w.onmessage=function(event){
document.getElementById("id_result").innerHTML=event.data;
};

当 web worker 传递消息时,会执行事件监听器中的代码。

event.data 中存有来自 event.data 的数据。


终止 Web Worker

当我们创建 web worker 对象后,它会继续监听消息(即使在外部脚本完成之后)直到其被终止为止。

如需终止 web worker,并释放浏览器/计算机资源,

请使用 terminate() 方法:

w.terminate();



Web Workers 和 DOM

由于 web worker 位于外部文件中,

它们无法访问下例 JavaScript 对象:

  • window 对象
  • document 对象
  • parent 对象


HTML5 服务器发送事件(Server-Sent Events)


服务器发送事件(Server-sent Events)是基于 WebSocket 协议的一种:

服务器向客户端发送事件和数据单向通讯。

HTML5 服务器发送事件(server-sent event)允许网页自动获得来自服务器的更新。


Server-Sent 事件 - 单向消息传递

Server-Sent 事件指的是网页自动获取来自服务器的更新。

以前也可能做到这一点,前提是网页不得不询问是否有可用的更新。


通过服务器发送事件,更新能够自动到达。

例子:Facebook/Twitter 更新、估价更新、新的博文、赛事结果等。


浏览器支持

Internet ExplorerFirefoxOperaGoogle ChromeSafari

所有主流浏览器均支持服务器发送事件,除了 IE。


接收 Server-Sent 事件通知

EventSource 对象用于接收服务器发送事件通知:

效果如下:


html_156.html的代码如下:

<!DOCTPYE html>
<html>
<head>
	<link rel="icon" href="beyond.jpg" type="image/x-icon"/>
	<meta charset="UTF-8">
	<meta name="author" content="beyond">
	<meta http-equiv="refresh" content="520">
	<meta name="description" content="免费零基础教程">
	<meta name="viewport" content="width=device-width, 
	initial-scale=1.0, maximum-scale=1.0,minimum-scale=1.0,user-scalable=0" />
	<meta name="keywords" content="HTML,CSS,JAVASCRIPT">
	<title>beyondの心中の动漫神作</title>
	<link rel="stylesheet" type="text/css" href="beyondbasestylewhite2.css">

	<!--[if lt IE 9]>
		<script src="//apps.bdimg.com/libs/html5shiv/3.7/html5shiv.min.js"></script>
	<![endif]-->
</head>

<body>
	<div id="id_result"></div>

	<script type="text/javascript">
		if(typeof(EventSource) !== "undefined"){
			var source = new EventSource("html156_sse.php");
			source.onmessage = function(event) {
				document.getElementById("id_result").innerHTML += event.data + "<br/>"
			};
		}else{
			document.getElementById("id_result").innerHTML = "对不起,您的浏览器不支持server sent 事件";
		}
	</script>

	<footer>
		<p style="font-size:14px;text-align:center;font-style:italic;">
		Copyright © <a>2018</a> Powered by <a>beyond</a>
		</p>

		<p><time pubdate datetime="2018-03-09" ></time>
		</p>
	</footer>
</body>
</html>

html156_sse.php的代码如下:

<?php 
	header('Content-Type: text/event-stream');
	header('Cache-Control: no-cache');
	// 设置上海时区
	date_default_timezone_set("Asia/Shanghai");
	$time = date("H:i:s");  //注意: data: 这是必须有的,规定!!!
	echo "data: 服务器 不断地 主动发来了道歉 {$time}\n\n";
	flush();
 ?>



实例解析:

  • 创建一个新的 EventSource 对象,然后规定发送更新的页面的 URL(本例中是 "html156_sse.php")

  • 每接收到一次更新,就会发生 onmessage 事件

  • 当 onmessage 事件发生时,把已接收的数据推入 id 为 "id_result" 的元素中


检测 Server-Sent 事件支持

以下实例,我们编写了一段额外的代码来检测服务器发送事件的浏览器支持情况:

if(typeof(EventSource)!=="undefined")
  {
  // YEAH~ 浏览器支持 Server-Sent
  // 一些代码.....
  }
else
  {
  // 浏览器不支持 Server-Sent..
  }



服务器端代码实例

为了让上面的例子可以运行,

您还需要能够发送数据更新的服务器(比如 PHP、ASP、Ruby、Python、Perl等)。

服务器端事件流的语法是非常简单的。

把 "Content-Type" 报头设置为 "text/event-stream"。

并且输出的时候,data: 这个是必须有的,强制规定!!!

现在,您可以开始发送事件流了。

PHP 代码 (html156_sse.php):

<?php 
	header('Content-Type: text/event-stream');
	header('Cache-Control: no-cache');
	// 设置上海时区
	date_default_timezone_set("Asia/Shanghai");
	$time = date("H:i:s");
	echo "data: 服务器 不断地 主动发来了道歉 {$time}\n\n";
	flush();
 ?>


ASP 代码 (VB) (html156_sse.asp):

<%
Response.ContentType="text/event-stream"
Response.Expires=-1
Response.Write("data: " & now())
Response.Flush()
%>

代码解释:

  • 把报头 "Content-Type" 设置为 "text/event-stream"

  • 规定不对页面进行缓存

  • 输出发送日期(始终以 "data: " 开头)

  • 向网页刷新输出数据


EventSource 对象

在上面的例子中,我们使用 onmessage 事件来获取消息。

不过还可以使用其他事件:

事件描述
onopen当通往服务器的连接被打开
onmessage当接收到消息
onerror当发生错误

在本节的开头我们介绍过服务器发送事件(Server-sent Events)是基于 WebSocket 协议的,

那么在本教程的下节内容中,我们将继续向你介绍 HTML WebSocket



HTML5 WebSocket

WebSocket是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。

在WebSocket API中,浏览器和服务器 只需要做一个 握手的动作,

然后,浏览器和服务器之间就形成了一条快速通道。

两者之间就直接可以数据互相传送。


浏览器通过 JavaScript 向服务器发出建立 WebSocket 连接的请求,

连接建立以后,客户端和服务器端就可以通过 TCP 连接直接交换数据。


当你获取 Web Socket 连接后,你可以通过 send() 方法来向服务器发送数据,

并通过 onmessage 事件来接收服务器返回的数据。

以下 API 用于创建 WebSocket 对象。

var Socket = new WebSocket(url, [protocal] );

以上代码中的第一个参数 url, 指定连接的 URL。

第二个参数 protocol 是可选的,指定了可接受的子协议。


WebSocket 属性

以下是 WebSocket 对象的属性。

假定我们使用了以上代码创建了 Socket 对象:

属性描述
Socket.readyState

只读属性 readyState 表示连接状态,可以是以下值:

  • 0 - 表示连接尚未建立。

  • 1 - 表示连接已建立,可以进行通信。

  • 2 - 表示连接正在进行关闭。

  • 3 - 表示连接已经关闭或者连接不能打开。

Socket.bufferedAmount

只读属性  bufferedAmount ,

已被 send(), 放入正在队列中等待传输中,

但是还没有发出的 UTF-8 文本字节数


WebSocket 事件

以下是 WebSocket 对象的相关事件。

假定我们使用了以上代码创建了 Socket 对象:

事件事件处理程序描述
openSocket.onopen连接建立时触发
messageSocket.onmessage客户端接收服务端数据时触发
errorSocket.onerror通信发生错误时触发
closeSocket.onclose连接关闭时触发

WebSocket 方法

以下是 WebSocket 对象的相关方法。

假定我们使用了以上代码创建了 Socket 对象:

方法描述
Socket.send()

使用连接发送数据

Socket.close()

关闭连接


WebSocket 实例

WebSocket 协议本质上是一个基于 TCP 的协议。

为了建立一个 WebSocket 连接,

客户端浏览器首先要向服务器发起一个 HTTP 请求,

这个请求和通常的 HTTP 请求不同,包含了一些附加头信息,

其中附加头信息"Upgrade: WebSocket"表明:

这是一个申请协议升级的 HTTP 请求,

服务器端解析这些附加的头信息然后产生应答信息返回给客户端,

客户端和服务器端的 WebSocket 连接就建立起来了,


这时候,双方就可以通过这个连接通道自由的传递信息,

并且这个连接会持续存在直到客户端或者服务器端的某一方主动的关闭连接。

客户端的 HTML 和 JavaScript

目前大部分浏览器支持 WebSocket() 接口,

你可以在以下浏览器中尝试实例: Chrome, Mozilla, Opera 和 Safari。


html_157.html 文件内容

<!DOCTPYE html>
<html>
<head>
	<link rel="icon" href="beyond.jpg" type="image/x-icon"/>
	<meta charset="UTF-8">
	<meta name="author" content="beyond">
	<meta http-equiv="refresh" content="520">
	<meta name="description" content="免费零基础教程">
	<meta name="viewport" content="width=device-width, 
	initial-scale=1.0, maximum-scale=1.0,minimum-scale=1.0,user-scalable=0" />
	<meta name="keywords" content="HTML,CSS,JAVASCRIPT">
	<title>beyondの心中の动漫神作</title>
	<link rel="stylesheet" type="text/css" href="beyondbasestylewhite2.css">

	<!--[if lt IE 9]>
		<script src="//apps.bdimg.com/libs/html5shiv/3.7/html5shiv.min.js"></script>
	<![endif]-->
</head>

<body>
	<div id="id_result"></div>

	<div style="margin:0 auto;">
		<a href="javascript:StartWebSocket()">启动WebSocket</a>
	</div>
	<script type="text/javascript">
		function StartWebSocket() {
			if("WebSocket" in window){
				document.getElementById("id_result").innerHTML += "恭喜,浏览器支持WebSocket<br/><br/>";
				// 创建一个WebSocket
				var socket = new WebSocket("ws://localhost:9998/echo");
				// 监听打开事件
				socket.onopen = function () {
					document.getElementById("id_result").innerHTML += "WebSocket成功打开<br/>";
					socket.send("未闻花名");
					document.getElementById("id_result").innerHTML += "WebSocket发送数据成功<br/>";
				}
				// 监听接收事件
				socket.onmessage = function (event) {


					var received_msg = event.data;
					var appendStr = "WebSocket成功接收数据:" + received_msg + "<br/>";
					document.getElementById("id_result").innerHTML += appendStr;
				}
				// 监听关闭事件
				socket.onclose = function () {
					document.getElementById("id_result").innerHTML += "<br/>服务器连接关闭<br/>";
				}
			}else{
				document.getElementById("id_result").innerHTML += "对不起,您的浏览器不支持WebSocket!<br/>";
			}
		}
	</script>

	<footer>
		<p style="font-size:14px;text-align:center;font-style:italic;">
		Copyright © <a>2018</a> Powered by <a>beyond</a>
		</p>

		<p><time pubdate datetime="2018-03-09" ></time>
		</p>
	</footer>
</body>
</html>
效果如下:



详细流程如下:

安装 pywebsocket

在执行以上程序前,我们需要创建一个支持 WebSocket 的服务。

从 pywebsocket 下载 mod_pywebsocket ,

或者使用 git 命令下载:

git clone https://github.com/google/pywebsocket.git



mod_pywebsocket 需要 python 环境支持

mod_pywebsocket 是一个 Apache HTTP 的 Web Socket扩展,安装步骤如下:
  • 解压下载的文件。

  • 进入 pywebsocket 目录。

  • 执行命令:

    $ python setup.py build
    $ sudo python setup.py install
    
  • 查看文档说明:

    $ pydoc mod_pywebsocket





开启服务

在 pywebsocket/mod_pywebsocket 目录下执行以下命令:

$ sudo python standalone.py -p 9998 -w ../example/

以上命令会开启一个端口号为 9998 的服务,

使用 -w 来设置处理程序 echo_wsh.py 所在的目录。



现在我们可以在 Chrome 浏览器打开前面创建的 html_157.html 文件。

如果你的浏览器支持 WebSocket(), 点击"运行 WebSocket",

你就可以看到整个流程各个步骤弹出的窗口,流程 Gif 演示:


在我们停止服务后,会弹出 "连接已关闭..."。

总之,使用WebSocket技术,后台可以随时向前端推送消息,

以此保证前后台状态统一,这在传统的无状态HTTP协议中无法做到。



HTML5 代码规范

在使用HTML5的过程中,使用规范化的代码能够更加方便你的运用与阅读,

本节我们将带领你了解如何能够使得HTML5中的代码变得更加规范!


HTML 代码约定

很多 Web 开发人员对 HTML 的代码规范知之甚少。

在2000年至2010年,许多Web开发人员从 HTML 转换到 XHTML

使用 XHTML 开发人员逐渐养成了比较好的 HTML 编写规范。

而针对于 HTML5 ,我们应该形成比较好的代码规范,

以下提供了几种规范的建议。


使用正确的文档类型

文档类型声明位于HTML文档的第一行:

前面的DOCTYPE建议大写, 后面的html建议小写

< !DOCTYPE  html >

使用小写元素名

HTML5 元素名可以使用大写和小写字母

推荐使用小写字母

  • 混合了大小写的风格是非常糟糕的。
  • 开发人员通常使用小写 (类似 XHTML)。
  • 小写风格看起来更加清爽。
  • 小写字母容易编写。

推荐:

< section > 
   < p >这是一个段落。 < /p >
< /section >

关闭所有 HTML 元素

在 HTML5 中, 你不一定要关闭所有元素 (例如 <p> 元素),

但是我们建议每个元素都要添加关闭标签

推荐:

< section >
   < p >这是一个段落。 < /p >
   < p >这是一个段落。 < /p >
< /section >

关闭 空的 HTML 元素

在 HTML5 中, 空的 HTML 元素也不一定要关闭:

但是,我们推荐关闭 空的 HTML 元素:

< meta  charset= "utf-8"  / >

因为,在 XHTML 和 XML 中斜线 (/) 是必须的

如果你期望 XML 软件使用你的页面,

那么使用关闭空元素的这种风格是非常好的。


使用 小写属性名

HTML5 属性名允许使用大写和小写字母。

但是,我们推荐使用小写字母属性名:

  • 同时使用大写写是非常不好的习惯。
  • 开发人员通常使用小写 (类似 XHTML)。
  • 小写风格看起来更加清爽。
  • 小写字母容易编写。


推荐:

< div  class= "menu" >

属性值

HTML5 属性值可以不用引号。

但是,属性值我们推荐 使用引号:

  • 如果属性值含有空格需要使用引号。
  • 混合风格不推荐的,建议统一风格。
  • 属性值使用引号易于阅读。

以下实例属性值包含空格,如果没有使用引号,就不能起作用:

< table  class= table striped>

以下使用了双引号,这样是正确的:

< table  class= "table striped" >

图片属性

图片通常使用 alt 属性

 在图片不能显示时,它能替代图片显示。

< img  src= "anohana.gif"  alt= "未闻花名" style= "width:128px;height:128px" >

定义好图片的尺寸,在加载时可以预留指定空间,减少闪烁。

< img  src= "anohana.gif"  alt= "未闻花名"  style= "width:128px;height:128px" >

空格和等号

等号前后 虽然 可以 使用空格。

< link  rel =  "stylesheet"  href =  "styles.css" >

但是,我们推荐  等号后面少用空格,不用空格:

< link  rel= "stylesheet"  href= "styles.css" >

避免一行代码过长

使用 HTML 编辑器,左右滚动代码那是相当滴不方便的。

所以,我们推荐:每行代码尽量少于 80 个字符。


空行和缩进

记住:千万永远也不要  无缘无故地  添加空行。

如果是:为每个逻辑功能块 添加空行,这样是可以的, 因为更易于阅读。

缩进 我们建议使用两个空格,不建议使用 TAB。(我就喜欢用TAB,怎么滴!)

比较短的代码之间, 不要使用不必要的 空行 跟 缩进。

推荐:

< body >

< h1 > 动漫神作 < /h1 >

< h2 >by beyond < /h2 >
< p > 未闻花名
龙与虎
石头门
来自新世界 < /p >

< /body >

表格实例:

< table >
   < tr >
     < th > 名称 < /th >
     < th > 女主角 < /th >
   < /tr >
   < tr >
     < td > 未闻花名 < /td >
     < td > 面码 < /td >
   < /tr >
   < tr >
     < td > 龙与虎 < /td >
     < td > 逢坂大河 < /td >
   < /tr >
< /table >

列表实例:

< ol >
   < li > 未闻花名 < /li >
   < li > 龙与虎 < /li >
   < li > 轻音少女 < /li >
< /ol >

不推荐省略 <html> 和 <body>标签

在标准 HTML5 中, 虽然 <html> 和 <body> 标签是可以省略的。

但是, 我们 不推荐省略 <html> 和 <body> 标签。


<html> 元素是文档的根元素,用于描述页面的使用的语言

< !DOCTYPE  html >
< html  lang= "zh" >

声明语言是为了方便 屏幕阅读器 搜索引擎

注意:只要省略 <html> 或 <body> ,那么在 DOM 和 XML 软件中就会彻底崩溃。

注意:只要省略 <body>,那么 在旧版浏览器 (IE9)就会发生致命错误。


不建议省略 <head>

在标准 HTML5 中, 虽然<head>标签是可以省略的。

但是,我们不建议省略<head>

而且,默认情况下,浏览器会将 <body> 之前的内容添加到一个默认的 <head> 元素上。

实例

< !DOCTYPE  html >
< html >
< title >帅哥心中的动漫神作列表 < /title >

< body >
   < h1 >未闻花名 < /h1 >
   < p >我们仍未知道那年夏天所见到的花的名字 < /p >
< /body >

< /html >
Note我们不推荐省略 head 标签。

元数据

注意:

在HTML5 中, <title> 元素是必须的,

标题名描述了页面的主题:

< title > beyond心中的动漫神作列表 < /title >

标题 title 和语言 lang可以让搜索引擎很快了解你页面的主题:

< !DOCTYPE  html >
< html  lang= "zh" >
< head >
   < meta  charset= "UTF-8" >
   < title > beyond < /title >
< /head >

HTML 注释

注释可以写在 <!-- 和 --> 中:

<!-- 这是注释,未闻花名的女主是面码 -->

比较长的评论可以在 <!-- 和 --> 中分行写:

<!-- 
  我们仍未知道那年夏天所见到的花的名字
  あの日見た花の名前を僕達はまだ知らない
-->

长评论第一个字符缩进两个空格,更易于阅读。


样式表

样式表使用简洁的语法格式 ( type 属性虽然并不是必须的):

< link  rel= "stylesheet"  href= "styles.css" type="text/css" >

短的规则可以写成一行:

p.into { font-family:  Verdana;  font-size:  16em;}

长的规则可以写成多行:

body {
   background-color:  lightgrey;
   font-family:  "Arial Black", Helvetica, sans-serif;
   font-size:  16em;
   color:  black;
}
  • 选择器 与 左花括号 放在同一行。
  • 选择器 与 左花括号 之间添加以空格
  • 使用两个空格来缩进。(就是要用TAB怎么滴!)
  • 冒号 与 属性值 之间添加 一个空格
  • 逗号 和 符号 之后使用 一个空格
  • 每个属性 与 值 结尾都要使用分号
  • 只有属性值包含 空格 时才使用 引号
  • 右花括号放在新的一行。
  • 每行最多 80 个字符。
Note逗号 和 分号 后添加 空格 是常用的一个规则。

在 HTML 中载入 JavaScript

使用简洁的语法来载入外部的脚本文件 ( type 属性虽然不是必须的 ):

< script  src= "myscript.js" type="text/javascript" >

使用 JavaScript 访问 HTML 元素

一个糟糕的 HTML 格式可能会导致 JavaScript 执行错误。

以下两个 JavaScript 语句会输出不同结果:

实例

var obj =getElementById( "Demo")

var obj = getElementById( "demo")

HTML 中 JavaScript 尽量使用相同的命名规则。

访问 JavaScript 代码规范


强烈推荐使用小写文件名

大多 Web 服务器 (Apache, Unix) 对大小写 异常地敏感:london.jpg 不能通过 London.jpg 访问。

其他 Web 服务器 (Microsoft, IIS) 对大小写 不敏感:london.jpg 可以通过 London.jpg 或 london.jpg 访问。

你必须保持统一的风格,我们建议统一使用小写的文件名


文件扩展名

HTML 文件后缀可以是 .html (或.htm)。

CSS 文件后缀是 .css 。

JavaScript 文件后缀是 .js 。


.htm 和 .html 的区别

.htm 和 .html 的扩展名文件本质上是没有区别的。

浏览器和 Web 服务器都会把它们当作 HTML 文件来处理。

区别在于:

.htm 应用在早期 DOS 系统,系统现在或者只能有三个字符。

在 Unix 系统中后缀没有特别限制,一般用 .html。

技术上区别

如果一个 URL 没有指定文件名 (如 //www.baidu.cn/css/), 服务器会返回默认的文件名。

通常默认文件名为 index.html, index.htm, default.html, 和 default.htm。

如果服务器只配置了 "index.html" 作为默认文件,

你必须将文件命名为 "index.html", 而不是 "index.htm"。


但是,通常服务器可以设置多个默认文件,你可以根据需要设置默认文件吗。

不管怎样,HTML 完整的后缀是 ".html"。



附录:

HTML 参考手册- (HTML5 标准)


按字母顺序排列

New : HTML5新标签

标签描述
<!--...-->-->√定义注释
<!DOCTYPE>-->√定义文档类型
<a>-->√定义超文本链接
<abbr>-->√定义缩写
<acronym>定义只取首字母的缩写,不支持HTML5  ???Excuse Me???
<address>定义文档作者或拥有者的联系信息
<applet>定义嵌入的 applet。HTML5中不支持使用。
<area>-->√定义图像映射内部的区域
<article>New-->√定义一个文章区域
<aside>New-->√定义页面的侧边栏内容
<audio>New-->√定义音频内容
<b>-->√定义文本粗体
<base>-->√定义页面中所有链接的默认地址或默认目标。
<basefont>定义页面中文本的默认字体、颜色或尺寸。HTML5不支持使用。
<bdi>New允许您设置一段文本,使其脱离其父元素的文本方向设置。
<bdo>-->√定义文字方向, 例如:从右往左,就是 dir="rtl"
<big>定义大号文本,HTML5不支持使用
<blockquote>-->√定义长的引用
<body>-->√定义文档的主体
<br>-->√定义换行
<button>-->√定义一个点击按钮
<canvas>New-->√定义图形,比如图表和其他图像,标签只是图形容器,您必须使用脚本来绘制图形
<caption>-->√定义表格标题
<center>定义居中文本。HTML5不支持使用。
<cite>-->√定义引用(citation)
<code>-->√定义计算机代码文本
<col>-->√定义表格中一个或多个列的属性值
<colgroup>定义表格中供格式化的列组
<command>New定义命令按钮,比如单选按钮、复选框或按钮
<datalist>New-->√定义选项列表。请与 input 元素配合使用该元素,来定义 input 可能的值。
<dd>-->√定义定义列表中项目的描述
<del>-->√定义被删除文本 (删除线效果)
<details>New用于描述文档或文档某个部分的细节
<dfn>定义定义项目
<dialog>New定义对话框,比如提示框
<dir>定义目录列表。HTML5不支持使用
<div>-->√定义文档中的节
<dl>-->√定义列表详情
<dt>-->√定义列表中的项目
<em>-->√定义强调文本
<embed>New-->√定义嵌入的内容,比如插件。无关闭标签
<fieldset>-->√定义围绕表单中元素的边框
<figcaption>New-->√定义<figure> 元素的标题
<figure>New-->√规定独立的流内容(图像、图表、照片、代码等等)。
<font>定义文字的字体、尺寸和颜色。HTML5不支持使用
<footer>New-->√定义 section 或 document 的页脚。(在body标签内部)
<form>-->√定义了HTML文档的表单
<frame>-->√定义框架集的窗口或框架
<frameset>-->√定义框架集
<h1> to <h6>-->√定义 HTML 标题
<head>-->√定义关于文档的信息
<header>New-->√定义了文档的头部区域 (在body标签内部)
<hr>-->√定义水平线
<html>-->√定义 HTML 文档
<i>-->√定义斜体字
<iframe>-->√定义内联框架
<img>-->√定义图像
<input>-->√定义输入控件
<ins>-->√定义被插入文本 (下划线效果)
<kbd>-->√定义键盘文本
<keygen>New规定用于表单的密钥对生成器字段。
<label>定义 input 元素的标注
<legend>-->√定义 fieldset 元素的标题
<li>-->√定义列表的项目
<link>-->√定义文档与外部资源的关系
<map>-->√定义图像映射
<mark>New定义带有记号的文本。请在需要突出显示文本时使用 <m> 标签。
<menu>定义菜单列表。HTML5不支持使用。
<meta>-->√定义关于 HTML 文档的元信息。
<meter>New定义度量衡。仅用于已知最大和最小值的度量。
<nav>New-->√定义导航链接的部分
<noframes>定义针对不支持框架的用户的替代内容。HTML5不支持
<noscript>-->√定义针对不支持客户端脚本的用户的替代内容。
<object>-->√定义内嵌对象 源使用的是data属性
<ol>-->√定义有序列表。
<optgroup>定义选择列表中相关选项的组合。
<option>-->√定义选择列表中的选项。
<output>New-->√定义不同类型的输出,比如脚本的输出。
<p>-->√定义段落。
<param>定义对象的参数。
<pre>-->√定义预格式文本。
<progress>New定义运行中的进度(进程)。
<q>-->√定义短的引用
<rp>New<rp> 标签在 ruby 注释中使用,以定义不支持 ruby 元素的浏览器所显示的内容。
<rt>New<rt> 标签定义字符(中文注音或字符)的解释或发音。
<ruby>New<ruby> 标签定义 ruby 注释(中文注音或字符)。
<s>不赞成使用。定义加删除线的文本。
<samp>-->√定义计算机代码样本。
<script>-->√定义客户端脚本。
<section>New-->√<section> 标签定义文档中的节(section、区段)。比如章节、页眉、页脚或文档中的其他部分。(自动居中)
<select>-->√定义选择列表(下拉列表)。
<small>-->√定义小号文本
<source>New-->√<source> 标签为媒介元素(比如 <video> 和 <audio>)定义媒介资源。
<span>定义文档中的节。
<strike>HTML5不支持,不赞成使用。定义加删除线文本。
<strong>-->√定义强调文本。
<style>-->√定义文档的样式信息。
<sub>-->√定义下标文本。
<summary>New<summary> 标签包含 details 元素的标题,"details" 元素用于描述有关文档或文档片段的详细信息。
<sup>-->√定义上标文本。
<table>-->√定义表格。
<tbody>定义表格中的主体内容。
<td>-->√定义表格中的单元。
<textarea>-->√定义多行的文本输入控件。
<tfoot>定义表格中的表注内容(脚注)。
<th>-->√定义表格中的表头单元格。
<thead>定义表格中的表头内容。
<time>New定义日期或时间,或者两者。
<title>-->√定义文档的标题。
<tr>-->√定义表格中的行。
<track>New<track> 标签为诸如 video 元素之类的媒介规定外部文本轨道。
<tt>定义打字机文本。
<u>不赞成使用。定义下划线文本。
<ul>-->√定义无序列表。
<var>定义文本的变量部分。
<video>New-->√<video> 标签定义视频,比如电影片段或其他视频流。
<wbr>New规定在文本中的何处适合添加换行符。

未完待续,下一章节,つづく

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值