HTML5学习笔记

简介

HTML5是HTML最新的修订版本,2014年10月由万维网联盟(W3C)完成标准制定。

HTML5的设计目的是为了在移动设备上支持多媒体。

HTML5 中的一些有趣的新特性:

  • 用于绘画的 canvas 元素
  • 用于媒介回放的 video 和 audio 元素
  • 对本地离线存储的更好的支持
  • 新的特殊内容元素,比如 article、footer、header、nav、section
  • 新的表单控件,比如 calendar、date、time、email、url、search

声明必须位于 HTML5 文档中的第一行,使用非常简单:

 注意:对于中文网页需要使用  声明编码,否则会出现乱码。

 

浏览器支持

HTML5 定了 8 个新的 HTML 语义(semantic) 元素。所有这些元素都是 块级 元素。

为了能让旧版本的浏览器正确显示这些元素,你可以设置 CSS 的 display 属性值为 block:

实例

header, section, footer, aside, nav, main, article, figure { display: block; }

为HTML添加新元素




 
为 HTML 添加新元素

 

 

 

我的第一个标题

我的第一个段落。

我的第一个新元素

 JavaScript 语句 document.createElement("myHero") 是为 IE 浏览器添加新的元素。


IE 浏览器问题

你可以使用以上的方法来为 IE 浏览器添加 HTML5 元素,但是:

Internet Explorer 8 及更早 IE 版本的浏览器不支持以上的方式。

我们可以使用 Sjoerd Visscher 创建的 "HTML5 Enabling JavaScript", " shiv" 来解决该问题: 

以上代码是一个注释,作用是在 IE 浏览器的版本小于 IE9 时将读取 html5.js 文件,并解析它。

 针对IE浏览器html5shiv 是比较好的解决方案。html5shiv主要解决HTML5提出的新的元素不被IE6-8识别,这些新元素不能作为父节点包裹子元素,并且不能应用CSS样式。

html5shiv.js 引用代码必须放在 元素中,因为 IE 浏览器在解析 HTML5 新元素时需要先加载该文件。

 

新元素

新元素

标签 描述
标签定义图形,比如图表和其他图像。该标签基于 JavaScript 的绘图 API

新多媒体元素

标签 描述
定义音频内容
定义视频(video 或者 movie)
定义多媒体资源
定义嵌入的内容,比如插件。
为诸如

新表单元素

标签 描述
定义选项列表。请与 input 元素配合使用该元素,来定义 input 可能的值。
规定用于表单的密钥对生成器字段。
定义不同类型的输出,比如脚本的输出。

新的语义和结构元素

HTML5提供了新的元素来创建更好的页面结构:

标签 描述
定义页面独立的内容区域。
定义页面的侧边栏内容。
允许您设置一段文本,使其脱离其父元素的文本方向设置。
定义命令按钮,比如单选按钮、复选框或按钮
用于描述文档或文档某个部分的细节
定义对话框,比如提示框
标签包含 details 元素的标题
规定独立的流内容(图像、图表、照片、代码等等)。
定义
元素的标题
定义 section 或 document 的页脚。
定义了文档的头部区域
定义带有记号的文本。
定义度量衡。仅用于已知最大和最小值的度量。
定义导航链接的部分。
定义任何类型的任务的进度。
定义 ruby 注释(中文注音或字符)。
定义字符(中文注音或字符)的解释或发音。
在 ruby 注释中使用,定义不支持 ruby 元素的浏览器所显示的内容。
定义文档中的节(section、区段)。
定义日期或时间。
规定在文本中的何处适合添加换行符。

已移除的元素

以下的 HTML 4.01 元素在HTML5中已经被删除:

  • </li> <li><strike></li> <li><tt></li> </ul> <p> </p> <h1>Canvas</h1> <p>HTML5 <canvas> 元素用于图形的绘制,通过脚本 (通常是JavaScript)来完成。</p> <p><canvas> 标签只是图形容器,必须使用脚本来绘制图形。</p> <p>可以通过多种方法使用 canvas 绘制路径,盒、圆、字符以及添加图像。</p> <h3>创建一个画布(Canvas)</h3> <p>一个画布在网页中是一个矩形框,通过 <canvas> 元素来绘制.</p> <blockquote> <p><strong>注意:</strong> 默认情况下 <canvas> 元素没有边框和内容。</p> </blockquote> <p><canvas>简单实例如下:</p> <pre class="has"><code class="language-html"><canvas id="myCanvas" width="200" height="100"></canvas></code></pre> <blockquote> <p><strong>注意:</strong> 标签通常需要指定一个id属性 (脚本中经常引用), width 和 height 属性定义的画布的大小.</p> <hr> <p><strong>提示:</strong>你可以在HTML页面中使用多个 <canvas> 元素.</p> </blockquote> <p>使用 style 属性来添加边框:</p> <pre class="has"><code class="language-html"><canvas id="myCanvas" width="200" height="100" style="border:1px solid #000000;"></code></pre> <hr> <h3>使用JavaScript来绘制图像</h3> <p>canvas 元素本身是没有绘图能力的。所有的绘制工作必须在 JavaScript 内部完成:</p> <pre class="has"><code class="language-javascript">var c = document.getElementById("myCanvas"); var ctx = c.getContext("2d"); ctx.fillStyle="#FF0000"; ctx.fillRect(0,0,150,75); </code></pre> <blockquote> <p><strong>实例解析:</strong></p> <p>首先,找到 <canvas> 元素:</p> <p><strong>var c=document.getElementById("myCanvas");</strong></p> <p>然后,创建 context 对象:</p> <p><strong>var ctx=c.getContext("2d");</strong></p> <p>下面的两行代码绘制一个红色的矩形:</p> <p><strong>ctx.fillStyle="#FF0000";<br> ctx.fillRect(0,0,150,75);</strong></p> <p>设置fillStyle属性可以是CSS颜色,渐变,或图案。fillStyle 默认设置是#000000(黑色)。</p> <p>fillRect(<em>x,y,width,height</em>) 方法定义了矩形当前的填充方式。</p> <hr> <p>注:</p> <p>getContext("2d") 对象是内建的 HTML5 对象,拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法。getContext() 方法返回一个用于在画布上绘图的环境。</p> <p><strong>语法</strong></p> <pre class="has"><code class="language-html">Canvas.getContext(contextID)</code></pre> <p><strong>参数</strong></p> <p>参数 <em>contextID</em> 指定了想要在画布上绘制的类型。当前唯一的合法值是 "2d",它指定了二维绘图,并且导致这个方法返回一个环境对象,该对象导出一个二维绘图 API。</p> <p>提示:在未来,如果 <canvas> 标签扩展到支持 3D 绘图,getContext() 方法可能允许传递一个 "3d" 字符串参数。</p> </blockquote> <hr> <h3>坐标</h3> <p>canvas 是一个二维网格。</p> <p>canvas 的左上角坐标为 (0,0)</p> <p>上面的 fillRect 方法拥有参数 (0,0,150,75)。</p> <p>意思是:在画布上绘制 150x75 的矩形,从左上角开始 (0,0)。</p> <hr> <h3>路径</h3> <p>在Canvas上画线,我们将使用以下两种方法:</p> <ul> <li>moveTo(<em>x,y</em>) 定义线条开始坐标</li> <li>lineTo(<em>x,y</em>) 定义线条结束坐标</li> </ul> <p>绘制线条我们必须使用到 "ink" 的方法,就像stroke().</p> <blockquote> <p><strong>实例</strong></p> <p>定义开始坐标(0,0), 和结束坐标 (200,100)。然后使用 stroke() 方法来绘制线条:</p> <pre class="has"><code class="language-javascript">var c=document.getElementById("myCanvas"); var ctx=c.getContext("2d"); ctx.moveTo(0,0); ctx.lineTo(200,100); ctx.stroke();</code></pre> </blockquote> <p> </p> <p>在canvas中绘制圆形, 我们将使用以下方法:</p> <blockquote> <pre class="has"><code class="language-html">arc(x,y,r,start,stop)</code></pre> <hr> <p>画布的左上角坐标为0,0</p> <ul> <li> x:圆心在x轴上的坐标</li> <li> y:圆心在y轴上的坐标</li> <li> r:半径长度</li> <li> start:起始角度,以弧度表示,圆心平行的右端为0度</li> <li> stop:结束角度,以弧度表示</li> </ul> <p>注意:Math.PI表示180°,画圆的方向是顺时针</p> </blockquote> <p>实际上我们在绘制圆形时使用了 "ink" 的方法, 比如 stroke() 或者 fill().</p> <blockquote> <p><strong>实例</strong></p> <p>使用 arc() 方法 绘制一个圆:</p> <pre class="has"><code class="language-javascript">var c=document.getElementById("myCanvas"); var ctx=c.getContext("2d"); ctx.beginPath(); ctx.arc(95,50,40,0,2*Math.PI); ctx.stroke();</code></pre> </blockquote> <hr> <h3>文本</h3> <p>使用 canvas 绘制文本,重要的属性和方法如下:</p> <ul> <li>font - 定义字体</li> <li>fillText(<em>text,x,y</em>) - 在 canvas 上绘制实心的文本</li> <li>strokeText(<em>text,x,y</em>) - 在 canvas 上绘制空心的文本</li> </ul> <p>使用 fillText():</p> <blockquote> <p><strong>实例</strong></p> <p>使用 "Arial" 字体在画布上绘制一个高 30px 的文字(实心):</p> <pre class="has"><code class="language-javascript">var c=document.getElementById("myCanvas"); var ctx=c.getContext("2d"); ctx.font="30px Arial"; ctx.fillText("Hello World",10,50);</code></pre> </blockquote> <p>使用 strokeText():</p> <blockquote> <p><strong>实例</strong></p> <p>使用 "Arial" 字体在画布上绘制一个高 30px 的文字(空心): </p> <pre class="has"><code class="language-javascript">var c=document.getElementById("myCanvas"); var ctx=c.getContext("2d"); ctx.font="30px Arial"; ctx.strokeText("Hello World",10,50);</code></pre> </blockquote> <hr> <h3>渐变 </h3> <p>渐变可以填充在矩形, 圆形, 线条, 文本等等, 各种形状可以自己定义不同的颜色。</p> <p>以下有两种不同的方式来设置Canvas渐变:</p> <ul> <li>createLinearGradient(<em>x,y,x1,y1</em>) - 创建线条渐变</li> <li>createRadialGradient(<em>x,y,r,x1,y1,r1</em>) - 创建一个径向/圆渐变</li> </ul> <p>当我们使用渐变对象,必须使用两种或两种以上的停止颜色。</p> <p>addColorStop()方法指定颜色停止,参数使用坐标来描述,可以是0至1.</p> <p>使用渐变,设置fillStyle或strokeStyle的值为 渐变,然后绘制形状,如矩形,文本,或一条线。</p> <p>使用 createLinearGradient():</p> <blockquote> <p><strong>实例</strong></p> <p>创建一个线性渐变。使用渐变填充矩形:</p> <pre class="has"><code class="language-javascript">var c = document.getElementById("myCanvas"); var ctx = c.getContext("2d"); // 创建渐变 var grd = ctx.createLinearGradient(0,0,200,0); grd.addColorStop(0,"red"); grd.addColorStop(1,"white"); // 填充渐变 ctx.fillStyle = grd; ctx.fillRect(10,10,150,80); </code></pre> </blockquote> <p><a href="http://img.e-com-net.com/image/info8/b8ad968e1b7e42c89a91947c3b44b4ec.png" target="_blank"><img alt="" class="has" height="100" src="http://img.e-com-net.com/image/info8/b8ad968e1b7e42c89a91947c3b44b4ec.png" width="200"></a></p> <p>使用 createRadialGradient():</p> <blockquote> <p><strong>实例</strong></p> <p>创建一个径向/圆渐变。使用渐变填充矩形:</p> <pre class="has"><code class="language-javascript">var c = document.getElementById("myCanvas"); var ctx = c.getContext("2d"); // 创建渐变 var grd = ctx.createRadicalGradient(75,50,5,90,60,100); grd.addColorStop(0,"red"); grd.addColorStop(1,"white"); // 填充渐变 ctx.fillStyle = grd; ctx.fillRect(10,10,150,80); </code></pre> </blockquote> <p><a href="http://img.e-com-net.com/image/info8/7e36329d638a46ee87d04dd0b24dcd84.jpg" target="_blank"><img alt="" class="has" height="100" src="http://img.e-com-net.com/image/info8/7e36329d638a46ee87d04dd0b24dcd84.jpg" width="200"></a></p> <blockquote> <h3>参数值</h3> <p>(x, y, r) (x1,y1,r1)分别可以代表一个圆形的特征, 个人感觉通常情况下(x,y) 和 (x1,y1)简单地相同即可(即同心圆), 这样做出来的径向渐变已经十分美观,符合大众审美观。</p> <table> <tbody> <tr> <th>参数</th> <th>描述</th> </tr> <tr> <td><em>x0</em></td> <td>渐变的开始圆的 x 坐标</td> </tr> <tr> <td><em>y0</em></td> <td>渐变的开始圆的 y 坐标</td> </tr> <tr> <td><em>r0</em></td> <td>开始圆的半径</td> </tr> <tr> <td><em>x1</em></td> <td>渐变的结束圆的 x 坐标</td> </tr> <tr> <td><em>y1</em></td> <td>渐变的结束圆的 y 坐标</td> </tr> <tr> <td><em>r1</em></td> <td>结束圆的半径</td> </tr> </tbody> </table> </blockquote> <hr> <h3>图像</h3> <p>把一幅图像放置到画布上, 使用以下方法:</p> <blockquote> <p>drawImage(<em>image,x,y</em>)</p> </blockquote> <pre class="has"><code class="language-javascript">var c = document.getElementById("myCanvas"); var ctx = c.getContext("2d"); var img = document.getElementById("scream"); ctx.drawImage(img,10,10);</code></pre> <h3> </h3> <h1>内联SVG</h1> <blockquote> <p><strong>什么是SVG?</strong></p> <ul> <li>SVG 指可伸缩矢量图形 (Scalable Vector Graphics)</li> <li>SVG 用于定义用于网络的基于矢量的图形</li> <li>SVG 使用 XML 格式定义图形</li> <li>SVG 图像在放大或改变尺寸的情况下其图形质量不会有损失</li> <li>SVG 是万维网联盟的标准</li> </ul> </blockquote> <h3>把 SVG 直接 嵌入 HTML 页面</h3> <p>在 HTML5 中,能够将 SVG 元素直接嵌入 HTML 页面中:</p> <pre class="has"><code class="language-html"><!DOCTYPE html> <html> <body> <svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="190"> <polygon points="100,10 40,180 190,60 10,60 160,180" style="fill:lime;stroke:purple;stroke-width:5;fill-rule:evenodd;"> </svg> </body> </html></code></pre> <hr> <h3>与Canvas的区别</h3> <ul> <li> <p>SVG 是一种使用 XML 描述 2D 图形的语言。</p> </li> <li> <p>Canvas 通过 JavaScript 来绘制 2D 图形。</p> </li> <li> <p>SVG 基于 XML,这意味着 SVG DOM 中的每个元素都是可用的。您可以为某个元素附加 JavaScript 事件处理器。</p> </li> <li> <p>在 SVG 中,每个被绘制的图形均被视为对象。如果 SVG 对象的属性发生变化,那么浏览器能够自动重现图形。</p> </li> <li> <p>Canvas 是逐像素进行渲染的。在 canvas 中,一旦图形被绘制完成,它就不会继续得到浏览器的关注。如果其位置发生变化,那么整个场景也需要重新绘制,包括任何或许已被图形覆盖的对象。</p> </li> </ul> <p>下表列出了 canvas 与 SVG 之间的一些不同之处。</p> <table> <tbody> <tr> <th>Canvas</th> <th>SVG</th> </tr> <tr> <td> <ul> <li>依赖分辨率</li> <li>不支持事件处理器</li> <li>弱的文本渲染能力</li> <li>能够以 .png 或 .jpg 格式保存结果图像</li> <li>最适合图像密集型的游戏,其中的许多对象会被频繁重绘</li> </ul></td> <td> <ul> <li>不依赖分辨率</li> <li>支持事件处理器</li> <li>最适合带有大型渲染区域的应用程序(比如谷歌地图)</li> <li>复杂度高会减慢渲染速度(任何过度使用 DOM 的应用都不快)</li> <li>不适合游戏应用</li> </ul></td> </tr> </tbody> </table> <p> </p> <h1>MathML</h1> <p>HTML5 可以在文档中使用 MathML 元素,对应的标签是 <math>...</math> 。</p> <blockquote> <p>MathML 是数学标记语言,是一种基于XML(标准通用标记语言的子集)的标准,用来在互联网上书写数学符号和公式的置标语言。</p> </blockquote> <p> 以下是一个简单的 MathML 实例:</p> <pre class="has"><code class="language-html"><!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>菜鸟教程(runoob.com)</title> </head> <body> <math xmlns="http://www.w3.org/1998/Math/MathML"> <mrow> <msup><mi>a</mi><mn>2</mn></msup> <mo>+</mo> <msup><mi>b</mi><mn>2</mn></msup> <mo>=</mo> <msup><mi>c</mi><mn>2</mn></msup> </mrow> </math> </body> </html> </code></pre> <p><a href="http://img.e-com-net.com/image/info8/982a134bb5fd43b9aa3a4ee36f530f4d.jpg" target="_blank"><img alt="" class="has" height="74" src="http://img.e-com-net.com/image/info8/982a134bb5fd43b9aa3a4ee36f530f4d.jpg" width="152"></a></p> <p>以下实例添加了一些运算符:</p> <pre class="has"><code class="language-html"><!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>菜鸟教程(runoob.com)</title> </head> <body> <math xmlns="http://www.w3.org/1998/Math/MathML"> <mrow> <mrow> <msup> <mi>x</mi> <mn>2</mn> </msup> <mo>+</mo> <mrow> <mn>4</mn> <mo>⁢</mo> <mi>x</mi> </mrow> <mo>+</mo> <mn>4</mn> </mrow> <mo>=</mo> <mn>0</mn> </mrow> </math> </body> </html> </code></pre> <p><a href="http://img.e-com-net.com/image/info8/f41718a8fb104ec08b6a2c27dc803361.jpg" target="_blank"><img alt="" class="has" height="86" src="http://img.e-com-net.com/image/info8/f41718a8fb104ec08b6a2c27dc803361.jpg" width="202"></a></p> <p>以下实例是一个 2×2 矩阵,可以在 Firefox 3.5 以上版本查看到效果:</p> <pre class="has"><code class="language-html"><!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>菜鸟教程(runoob.com)</title> </head>      <body> <math xmlns="http://www.w3.org/1998/Math/MathML">          <mrow> <mi>A</mi> <mo>=</mo>              <mfenced open="[" close="]">              <mtable> <mtr> <mtd><mi>x</mi></mtd> <mtd><mi>y</mi></mtd> </mtr>                      <mtr> <mtd><mi>z</mi></mtd> <mtd><mi>w</mi></mtd> </mtr> </mtable> </mfenced> </mrow> </math> </body> </html> </code></pre> <p><a href="http://img.e-com-net.com/image/info8/670b034330924bcaa617f525624e7691.jpg" target="_blank"><img alt="HTML5学习笔记_第1张图片" class="has" height="111" src="http://img.e-com-net.com/image/info8/670b034330924bcaa617f525624e7691.jpg" width="150" style="border:1px solid black;"></a></p> <p> </p> <h1>拖放</h1> <blockquote> <p>拖放(Drag and drop)是HTML5标准的组成部分。</p> </blockquote> <p>下面的例子是一个简单的拖放实例:</p> <h3>实例</h3> <pre class="has"><code class="language-html"><!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>菜鸟教程(runoob.com)</title> <style type="text/css"> #div1 {width:350px;height:70px;padding:10px;border:1px solid #aaaaaa;} </style> <script> function allowDrop(ev) { ev.preventDefault(); } function drag(ev) { ev.dataTransfer.setData("Text",ev.target.id); } function drop(ev) { ev.preventDefault(); var data=ev.dataTransfer.getData("Text"); ev.target.appendChild(document.getElementById(data)); } </script> </head> <body> <p>拖动 RUNOOB.COM 图片到矩形框中:</p> <div id="div1" οndrοp="drop(event)" οndragοver="allowDrop(event)"></div> <br> <img id="drag1" src="/images/logo.png" draggable="true" οndragstart="drag(event)" width="336" height="69"> </body> </html></code></pre> <p>它看上去也许有些复杂,不过我们可以分别研究拖放事件的不同部分。</p> <hr> <h3>设置元素为可拖放</h3> <blockquote> <p>首先,为了使元素可拖动,把 draggable 属性设置为 true :</p> </blockquote> <p><strong><img draggable="true"></strong></p> <hr> <h3>拖动什么 - ondragstart 和 setData()</h3> <p>然后,规定当元素被拖动时,会发生什么。</p> <blockquote> <p>在上面的例子中,ondragstart 属性调用了一个函数,drag(event),它规定了被拖动的数据。</p> </blockquote> <p>dataTransfer.setData() 方法设置被拖数据的数据类型和值:</p> <p><strong>function drag(ev)<br> {<br>     ev.dataTransfer.setData("Text",ev.target.id);<br> }</strong></p> <p>在这个例子中,数据类型是 "Text",值是可拖动元素的 id ("drag1")。</p> <hr> <h2>放到何处 - ondragover</h2> <blockquote> <p>ondragover 事件规定在何处放置被拖动的数据。</p> </blockquote> <p>默认地,无法将数据/元素放置到其他元素中。如果需要设置允许放置,我们必须阻止对元素的默认处理方式。</p> <p>这要通过调用 ondragover 事件的 event.preventDefault() 方法:</p> <p><strong><em>event</em>.preventDefault()</strong></p> <hr> <h3>进行放置 - ondrop</h3> <blockquote> <p>当放置被拖数据时,会发生 drop 事件。</p> </blockquote> <p>在上面的例子中,ondrop 属性调用了一个函数,drop(event):</p> <p><strong>function drop(ev)<br> {<br>     ev.preventDefault();<br>     var data=ev.dataTransfer.getData("Text");<br>     ev.target.appendChild(document.getElementById(data));<br> }</strong></p> <p>代码解释:</p> <ul> <li>调用 preventDefault() 来避免浏览器对数据的默认处理(drop 事件的默认行为是以链接形式打开)</li> <li>通过 dataTransfer.getData("Text") 方法获得被拖的数据。该方法将返回在 setData() 方法中设置为相同类型的任何数据。</li> <li>被拖数据是被拖元素的 id ("drag1")</li> <li>把被拖元素追加到放置元素(目标元素)中</li> </ul> <hr> <h3>如何在两个 <div> 元素之间拖放图像:</h3> <pre class="has"><code class="language-html"><!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>菜鸟教程(runoob.com)</title> <style type="text/css"> #div1, #div2 {float:left; width:100px; height:35px; margin:10px;padding:10px;border:1px solid #aaaaaa;} </style> <script> function allowDrop(ev) { ev.preventDefault(); } function drag(ev) { ev.dataTransfer.setData("Text",ev.target.id); } function drop(ev) { ev.preventDefault(); var data=ev.dataTransfer.getData("Text"); ev.target.appendChild(document.getElementById(data)); } </script> </head> <body> <div id="div1" οndrοp="drop(event)" οndragοver="allowDrop(event)"> <img src="img_w3slogo.gif" draggable="true" οndragstart="drag(event)" id="drag1" width="88" height="31"></div> <div id="div2" οndrοp="drop(event)" οndragοver="allowDrop(event)"></div> </body> </html></code></pre> <p> </p> <h1>地理定位</h1> <blockquote> <p>HTML5 Geolocation API 用于获得用户的地理位置。</p> <p>鉴于该特性可能侵犯用户的隐私,除非用户同意,否则用户位置信息是不可用的。</p> </blockquote> <p>使用 getCurrentPosition() 方法来获得用户的位置。</p> <p>下例是一个简单的地理定位实例,可返回用户位置的经度和纬度:</p> <pre class="has"><code class="language-html"><!DOCTYPE html> <html> <head>  <meta charset="utf-8">  <title>菜鸟教程(runoob.com)</title>  </head> <body> <p id="demo">点击按钮获取您当前坐标(可能需要比较长的时间获取):</p> <button οnclick="getLocation()">点我</button> <script> var x=document.getElementById("demo"); function getLocation() { if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(showPosition); } else { x.innerHTML="该浏览器不支持获取地理位置。"; } } function showPosition(position) { x.innerHTML="纬度: " + position.coords.latitude + "<br>经度: " + position.coords.longitude; } </script> </body> </html></code></pre> <p>实例解析:</p> <ul> <li>检测是否支持地理定位</li> <li>如果支持,则运行 getCurrentPosition() 方法。如果不支持,则向用户显示一段消息。</li> <li>如果getCurrentPosition()运行成功,则向参数showPosition中规定的函数返回一个coordinates对象</li> <li>showPosition() 函数获得并显示经度和纬度</li> </ul> <p>上面的例子是一个非常基础的地理定位脚本,不含错误处理。</p> <hr> <h3>处理错误和拒绝</h3> <p>getCurrentPosition() 方法的第二个参数用于处理错误。它规定当获取用户位置失败时运行的函数:</p> <pre class="has"><code class="language-html"><!DOCTYPE html> <html> <head>  <meta charset="utf-8">  <title>菜鸟教程(runoob.com)</title>  </head> <body> <p id="demo">点击按钮获取您当前坐标(可能需要比较长的时间获取):</p> <button οnclick="getLocation()">点我</button> <script> var x=document.getElementById("demo"); function getLocation() { if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(showPosition,showError); } else { x.innerHTML="该浏览器不支持定位。"; } } function showPosition(position) { x.innerHTML="纬度: " + position.coords.latitude + "<br>经度: " + position.coords.longitude; } function showError(error) { switch(error.code) { case error.PERMISSION_DENIED: x.innerHTML="用户拒绝对获取地理位置的请求。" break; case error.POSITION_UNAVAILABLE: x.innerHTML="位置信息是不可用的。" break; case error.TIMEOUT: x.innerHTML="请求用户地理位置超时。" break; case error.UNKNOWN_ERROR: x.innerHTML="未知错误。" break; } } </script> </body> </html></code></pre> <hr> <h3>在地图中显示结果</h3> <p>如需在地图中显示结果,需要访问可使用经纬度的地图服务,比如谷歌地图或百度地图:</p> <pre class="has"><code class="language-html"><!DOCTYPE html> <html> <head>  <meta charset="utf-8">  <title>菜鸟教程(runoob.com)</title>  </head> <body> <p id="demo">点击按钮获取您当前坐标(可能需要比较长的时间获取):</p> <button οnclick="getLocation()">点我</button> <div id="mapholder"></div> <script> var x=document.getElementById("demo"); function getLocation() { if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(showPosition,showError); } else { x.innerHTML="该浏览器不支持获取地理位置。"; } } function showPosition(position) { var latlon=position.coords.latitude+","+position.coords.longitude; var img_url="http://maps.googleapis.com/maps/api/staticmap?center=" +latlon+"&zoom=14&size=400x300&sensor=false"; document.getElementById("mapholder").innerHTML="<img src='"+img_url+"'>"; } function showError(error) { switch(error.code) { case error.PERMISSION_DENIED: x.innerHTML="用户拒绝对获取地理位置的请求。" break; case error.POSITION_UNAVAILABLE: x.innerHTML="位置信息是不可用的。" break; case error.TIMEOUT: x.innerHTML="请求用户地理位置超时。" break; case error.UNKNOWN_ERROR: x.innerHTML="未知错误。" break; } } </script> </body> </html></code></pre> <p>在上例中,我们使用返回的经纬度数据在谷歌地图中显示位置(使用静态图像)。</p> <h3>Google脚本:</h3> <p>演示如何使用脚本来显示带有标记、缩放和拖曳选项的交互式地图。</p> <pre class="has"><code class="language-html"><!DOCTYPE html> <html> <head> <meta charset="utf-8">  <title>菜鸟教程(runoob.com)</title>  </head> <body> <p id="demo">点击按钮获取您当前坐标(可能需要比较长的时间获取):</p> <button οnclick="getLocation()">点我</button> <div id="mapholder"></div> <script src="https://maps.google.com/maps/api/js?sensor=false"></script> <script> var x=document.getElementById("demo"); function getLocation() { if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(showPosition,showError); } else { x.innerHTML="该浏览器不支持获取地理位置。"; } } function showPosition(position) { lat=position.coords.latitude; lon=position.coords.longitude; latlon=new google.maps.LatLng(lat, lon) mapholder=document.getElementById('mapholder') mapholder.style.height='250px'; mapholder.style.width='500px'; var myOptions={ center:latlon,zoom:14, mapTypeId:google.maps.MapTypeId.ROADMAP, mapTypeControl:false, navigationControlOptions:{style:google.maps.NavigationControlStyle.SMALL} }; var map=new google.maps.Map(document.getElementById("mapholder"),myOptions); var marker=new google.maps.Marker({position:latlon,map:map,title:"You are here!"}); } function showError(error) { switch(error.code) { case error.PERMISSION_DENIED: x.innerHTML="用户拒绝对获取地理位置的请求。" break; case error.POSITION_UNAVAILABLE: x.innerHTML="位置信息是不可用的。" break; case error.TIMEOUT: x.innerHTML="请求用户地理位置超时。" break; case error.UNKNOWN_ERROR: x.innerHTML="未知错误。" break; } } </script> </body> </html></code></pre> <hr> <h3>getCurrentPosition() 方法 - 返回数据</h3> <p>若成功,则 getCurrentPosition() 方法返回对象。始终会返回 latitude、longitude 以及 accuracy 属性。如果可用,则会返回其他下面的属性。</p> <table> <tbody> <tr> <th>属性</th> <th>描述</th> </tr> <tr> <td>coords.latitude</td> <td>十进制数的纬度</td> </tr> <tr> <td>coords.longitude</td> <td>十进制数的经度</td> </tr> <tr> <td>coords.accuracy</td> <td>位置精度</td> </tr> <tr> <td>coords.altitude</td> <td>海拔,海平面以上以米计</td> </tr> <tr> <td>coords.altitudeAccuracy</td> <td>位置的海拔精度</td> </tr> <tr> <td>coords.heading</td> <td>方向,从正北开始以度计</td> </tr> <tr> <td>coords.speed</td> <td>速度,以米/每秒计</td> </tr> <tr> <td>timestamp</td> <td>响应的日期/时间</td> </tr> </tbody> </table> <hr> <h3>Geolocation 对象 - 其他有趣的方法</h3> <p>watchPosition() - 返回用户的当前位置,并继续返回用户移动时的更新位置(就像汽车上的 GPS)。</p> <p>clearWatch() - 停止 watchPosition() 方法</p> <p>下面的例子展示 watchPosition() 方法。您需要一台精确的 GPS 设备来测试该例(比如 iPhone):</p> <p><strong>实例:</strong></p> <pre class="has"><code class="language-html"><!DOCTYPE html> <html> <head>  <meta charset="utf-8">  <title>菜鸟教程(runoob.com)</title>  </head> <body> <p id="demo">点击按钮获取您当前坐标(可能需要比较长的时间获取):</p> <button οnclick="getLocation()">点我</button> <script> var x=document.getElementById("demo"); function getLocation() { if (navigator.geolocation) { navigator.geolocation.watchPosition(showPosition); } else { x.innerHTML="该浏览器不支持获取地理位置。"; } } function showPosition(position) { x.innerHTML="纬度: " + position.coords.latitude + "<br>经度: " + position.coords.longitude; } </script> </body> </html></code></pre> <p> </p> <h1>Video(视频)</h1> <p>直到现在,仍然不存在一项旨在网页上显示视频的标准。</p> <p>今天,大多数视频是通过插件(比如 Flash)来显示的。然而,并非所有浏览器都拥有同样的插件。</p> <blockquote> <p>HTML5 规定了一种通过 video 元素来包含视频的标准方法。</p> </blockquote> <p>如需在 HTML5 中显示视频,您所有需要的是:</p> <p><strong>实例</strong></p> <pre class="has"><code class="language-html"><video width="320" height="240" controls> <source src="movie.mp4" type="video/mp4"> <source src="movie.ogg" type="video/ogg"> 您的浏览器不支持Video标签。 </video></code></pre> <ul> <li><video> 元素提供了 播放、暂停和音量控件来控制视频。</li> <li>同时 <video> 元素也提供了 width 和 height 属性控制视频的尺寸.如果设置的高度和宽度,所需的视频空间会在页面加载时保留。如果没有设置这些属性,浏览器不知道大小的视频,浏览器就不能再加载时保留特定的空间,页面就会根据原始视频的大小而改变。</li> <li><video> 与</video> 标签之间插入的内容是提供给不支持 video 元素的浏览器显示的。</li> <li><video> 元素支持多个 <source> 元素. <source> 元素可以链接不同的视频文件。浏览器将使用第一个可识别的格式:</li> </ul> <p>当前, <video> 元素支持三种视频格式: MP4, WebM, 和 Ogg:</p> <table> <tbody> <tr> <th>浏览器</th> <th>MP4</th> <th>WebM</th> <th>Ogg</th> </tr> <tr> <td>Internet Explorer</td> <td>YES</td> <td>NO</td> <td>NO</td> </tr> <tr> <td>Chrome</td> <td>YES</td> <td>YES</td> <td>YES</td> </tr> <tr> <td>Firefox</td> <td>YES</td> <td>YES</td> <td>YES</td> </tr> <tr> <td>Safari</td> <td>YES</td> <td>NO</td> <td>NO</td> </tr> <tr> <td>Opera</td> <td>YES (从 Opera 25 起)</td> <td>YES</td> <td>YES</td> </tr> </tbody> </table> <ul> <li>MP4 = 带有 H.264 视频编码和 AAC 音频编码的 MPEG 4 文件</li> <li>WebM = 带有 VP8 视频编码和 Vorbis 音频编码的 WebM 文件</li> <li>Ogg = 带有 Theora 视频编码和 Vorbis 音频编码的 Ogg 文件</li> </ul> <hr> <h3>视频格式</h3> <table id="table1"> <tbody> <tr> <th>格式</th> <th>MIME-type</th> </tr> <tr> <td>MP4</td> <td>video/mp4</td> </tr> <tr> <td>WebM</td> <td>video/webm</td> </tr> <tr> <td>Ogg</td> <td>video/ogg</td> </tr> </tbody> </table> <hr> <h3>使用DOM进行控制</h3> <p>HTML5 <video> 和 <audio> 元素同样拥有方法、属性和事件。</p> <p><video> 和 <audio>元素的方法、属性和事件可以使用JavaScript进行控制.</p> <p>其中的方法用于<strong>播放、暂停以及加载</strong>等。其中的属性(比如<strong>时长、音量</strong>等)可以被读取或设置。其中的 DOM 事件能够通知您,比方说,<video> 元素开始播放、已暂停,已停止,等等。</p> <p>例中简单的方法,向我们演示了如何使用 <video> 元素,读取并设置属性,以及如何调用方法。</p> <pre class="has"><code class="language-html"><!DOCTYPE html> <html> <head>  <meta charset="utf-8">  <title>菜鸟教程(runoob.com)</title>  </head> <body> <div style="text-align:center"> <button οnclick="playPause()">播放/暂停</button> <button οnclick="makeBig()">放大</button> <button οnclick="makeSmall()">缩小</button> <button οnclick="makeNormal()">普通</button> <br> <video id="video1" width="420"> <source src="mov_bbb.mp4" type="video/mp4"> <source src="mov_bbb.ogg" type="video/ogg"> 您的浏览器不支持 HTML5 video 标签。 </video> </div> <script> var myVideo=document.getElementById("video1"); function playPause() { if (myVideo.paused) myVideo.play(); else myVideo.pause(); } function makeBig() { myVideo.width=560; } function makeSmall() { myVideo.width=320; } function makeNormal() { myVideo.width=420; } </script> </body> </html></code></pre> <hr> <h3>Video 标签</h3> <table> <tbody> <tr> <th>标签</th> <th>描述</th> </tr> <tr> <td><video></td> <td>定义一个视频</td> </tr> <tr> <td><source></td> <td>定义多种媒体资源,比如 <video> 和<audio></td> </tr> <tr> <td><track></td> <td>定义在媒体播放器文本轨迹</td> </tr> </tbody> </table> <p> </p> <h1>Audio(音频) </h1> <p>直到现在,仍然不存在一项旨在网页上播放音频的标准。</p> <p>今天,大多数音频是通过插件(比如 Flash)来播放的。然而,并非所有浏览器都拥有同样的插件。</p> <blockquote> <p>HTML5 规定了在网页上嵌入音频元素的标准,即使用 <audio> 元素。</p> </blockquote> <p>如需在 HTML5 中播放音频,你需要使用以下代码:</p> <p><strong>实例</strong></p> <pre class="has"><code class="language-html"><!DOCTYPE html> <html> <head>  <meta charset="utf-8">  <title>菜鸟教程(runoob.com)</title>  </head> <body> <audio controls> <source src="horse.ogg" type="audio/ogg"> <source src="horse.mp3" type="audio/mpeg"> 您的浏览器不支持 audio 元素。 </audio> </body> </html></code></pre> <blockquote> <p><strong>control 属性供添加播放、暂停和音量控件。</strong></p> <hr> <p><strong>在<audio> 与 </audio> 之间你需要插入浏览器不支持的<audio>元素的提示文本 。</strong></p> <hr> <p><strong><audio> 元素允许使用多个 <source> 元素. <source> 元素可以链接不同的音频文件,浏览器将使用第一个支持的音频文件</strong></p> </blockquote> <hr> <h3>音频格式及浏览器支持</h3> <p>目前, <audio>元素支持三种音频格式文件: MP3, Wav, 和 Ogg:</p> <table> <tbody> <tr> <th>浏览器</th> <th>MP3</th> <th>Wav</th> <th>Ogg</th> </tr> <tr> <td>Internet Explorer 9+</td> <td>YES</td> <td>NO</td> <td>NO</td> </tr> <tr> <td>Chrome 6+</td> <td>YES</td> <td>YES</td> <td>YES</td> </tr> <tr> <td>Firefox 3.6+</td> <td>YES</td> <td>YES</td> <td>YES</td> </tr> <tr> <td>Safari 5+</td> <td>YES</td> <td>YES</td> <td>NO</td> </tr> <tr> <td>Opera 10+</td> <td>YES</td> <td>YES</td> <td>YES</td> </tr> </tbody> </table> <hr> <h3>音频格式的MIME类型</h3> <table> <tbody> <tr> <th>Format</th> <th>MIME-type</th> </tr> <tr> <td>MP3</td> <td>audio/mpeg</td> </tr> <tr> <td>Ogg</td> <td>audio/ogg</td> </tr> <tr> <td>Wav</td> <td>audio/wav</td> </tr> </tbody> </table> <hr> <h3>HTML5 Audio 标签</h3> <table> <tbody> <tr> <th>标签</th> <th>描述</th> </tr> <tr> <td><audio></td> <td>定义了声音内容</td> </tr> <tr> <td><source></td> <td>规定了多媒体资源, 可以是多个,在 <video> 与 <audio>标签中使用</td> </tr> </tbody> </table> <p> </p> <h1>新的Input类型</h1> <p>HTML5 拥有多个新的表单输入类型。这些新特性提供了更好的输入控制和验证。</p> <p>本章全面介绍这些新的输入类型:</p> <ul> <li>color</li> <li>date</li> <li>datetime</li> <li>datetime-local</li> <li>email</li> <li>month</li> <li>number</li> <li>range</li> <li>search</li> <li>tel</li> <li>time</li> <li>url</li> <li>week</li> </ul> <blockquote> <p><strong>注意:</strong>并不是所有的主流浏览器都支持新的input类型,不过已经可以在所有主流的浏览器中使用它们了。即使不被支持,仍然可以显示为常规的文本域。</p> </blockquote> <hr> <h3>color</h3> <p>color 类型用在input字段主要用于选取颜色,如下所示:</p> <p><strong>实例</strong></p> <p>从拾色器中选择一个颜色:</p> <p>选择你喜欢的颜色:</p> <pre class="has"><code class="language-html"><!DOCTYPE html> <html> <head>  <meta charset="utf-8">  <title>菜鸟教程(runoob.com)</title>  </head> <body> <form action="demo-form.php"> 选择你喜欢的颜色:<input type="color" name ="favcolor"><br> <input type = "submit"> </form> </body> </html></code></pre> <hr> <h3>date</h3> <p>date 类型允许你从一个日期选择器选择一个日期。</p> <p><strong>实例</strong></p> <p>定义一个时间控制器:</p> <p>生日:</p> <pre class="has"><code class="language-html"><input type="date" name="bday"></code></pre> <hr> <h3>datetime</h3> <p>datetime 类型允许你选择一个日期(UTC 时间)。</p> <p><strong>实例</strong></p> <p>定义一个日期和时间控制器(本地时间):</p> <p>生日 (日期和时间):</p> <pre class="has"><code class="language-html"><input type="datetime" name="bdaytime"></code></pre> <hr> <h3>datetime-local</h3> <p>datetime-local 类型允许你选择一个日期和时间 (无时区).</p> <p><strong>实例</strong></p> <p>定义一个日期和时间 (无时区):</p> <p>生日 (日期和时间):</p> <pre class="has"><code class="language-html"><input type="datetime-local" name="bdaytime"></code></pre> <hr> <h3>email</h3> <p>email 类型用于应该包含 e-mail 地址的输入域。</p> <p><strong>实例</strong></p> <p>在提交表单时,会自动验证 email 域的值是否合法有效:</p> <p>E-mail:</p> <pre class="has"><code class="language-html"><input type="email" name="email"></code></pre> <hr> <h3>month</h3> <p>month 类型允许你选择一个月份。</p> <p><strong>实例</strong></p> <p>定义月与年 (无时区):</p> <pre class="has"><code class="language-html"><input type="month" name="bdaymonth"></code></pre> <hr> <h3>number</h3> <p> number 类型用于应该包含数值的输入域。</p> <p>还能够设定对所接受的数字的限定:</p> <p><strong>实例</strong></p> <p>定义一个数值输入域(限定):</p> <p>数量 ( 1 到 5 之间 ):</p> <pre class="has"><code class="language-html"><input type="number" name="quantity" min ="1" max="5"></code></pre> <p>使用下面的属性来规定对数字类型的限定:</p> <table> <tbody> <tr> <th>属性</th> <th>描述</th> </tr> <tr> <td>disabled</td> <td>规定输入字段是禁用的</td> </tr> <tr> <td>max</td> <td>规定允许的最大值</td> </tr> <tr> <td>maxlength</td> <td>规定输入字段的最大字符长度</td> </tr> <tr> <td>min</td> <td>规定允许的最小值</td> </tr> <tr> <td>pattern</td> <td>规定用于验证输入字段的模式</td> </tr> <tr> <td>readonly</td> <td>规定输入字段的值无法修改</td> </tr> <tr> <td>required</td> <td>规定输入字段的值是必需的</td> </tr> <tr> <td>size</td> <td>规定输入字段中的可见字符数</td> </tr> <tr> <td>step</td> <td>规定输入字段的合法数字间隔</td> </tr> <tr> <td>value</td> <td>规定输入字段的默认值</td> </tr> </tbody> </table> <hr> <h3>range</h3> <p>range 类型用于应该包含一定范围内数字值的输入域。</p> <p>range 类型显示为滑动条。</p> <p><strong>实例</strong></p> <p>定义一个不需要非常精确的数值(类似于滑块控制):</p> <pre class="has"><code class="language-html"><input type="range" name="points" min ="1" max="10"></code></pre> <p>请使用下面的属性来规定对数字类型的限定:</p> <ul> <li>max - 规定允许的最大值</li> <li>min - 规定允许的最小值</li> <li>step - 规定合法的数字间隔</li> <li>value - 规定默认值</li> </ul> <hr> <h3>search</h3> <p>search 类型用于搜索域,比如站点搜索或 Google 搜索。</p> <p><strong>实例</strong></p> <p>定义一个搜索字段 (类似站点搜索或者Google搜索):</p> <p>Search Google: </p> <pre class="has"><code class="language-html"><input type="search" name="googlesearch"></code></pre> <h3> </h3> <hr> <h3>tel</h3> <p><strong>实例</strong></p> <p>定义输入电话号码字段:</p> <p>电话号码:</p> <pre class="has"><code class="language-html"><input type="tel" name="usrtel"></code></pre> <hr> <h3>time</h3> <p>time 类型允许你选择一个时间。</p> <p><strong>实例</strong></p> <p>定义可输入时间控制器(无时区):</p> <p>选择时间:</p> <pre class="has"><code class="language-html"><input type="time" name="usr_time"></code></pre> <hr> <h3>url</h3> <p>url 类型用于应该包含 URL 地址的输入域。</p> <p>在提交表单时,会自动验证 url 域的值。</p> <p><strong>实例</strong></p> <p>定义输入URL字段:</p> <p>添加您的主页:</p> <pre class="has"><code class="language-html"><input type="url" name="homepage"></code></pre> <p><strong>提示:</strong> iPhone 中的 Safari 浏览器支持 url 输入类型,并通过改变触摸屏键盘来配合它(添加 .com 选项)。</p> <hr> <h3>week</h3> <p>week 类型允许你选择周和年。</p> <p><strong>实例</strong></p> <p>定义周和年 (无时区):</p> <p>选择周:</p> <pre class="has"><code class="language-html"><input type="week" name="week_year"></code></pre> <p> </p> <h1>新的表单元素 </h1> <p>HTML5 有以下新的表单元素:</p> <ul> <li><datalist></li> <li><keygen></li> <li><output></li> </ul> <p><strong>注意:</strong>不是所有的浏览器都支持HTML5 新的表单元素,但是你可以在使用它们,即使浏览器不支持表单属性,仍然可以显示为常规的表单元素。</p> <hr> <h3><datalist></h3> <p><datalist> 元素规定输入域的选项列表。</p> <p><datalist> 属性规定 form 或 input 域应该拥有自动完成功能。当用户在自动完成域中开始输入时,浏览器应该在该域中显示填写的选项:</p> <p>使用 <input> 元素的列表属性与 <datalist> 元素绑定.</p> <p><strong>实例</strong></p> <p><input> 元素使用<datalist>预定义值:</p> <pre class="has"><code class="language-html"><input list="browsers"> <datalist id = "browsers"> <option value = "Internet Explorer"> <option value = "Firefox"> <option value = "Chrome"> <option value = "Opera"> <option value = "Safari"> </datalist> </code></pre> <hr> <h3><keygen></h3> <p><keygen> 元素的作用是提供一种验证用户的可靠方法。</p> <p><keygen>标签规定用于表单的密钥对生成器字段。</p> <p>当提交表单时,会生成两个键,一个是私钥,一个公钥。</p> <p>私钥(private key)存储于客户端,公钥(public key)则被发送到服务器。公钥可用于之后验证用户的客户端证书(client certificate)。</p> <p><strong>实例</strong></p> <p>带有keygen字段的表单:</p> <pre class="has"><code class="language-html"><form action = "demo_keygen.asp" method = "get"> 用户名:<input type = "text" name = "usr_name"> 加密:<keygen name = "security"> <input type ="submit"> </form></code></pre> <hr> <h3><output></h3> <p><output> 元素用于不同类型的输出,比如计算或脚本输出:</p> <p><strong>实例</strong></p> <p>将计算结果显示在 <output> 元素:</p> <pre class="has"><code class="language-html"><form oninput = "x.value=parseInt(a.value)+parseInt(b.value)">0 <input type = "range" id = "a" value = "50">100+ <input type = "number" id = "b" value = "50">= <output name = "x" for = "a b"></output> </form> </code></pre> <p><a href="http://img.e-com-net.com/image/info8/1828c1176437404ca4865fc4dc3b57e5.jpg" target="_blank"><img alt="HTML5学习笔记_第2张图片" class="has" height="238" src="http://img.e-com-net.com/image/info8/1828c1176437404ca4865fc4dc3b57e5.jpg" width="529" style="border:1px solid black;"></a></p> <p> </p> <h1>新的表单属性</h1> <p>HTML5 的 <form> 和 <input>标签添加了几个新属性.</p> <p><form>新属性:</p> <ul> <li>autocomplete</li> <li>novalidate</li> </ul> <p><input>新属性:</p> <ul> <li>autocomplete</li> <li>autofocus</li> <li>form</li> <li>formaction</li> <li>formenctype</li> <li>formmethod</li> <li>formnovalidate</li> <li>formtarget</li> <li>height 与 width</li> <li>list</li> <li>min 与 max</li> <li>multiple</li> <li>pattern (regexp)</li> <li>placeholder</li> <li>required</li> <li>step</li> </ul> <hr> <h3><form> / <input> autocomplete 属性</h3> <p>autocomplete 属性规定 form 或 input 域应该拥有自动完成功能。</p> <p>当用户在自动完成域中开始输入时,浏览器应该在该域中显示填写的选项。</p> <p><strong>提示:</strong> autocomplete 属性有可能在 form元素中是开启的,而在input元素中是关闭的。</p> <p><strong>注意:</strong> autocomplete 适用于 <form> 标签,以及以下类型的 <input> 标签:text, search, url, telephone, email, password, datepickers, range 以及 color。</p> <p><strong>实例</strong></p> <p>HTML form 中开启 autocomplete (一个 input 字段关闭 autocomplete ):</p> <pre class="has"><code class="language-html"><form action="demo-form.php" autocomplete="on"> First name:<input type="text" name="fname"><br> Last name:<input type="text" name="lname"><br> E-mail:<input type="email" name="email" autocomplete="off"> <input type="submit"> </form></code></pre> <p><strong>提示:</strong>某些浏览器中,可能需要启用自动完成功能,以使该属性生效。</p> <hr> <h3><form> novalidate 属性</h3> <p>novalidate 属性是一个<strong> boolean(布尔)</strong> 属性.</p> <p>novalidate 属性规定在提交表单时不应该验证 form 或 input 域。</p> <p><strong>实例</strong></p> <p>无需验证提交的表单数据</p> <pre class="has"><code class="language-html"><form action="demo-form.php" novalidate> E-mail: <input type="email" name="user_email"> <input type="submit"> </form></code></pre> <hr> <h2><input> autofocus 属性</h2> <p>autofocus 属性是一个 boolean 属性.</p> <p>autofocus 属性规定在页面加载时,域自动地获得焦点。</p> <p><strong>实例</strong></p> <p>让 "First name" input 输入域在页面载入时自动聚焦:</p> <pre class="has"><code class="language-html">First name:<input type="text" name="fname" autofocus></code></pre> <hr> <h2><input> form 属性</h2> <p>form 属性规定输入域所属的一个或多个表单。</p> <p><strong>提示:</strong>如需引用一个以上的表单,请使用空格分隔的列表。</p> <p><strong>实例</strong></p> <p>位于form表单外的 input 字段引用了 HTML form (该 input 表单仍然属于form表单的一部分):</p> <pre class="has"><code class="language-html"><!DOCTYPE html> <html> <head>  <meta charset="utf-8">  <title>菜鸟教程(runoob.com)</title>  </head> <body> <form action="demo-form.php" id="form1"> First name: <input type="text" name="fname"><br> <input type="submit" value="提交"> </form> <p> "Last name" 字段没有在 form 表单之内,但它也是 form 表单的一部分。</p> Last name: <input type="text" name="lname" form="form1"> <p><b>注意:</b> IE 不支持 form 属性</p> </body> </html></code></pre> <hr> <h3><input> formaction 属性</h3> <p>The formaction 属性用于描述表单提交的URL地址.</p> <blockquote> <p><strong>The formaction 属性会覆盖<form> 元素中的action属性.</strong></p> <p><strong>注意: </strong>The formaction 属性用于 type="submit" 和 type="image".</p> </blockquote> <p><strong>实例</strong></p> <p>以下HTMLform表单包含了两个不同地址的提交按钮:</p> <pre class="has"><code class="language-html"><form action="demo-form.php"> First name: <input type="text" name="fname"><br> Last name: <input type="text" name="lname"><br> <input type="submit" value="提交"><br> <input type="submit" formaction="demo-admin.php" value="提交"> </form></code></pre> <hr> <h3><input> formenctype 属性</h3> <blockquote> <p>formenctype 属性描述了表单提交到服务器的数据编码 (<strong>只对form表单中 method="post" 表单</strong>)</p> <p>formenctype 属性<strong>覆盖 form 元素的 enctype 属性</strong>。</p> </blockquote> <p><strong>主要: </strong>该属性与 type="submit" 和 type="image" 配合使用。</p> <p><strong>实例</strong></p> <p>第一个提交按钮已默认编码发送表单数据,第二个提交按钮以 "multipart/form-data" 编码格式发送表单数据:</p> <pre class="has"><code class="language-html"><form action="demo-post_enctype.php" method="post"> First name: <input type="text" name="fname"><br> <input type="submit" value="提交"> <input type="submit" formenctype="multipart/form-data" value="以 Multipart/form-data 提交"> </form></code></pre> <hr> <h3><input> formmethod 属性</h3> <p>formmethod 属性定义了表单提交的方式。</p> <p>formmethod 属性覆盖了 <form> 元素的 method 属性。</p> <p><strong>注意:</strong> 该属性可以与 type="submit" 和 type="image" 配合使用。</p> <p><strong>实例</strong></p> <p>重新定义表单提交方式实例:</p> <pre class="has"><code class="language-html"><form action="demo-form.php" method="get"> First name: <input type="text" name="fname"><br> Last name: <input type="text" name="lname"><br> <input type="submit" value="提交"> <input type="submit" formmethod="post" formaction="demo-post.php" value="使用 POST 提交"> </form></code></pre> <hr> <h3><input> formnovalidate 属性</h3> <p>novalidate 属性是一个 boolean 属性.</p> <p>novalidate属性描述了 <input> 元素在表单提交时无需被验证。</p> <p>formnovalidate 属性会覆盖 <form> 元素的novalidate属性.</p> <p><strong>注意:</strong> formnovalidate 属性与type="submit一起使用</p> <p><strong>实例</strong></p> <p>两个提交按钮的表单(使用与不适用验证 ):</p> <pre class="has"><code class="language-html"><form action="demo-form.php">   E-mail: <input type="email" name="userid"><br>   <input type="submit" value="提交"><br>   <input type="submit" formnovalidate value="不验证提交"> </form></code></pre> <hr> <h3><input> formtarget 属性</h3> <p>formtarget 属性指定一个名称或一个关键字来指明表单提交数据接收后的展示。</p> <p>The formtarget 属性覆盖 <form>元素的target属性.</p> <p><strong>注意:</strong> formtarget 属性与type="submit" 和 type="image"配合使用.</p> <p>实例</p> <p>两个提交按钮的表单, 在不同窗口中显示:</p> <pre class="has"><code class="language-html"><form action="demo-form.php">   First name: <input type="text" name="fname"><br>   Last name: <input type="text" name="lname"><br>   <input type="submit" value="正常提交">   <input type="submit" formtarget="_blank"   value="提交到一个新的页面上"> </form></code></pre> <hr> <h3><input> height 和 width 属性</h3> <p>height 和 width 属性规定用于 image 类型的 <input> 标签的图像高度和宽度。</p> <blockquote> <p><strong>注意:</strong> height 和 width 属性只适用于 image 类型的<input> 标签。</p> </blockquote> <p><strong>提示:</strong>图像通常会同时指定高度和宽度属性。如果图像设置高度和宽度,图像所需的空间 在加载页时会被保留。如果没有这些属性, 浏览器不知道图像的大小,并不能预留 适当的空间。图片在加载过程中会使页面布局效果改变 (尽管图片已加载)。</p> <p><strong>实例</strong></p> <p>定义了一个图像提交按钮, 使用了 height 和 width 属性:</p> <pre class="has"><code class="language-html"><input type="image" src="img_submit.gif" alt="Submit" width="48" height="48"></code></pre> <hr> <h3><input> list 属性</h3> <p>list 属性规定输入域的 datalist。datalist 是输入域的选项列表。</p> <p>实例</p> <p>在 <datalist>中预定义 <input> 值:</p> <pre class="has"><code class="language-html"><input list="browsers"> <datalist id="browsers">   <option value="Internet Explorer">   <option value="Firefox">   <option value="Chrome">   <option value="Opera">   <option value="Safari"> </datalist></code></pre> <hr> <h2><input> min 和 max 属性</h2> <p>min、max 和 step 属性用于为包含数字或日期的 input 类型规定限定(约束)。</p> <p><strong>注意:</strong> min、max 和 step 属性适用于以下类型的 <input> 标签:date pickers、number 以及 range。</p> <p><strong>实例</strong></p> <p><input> 元素最小值与最大值设置:</p> <pre class="has"><code class="language-html">//Enter a date before 1980-01-01: <input type="date" name="bday" max="1979-12-31"> //Enter a date after 2000-01-01: <input type="date" name="bday" min="2000-01-02"> //Quantity (between 1 and 5): <input type="number" name="quantity" min="1" max="5"></code></pre> <hr> <h3><input> multiple 属性</h3> <p>multiple 属性是一个 boolean 属性.</p> <p>multiple 属性规定<input> 元素中可选择多个值。</p> <p><strong>注意:</strong> multiple 属性适用于以下类型的 <input> 标签:email 和 file:</p> <p><strong>实例</strong></p> <p>上传多个文件:</p> <p>Select images:</p> <pre class="has"><code class="language-html"><input type="file" name="img" multiple></code></pre> <hr> <h3><input> pattern 属性</h3> <p>pattern 属性描述了一个正则表达式用于验证 <input> 元素的值。</p> <p><strong>注意:</strong>pattern 属性适用于以下类型的 <input> 标签: text, search, url, tel, email, 和 password.</p> <p><strong>提示:</strong> 是用来全局 title 属性描述了模式.</p> <p><strong>实例</strong></p> <p>下面的例子显示了一个只能包含三个字母的文本域(不含数字及特殊字符):</p> <p>Country code:</p> <pre class="has"><code class="language-html"><input type="text" name="country_code" pattern="[A-Za-z]{3}" title="Three letter country code"></code></pre> <hr> <h3><input> placeholder 属性</h3> <p>placeholder 属性提供一种提示(hint),描述输入域所期待的值。</p> <p>简短的提示在用户输入值前会显示在输入域上。</p> <p><strong>注意:</strong> placeholder 属性适用于以下类型的 <input> 标签:text, search, url, telephone, email 以及 password。</p> <p><strong>实例</strong></p> <p>input 字段提示文本t:</p> <pre class="has"><code class="language-html"><input type="text" name="fname" placeholder="First name"></code></pre> <hr> <h3><input> required 属性</h3> <p>required 属性是一个 boolean 属性.</p> <blockquote> <p>required 属性规定必须在提交之前填写输入域(不能为空)。</p> </blockquote> <p><strong>注意:</strong>required 属性适用于以下类型的 <input> 标签:text, search, url, telephone, email, password, date pickers, number, checkbox, radio 以及 file。</p> <p><strong>实例</strong></p> <p>不能为空的input字段:</p> <p>Username:</p> <pre class="has"><code class="language-html"><input type="text" name="usrname" required></code></pre> <hr> <h3><input> step 属性</h3> <p>step 属性为输入域规定合法的数字间隔。</p> <p>如果 step="3",则合法的数是 -3,0,3,6 等</p> <blockquote> <p><strong>提示:</strong> step 属性可以与 max 和 min 属性创建一个区域值.</p> </blockquote> <p><strong>注意:</strong> step 属性与以下type类型一起使用: number, range, date, datetime, datetime-local, month, time 和 week.</p> <p><strong>实例</strong></p> <p>规定input step步长为3:</p> <pre class="has"><code class="language-html"><input type="number" name="points" step="3"></code></pre> <p> </p> <h1>语义元素</h1> <p>语义= 意义</p> <p>语义元素 = 有意义的元素</p> <blockquote> <p>一个语义元素能够清楚的描述其意义给浏览器和开发者。</p> </blockquote> <p><strong>无语义</strong> 元素实例: <div> 和 <span> - 无需考虑内容.</p> <p><strong>语义</strong>元素实例: <form>, <table>, and <img> - 清楚的定义了它的内容.</p> <p>许多现有网站都包含以下HTML代码: <div id="nav">, <div class="header">, 或者 <div id="footer">, 来指明导航链接, 头部, 以及尾部.</p> <hr> <h3>HTML5 中新的语义元素</h3> <p>HTML5 提供了新的语义元素来明确一个Web页面的不同部分:</p> <ul> <li><header></li> <li><nav></li> <li><section></li> <li><article></li> <li><aside></li> <li><figcaption></li> <li><figure></li> <li><footer></li> </ul> <p></p> <hr> <h3><section></h3> <p><section> 标签定义文档中的节(section、区段)。比如章节、页眉、页脚或文档中的其他部分。</p> <p>根据W3C HTML5文档: section 包含了一组内容及其标题。</p> <pre class="has"><code class="language-html"><!DOCTYPE html> <html> <head>  <meta charset="utf-8">  <title>菜鸟教程(runoob.com)</title>  </head> <body> <section> <h1>WWF</h1> <p>The World Wide Fund for Nature (WWF) is an international organization working on issues regarding the conservation, research and restoration of the environment, formerly named the World Wildlife Fund. WWF was founded in 1961.</p> </section> <section> <h1>WWF's Panda symbol</h1> <p>The Panda has become the symbol of WWF. The well-known panda logo of WWF originated from a panda named Chi Chi that was transferred from the Beijing Zoo to the London Zoo in the same year of the establishment of WWF.</p> </section> </body> </html></code></pre> <hr> <h3><article></h3> <p><article> 标签定义独立的内容。.</p> <p><article> 元素使用实例:</p> <ul> <li>Forum post</li> <li>Blog post</li> <li>News story</li> <li>Comment</li> </ul> <pre class="has"><code class="language-html"><article> <h1>Internet Explorer 9</h1> <p>Windows Internet Explorer 9(缩写为 IE9 )在2011年3月14日21:00 发布。</p> </article></code></pre> <hr> <h3><nav></h3> <p><nav> 标签定义导航链接的部分。</p> <p><nav> 元素用于定义页面的导航链接部分区域,但是,不是所有的链接都需要包含在 <nav> 元素中!</p> <pre class="has"><code class="language-html"><nav> <a href="/html/">HTML</a> | <a href="/css/">CSS</a> | <a href="/js/">JavaScript</a> | <a href="/jquery/">jQuery</a> </nav></code></pre> <hr> <h3><aside></h3> <p><aside> 标签定义页面主区域内容之外的内容(比如侧边栏)。</p> <p>aside 标签的内容应与主区域的内容相关.</p> <pre class="has"><code class="language-html"><p>My family and I visited The Epcot center this summer.</p> <aside> <h4>Epcot Center</h4> <p>The Epcot Center is a theme park in Disney World, Florida.</p> </aside></code></pre> <hr> <h3><header></h3> <p><header>元素描述了文档的头部区域</p> <p><header>元素主要用于定义内容的介绍展示区域.</p> <p>在页面中你可以使用多个<header> 元素.</p> <p>以下实例定义了文章的头部:</p> <pre class="has"><code class="language-html"><article> <header> <h1>Internet Explorer 9</h1> <p><time pubdate datetime="2011-03-15"></time></p> </header> <p>Windows Internet Explorer 9(缩写为 IE9 )是在2011年3月14日21:00发布的</p> </article></code></pre> <hr> <h3><footer></h3> <p><footer> 元素描述了文档的底部区域.</p> <p><footer> 元素应该包含它的包含元素</p> <p>一个页脚通常包含文档的作者,著作权信息,链接的使用条款,联系信息等</p> <p>文档中你可以使用多个 <footer>元素.</p> <pre class="has"><code class="language-html"><footer> <p>Posted by: Hege Refsnes</p> <p><time pubdate datetime="2012-03-01"></time></p> </footer> </code></pre> <hr> <h3><figure> 和 <figcaption></h3> <p><figure>标签规定独立的流内容(图像、图表、照片、代码等等)。</p> <p><figure> 元素的内容应该与主内容相关,但如果被删除,则不应对文档流产生影响。</p> <p><figcaption> 标签定义 <figure> 元素的标题.</p> <p><figcaption>元素应该被置于 "figure" 元素的第一个或最后一个子元素的位置。</p> <pre class="has"><code class="language-html"><figure> <img src="img_pulpit.jpg" alt="The Pulpit Rock" width="304" height="228"> <figcaption>Fig1. - The Pulpit Pock, Norway.</figcaption> </figure></code></pre> <hr> <h3>注意</h3> <p>以上的元素都是块元素(除了<figcaption>).</p> <blockquote> <p>为了让这些块及元素在所有版本的浏览器中生效,你需要在样式表文件中设置一下属性 (以下样式代码可以让旧版本浏览器支持本章介绍的块级元素):</p> </blockquote> <pre class="has"><code class="language-css">header, section, footer, aside, nav, article, figure {      display: block;  }</code></pre> <p>IE8 及更早IE版本无法在这些元素中渲染CSS效果,以至于你不能使用 <header>, <section>, <footer>, <aside>, <nav>, <article>, <figure>, 或者其他的HTML5 elements.</p> <p><strong>解决办法:</strong> 你可以使用HTML5 Shiv Javascript脚本来解决IE的兼容问题。HTML5 Shiv下载地址:http://cdn.static.runoob.com/libs/html5shiv/3.7/html5shiv.min.js</p> <p>下载后,将以下代码放入到网页中:</p> <pre class="has"><code class="language-html"><!--[if lt IE 9]> <script src="html5shiv.js"></script> <![endif]--></code></pre> <p>以上代码在浏览器小于IE9版本时会加载html5shiv.js文件. 你必须将其放置于<head> 元素中,因为 IE浏览器需要在头部加载后渲染这些HTML5的新元素</p> <p> </p> <h1>Web 存储</h1> <p>使用HTML5可以在本地存储用户的浏览数据。</p> <p>早些时候,本地存储使用的是 cookie。但是Web 存储需要更加的安全与快速. 这些数据不会被保存在服务器上,但是这些数据只用于用户请求网站数据上.它也可以存储大量的数据,而不影响网站的性能.</p> <blockquote> <p>数据以 键/值 对存在, web网页的数据只允许该网页访问使用。</p> </blockquote> <h3>localStorage 和 sessionStorage </h3> <p>客户端存储数据的两个对象为:</p> <ul> <li>localStorage - 用于长久保存整个网站的数据,保存的数据没有过期时间,直到手动去除。</li> <li>sessionStorage - 用于临时保存同一窗口(或标签页)的数据,在关闭窗口或标签页之后将会删除这些数据。</li> </ul> <p>在使用 web 存储前,应检查浏览器是否支持 localStorage 和sessionStorage:</p> <pre class="has"><code class="language-javascript">if(typeof(Storage)!=="undefined") { // 是的! 支持 localStorage sessionStorage 对象! // 一些代码..... } else { // 抱歉! 不支持 web 存储。 }</code></pre> <hr> <h3>localStorage 对象 </h3> <p>ocalStorage 对象存储的数据没有时间限制。第二天、第二周或下一年之后,数据依然可用。</p> <pre class="has"><code class="language-javascript">localStorage.sitename="jQuery教程"; document.getElementById("result").innerHTML="网站名"+localStorage.sitename;</code></pre> <p>实例解析:</p> <ul> <li>使用 key="sitename" 和 value="jQuery教程" 创建一个 localStorage 键/值对。 </li> <li>检索键值为"sitename" 的值然后将数据插入 id="result"的元素中。</li> </ul> <p>以上实例也可以这么写:</p> <pre class="has"><code class="language-javascript">// 存储 localStorage.sitename = "菜鸟教程"; // 查找 document.getElementById("result").innerHTML = localStorage.sitename;</code></pre> <p>移除 localStorage 中的 ""sitename" :</p> <pre class="has"><code class="language-javascript">localStorage.removeItem("sitename");</code></pre> <p>不管是 localStorage,还是 sessionStorage,可使用的API都相同,常用的有如下几个(以localStorage为例):</p> <ul> <li>保存数据:localStorage.setItem(key,value);</li> <li>读取数据:localStorage.getItem(key);</li> <li>删除单个数据:localStorage.removeItem(key);</li> <li>删除所有数据:localStorage.clear();</li> <li>得到某个索引的key:localStorage.key(index);</li> </ul> <p><strong>提示:</strong> 键/值对通常以字符串存储,你可以按自己的需要转换该格式。</p> <p>下面的实例展示了用户点击按钮的次数。</p> <p>代码中的字符串值转换为数字类型:</p> <pre class="has"><code class="language-html"><!DOCTYPE html> <html> <head> <meta charset="utf-8">  <title>菜鸟教程(runoob.com)</title>  <script> function clickCounter() { if(typeof(Storage)!=="undefined") { if (localStorage.clickcount) { localStorage.clickcount=Number(localStorage.clickcount)+1; } else { localStorage.clickcount=1; } document.getElementById("result").innerHTML=" 你已经点击了按钮 " + localStorage.clickcount + " 次 "; } else { document.getElementById("result").innerHTML="对不起,您的浏览器不支持 web 存储。"; } } </script> </head> <body> <p><button οnclick="clickCounter()" type="button">点我!</button></p> <div id="result"></div> <p>点击该按钮查看计数器的增加。</p> <p>关闭浏览器选项卡(或窗口),重新打开此页面,计数器将继续计数(不是重置)。</p> </body> </html></code></pre> <hr> <h3>sessionStorage</h3> <p>sessionStorage 方法针对一个 session 进行数据存储。当用户关闭浏览器窗口后,数据会被删除。</p> <p>如何创建并访问一个 sessionStorage:</p> <pre class="has"><code class="language-javascript">if (sessionStorage.clickcount) { sessionStorage.clickcount=Number(sessionStorage.clickcount)+1; } else { sessionStorage.clickcount=1; } document.getElementById("result").innerHTML="在这个会话中你已经点击了该按钮 " + sessionStorage.clickcount + " 次 ";</code></pre> <hr> <h3>用 Web Storage 开发一个简单的网站列表程序 </h3> <p>网站列表程序实现以下功能:</p> <ul> <li>可以输入网站名,网址,以网站名作为key存入localStorage;</li> <li>根据网站名,查找网址;</li> <li>列出当前已保存的所有网站;</li> </ul> <p>以下代码用于保存于查找数据:</p> <pre class="has"><code class="language-javascript">// 保存数据 function save(){ var siteurl = document.getElementById("siteurl").value; var sitename = document.getElementById("sitename").value; localStorage.setItem(sitename,siteurl); alert("添加成功"); } // 查找数据 function find(){ var search_site=document.getElementById("search_site").value; var sitename=localStorage.getItem(search_site); var find_result=document.getElementById("find_result"); find_result.innerHTML = search_site + "的网址是:" + sitename; } </code></pre> <p>完整实例如下:</p> <pre class="has"><code class="language-html"><!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>HTML5本地存储之Web Storage篇</title> </head> <body> <div style="border: 2px dashed #ccc;width:320px;text-align:center;"> <label for="sitename">网站名(key):</label> <input type="text" id="sitename" name="sitename" class="text"/> <br/> <label for="siteurl">网 址(value):</label> <input type="text" id="siteurl" name="siteurl"/> <br/> <input type="button" οnclick="save()" value="新增记录"/> <hr/> <label for="search_phone">输入网站名:</label> <input type="text" id="search_site" name="search_site"/> <input type="button" οnclick="find()" value="查找网站"/> <p id="find_result"><br/></p> </div> <br/> <div id="list"> </div> <script> // 载入所有存储在localStorage的数据 loadAll(); //保存数据 function save(){ var siteurl = document.getElementById("siteurl").value; var sitename = document.getElementById("sitename").value; localStorage.setItem(sitename, siteurl); alert("添加成功"); } //查找数据 function find(){ var search_site = document.getElementById("search_site").value; var siteurl = localStorage.getItem(search_site); var find_result = document.getElementById("find_result"); find_result.innerHTML = search_site + "的网址是:" + siteurl; } //将所有存储在localStorage中的对象提取出来,并展现到界面上 function loadAll(){ var list = document.getElementById("list"); if(localStorage.length>0){ var result = "<table border='1'>"; result += "<tr><td>key</td><td>value</td></tr>"; for(var i=0;i<localStorage.length;i++){ var sitename = localStorage.key(i); var siteurl = localStorage.getItem(sitename); result += "<tr><td>"+sitename+"</td><td>"+siteurl+"</td></tr>"; } result += "</table>"; list.innerHTML = result; }else{ list.innerHTML = "数据为空……"; } } </script> </body> </html></code></pre> <p>以上实例只是演示了简单的 localStorage 存储与查找,更多情况下我们存储的数据会更复杂。</p> <p>接下来我们将使用 JSON.stringfy 来存储对象数据,<strong>JSON.stringfy 可以将对象转换为字符串</strong>。</p> <pre class="has"><code class="language-javascript">var site = new Object; ... var str = JSON.stringify(site); // 将对象转换为字符串 </code></pre> <p>之后我们<strong>使用 JSON.parse() 方法将字符串转换为 JSON 对象</strong>:</p> <pre class="has"><code class="language-javascript">var site = JSON.parse(str);</code></pre> <p>JavaScript 实现代码:</p> <p><strong>save() 与 find() 方法</strong></p> <pre class="has"><code class="language-javascript">//保存数据 function save(){ var site = new Object; site.keyname = document.getElementById("keyname").value; site.sitename = document.getElementById("sitename").value; site.siteurl = document.getElementById("siteurl").value; var str = JSON.stringify(site); // 将对象转换为字符串 localStorage.setItem(site.keyname,str); alert("保存成功"); } //查找数据 function find(){ var search_site = document.getElementById("search_site").value; var str = localStorage.getItem(search_site); var find_result = document.getElementById("find_result"); var site = JSON.parse(str); find_result.innerHTML = search_site + "的网站名是:" + site.sitename + ",网址是:" + site.siteurl; }</code></pre> <p>完整实例如下:</p> <pre class="has"><code class="language-html"><!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>HTML5本地存储之Web Storage篇</title> </head> <body> <div style="border: 2px dashed #ccc;width:320px;text-align:center;"> <label for="keyname">别名(key):</label> <input type="text" id="keyname" name="keyname" class="text"/> <br/> <label for="sitename">网站名:</label> <input type="text" id="sitename" name="sitename" class="text"/> <br/> <label for="siteurl">网 址:</label> <input type="text" id="siteurl" name="siteurl"/> <br/> <input type="button" οnclick="save()" value="新增记录"/> <hr/> <label for="search_phone">输入别名(key):</label> <input type="text" id="search_site" name="search_site"/> <input type="button" οnclick="find()" value="查找网站"/> <p id="find_result"><br/></p> </div> <br/> <div id="list"> </div> <script> //保存数据 function save(){ var site = new Object; site.keyname = document.getElementById("keyname").value; site.sitename = document.getElementById("sitename").value; site.siteurl = document.getElementById("siteurl").value; var str = JSON.stringify(site); // 将对象转换为字符串 localStorage.setItem(site.keyname,str); alert("保存成功"); } //查找数据 function find(){ var search_site = document.getElementById("search_site").value; var str = localStorage.getItem(search_site); var find_result = document.getElementById("find_result"); var site = JSON.parse(str); find_result.innerHTML = search_site + "的网站名是:" + site.sitename + ",网址是:" + site.siteurl; } //将所有存储在localStorage中的对象提取出来,并展现到界面上 // 确保存储的 keyname 对应的值为转换对象,否则JSON.parse会报错 function loadAll(){ var list = document.getElementById("list"); if(localStorage.length>0){ var result = "<table border='1'>"; result += "<tr><td>别名</td><td>网站名</td><td>网址</td></tr>"; for(var i=0;i<localStorage.length;i++){ var keyname = localStorage.key(i); var str = localStorage.getItem(keyname); var site = JSON.parse(str); result += "<tr><td>"+site.keyname+"</td><td>"+site.sitename+"</td><td>"+site.siteurl+"</td></tr>"; } result += "</table>"; list.innerHTML = result; }else{ list.innerHTML = "数据为空..."; } } </script> </body> </html></code></pre> <p>实例中的 loadAll 输出了所有存储的数据,你需要确保 localStorage 存储的数据都为 JSON 格式,否则 JSON.parse(str) 将会报错。</p> <p> </p> <h1>Web SQL 数据库</h1> <blockquote> <p>Web SQL 数据库 API 并不是 HTML5 规范的一部分,但是它是一个独立的规范,引入了一组使用 SQL 操作客户端数据库的 APIs。</p> </blockquote> <h3>核心方法</h3> <p>以下是规范中定义的三个核心方法:</p> <ol> <li><strong>openDatabase</strong>:这个方法使用现有的数据库或者新建的数据库创建一个数据库对象。</li> <li><strong>transaction</strong>:这个方法让我们能够控制一个事务,以及基于这种情况执行提交或者回滚。</li> <li><strong>executeSql</strong>:这个方法用于执行实际的 SQL 查询。</li> </ol> <hr> <h3>打开数据库</h3> <p>我们可以使用 openDatabase() 方法来打开已存在的数据库,如果数据库不存在,则会创建一个新的数据库,使用代码如下:</p> <pre class="has"><code class="language-javascript">var db = openDatabase('mydb','1.0','Test DB',2*1024*1024);</code></pre> <p>openDatabase() 方法对应的五个参数说明:</p> <ol> <li>数据库名称</li> <li>版本号</li> <li>描述文本</li> <li>数据库大小</li> <li>创建回调</li> </ol> <p>第五个参数,创建回调会在创建数据库后被调用。</p> <hr> <h3>执行查询操作</h3> <p>执行操作使用 database.transaction() 函数:</p> <pre class="has"><code class="language-javascript">var db = openDatabase('mydb','1.0','Test DB',2*1024*1024); db.transaction(function(tx){ tx.executeSql("CREATE TABLE IF NOT EXISTS LOGS (id unique,log)"); });</code></pre> <p>上面的语句执行后会在 'mydb' 数据库中创建一个名为 LOGS 的表。</p> <hr> <h3> 插入数据</h3> <p>在执行上面的创建表语句后,我们可以插入一些数据:</p> <pre class="has"><code class="language-javascript">var db = openDatabase('mydb','1.0','Test DB',2*1024*1024); db.transaction(function(tx){ tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS (id unique,log)'); tx.executeSql('IMSERT INTO LOGS (id,log) VALUES(1,"Maggie")'); tx.executeSql('INSERT INTO LOGS (id,log) VALUES(2,"Going on') });</code></pre> <p>我们也可以使用动态值来插入数据:</p> <pre class="has"><code class="language-javascript">var db = openDatabase('mydb','1.0','Test DB',2*1024*1024); db.transaction(function(tx){ tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS (id unique,log)'); tx.executeSql('IMSERT INTO LOGS (id,log) VALUES (?,?)',[e_id,e_log]); });</code></pre> <p>实例中的 e_id 和 e_log 是外部变量,executeSql 会映射数组参数中的每个条目给 "?"。</p> <hr> <h3>读取数据</h3> <p>以下实例演示了如何读取数据库中已经存在的数据:</p> <pre class="has"><code class="language-javascript">var db = openDatabase('mydb','1.0','Test DB',2*1024*1024); db.transaction(function(tx){ tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS (id unique,log)'); tx.executeSql('IMSERT INTO LOGS (id,log) VALUES(1,"Maggie")'); tx.executeSql('INSERT INTO LOGS (id,log) VALUES(2,"Going on') }); db.transaction(function(tx){ tx.executeSql('SELECT * FROM LOGS',[],function(tx,results){ var len = results.rows.length,i; msg = "<p>查询记录条数:" + len + "</p>"; document.querySelector('#status').innerHTML+=msg; for(i=0;i<len;i++){ alert(results.rows.item(i).log); } },null); });</code></pre> <p> <strong>完整实例</strong></p> <pre class="has"><code class="language-html"><!DOCTYPE HTML> <html> <head> <meta charset="UTF-8"> <title>菜鸟教程(runoob.com)</title>  <script type="text/javascript"> var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024); var msg; db.transaction(function (tx) { tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS (id unique, log)'); tx.executeSql('INSERT INTO LOGS (id, log) VALUES (1, "菜鸟教程")'); tx.executeSql('INSERT INTO LOGS (id, log) VALUES (2, "www.runoob.com")'); msg = '<p>数据表已创建,且插入了两条数据。</p>'; document.querySelector('#status').innerHTML = msg; }); db.transaction(function (tx) { tx.executeSql('SELECT * FROM LOGS', [], function (tx, results) { var len = results.rows.length, i; msg = "<p>查询记录条数: " + len + "</p>"; document.querySelector('#status').innerHTML += msg; for (i = 0; i < len; i++){ msg = "<p><b>" + results.rows.item(i).log + "</b></p>"; document.querySelector('#status').innerHTML += msg; } }, null); }); </script> </head> <body> <div id="status" name="status">状态信息</div> </body> </html></code></pre> <p>以上实例运行结果如下图所示:</p> <p><a href="http://img.e-com-net.com/image/info8/0131996d35694eadb162d938ab17445c.jpg" target="_blank"><img alt="HTML5学习笔记_第3张图片" class="has" height="227" src="http://img.e-com-net.com/image/info8/0131996d35694eadb162d938ab17445c.jpg" width="391" style="border:1px solid black;"></a></p> <hr> <h3>删除记录</h3> <p>删除记录使用的格式如下:</p> <pre class="has"><code class="language-javascript">db.transaction(function(tx){ tx.executeSql('DELETE FROM LOGS WHERE id =1'); });</code></pre> <p>删除指定的数据id也可以是动态的:</p> <pre class="has"><code class="language-javascript">db.transaction(function(tx){ tx.executeSql('DELETE FROM LOGS WHERE id =?',[id]); });</code></pre> <hr> <h3>更新记录</h3> <p>更新记录使用的格式如下:</p> <pre class="has"><code class="language-javascript">db.transaction(function(tx){ tx.executeSql('UPDATE LOGS SET log=\'www..w3cschool.cc\' WHERE id =2'); });</code></pre> <p> 更新指定的数据id也可以是动态的:</p> <pre class="has"><code class="language-javascript">db.transaction(function(tx){ tx.executeSql('UPDATE LOGS SET log=\'www..w3cschool.cc\' WHERE id =?',[id]); });</code></pre> <hr> <h3>完整实例</h3> <pre class="has"><code class="language-javascript">var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024); var msg; db.transaction(function (tx) { tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS (id unique, log)'); tx.executeSql('INSERT INTO LOGS (id, log) VALUES (1, "菜鸟教程")'); tx.executeSql('INSERT INTO LOGS (id, log) VALUES (2, "www.runoob.com")'); msg = '<p>数据表已创建,且插入了两条数据。</p>'; document.querySelector('#status').innerHTML = msg; }); db.transaction(function (tx) { tx.executeSql('DELETE FROM LOGS WHERE id=1'); msg = '<p>删除 id 为 1 的记录。</p>'; document.querySelector('#status').innerHTML = msg; }); db.transaction(function (tx) { tx.executeSql('UPDATE LOGS SET log=\'www.w3cschool.cc\' WHERE id=2'); msg = '<p>更新 id 为 2 的记录。</p>'; document.querySelector('#status').innerHTML = msg; }); db.transaction(function (tx) { tx.executeSql('SELECT * FROM LOGS', [], function (tx, results) { var len = results.rows.length, i; msg = "<p>查询记录条数: " + len + "</p>"; document.querySelector('#status').innerHTML += msg; for (i = 0; i < len; i++){ msg = "<p><b>" + results.rows.item(i).log + "</b></p>"; document.querySelector('#status').innerHTML += msg; } }, null); });</code></pre> <h1> </h1> <h1>HTML5 应用程序缓存</h1> <hr> <p>使用 HTML5,通过创建 cache manifest 文件,可以轻松地创建 web 应用的离线版本。</p> <hr> <h2>什么是应用程序缓存(Application Cache)?</h2> <blockquote> <p>HTML5 引入了应用程序缓存,这意味着 web 应用可进行缓存,并可在没有因特网连接时进行访问。</p> </blockquote> <p>应用程序缓存为应用带来三个优势:</p> <ol> <li>离线浏览 - 用户可在应用离线时使用它们</li> <li>速度 - 已缓存资源加载得更快</li> <li>减少服务器负载 - 浏览器将只从服务器下载更新过或更改过的资源。</li> </ol> <hr> <h2>浏览器支持</h2> <p><img alt="Internet Explorer" class="has" height="30" src="http://img.e-com-net.com/image/info8/cef1efe2e70641d0bc3d17dfca05ccd1.gif" width="31"><img alt="Firefox" class="has" height="30" src="http://img.e-com-net.com/image/info8/ee8c1397a3b1429ea195add5f09c9d34.gif" width="31"><img alt="Opera" class="has" height="30" src="http://img.e-com-net.com/image/info8/80e68dd1bc7840aa89c514cd4d2c0915.gif" width="28"><img alt="Google Chrome" class="has" height="30" src="http://img.e-com-net.com/image/info8/027d181959f046219097b1094b009da4.gif" width="31"><img alt="Safari" class="has" height="30" src="http://img.e-com-net.com/image/info8/11a34c1d402f4df6859b851f210eb839.jpg" width="28"></p> <p>Internet Explorer 10, Firefox, Chrome, Safari 和 Opera 支持应用程序缓存.</p> <hr> <h2>HTML5 Cache Manifest 实例</h2> <p>下面的例子展示了带有 cache manifest 的 HTML 文档(供离线浏览):</p> <h2>实例</h2> <pre class="has"><code class="language-html"><!DOCTYPE html> <html manifest="demo_html.appcache"> <head> <meta charset="UTF-8"> <title>菜鸟教程(runoob.com)</title> </head> <body> <script src="demo_time.js"> </script> <p id="timePara"><button οnclick="getDateTime()">获取日期和时间</button></p> <p><img src="logo.png" width="336" height="69"></p> <p>尝试打开 <a href="tryhtml5_html_manifest.htm" target="_blank">这个页面</a>, 在离线的状态下重新载入这个页面,页面也可以访问。</p> </body> </html></code></pre> <p> </p> <hr> <h2>Cache Manifest 基础</h2> <p>如需启用应用程序缓存,请在文档的<html> 标签中包含 manifest 属性:</p> <pre class="has"><code class="language-html"><!DOCTYPE HTML> <html manifest="demo.appcache"> ... </html></code></pre> <blockquote> <p>每个指定了 manifest 的页面在用户对其访问时都会被缓存。如果未指定 manifest 属性,则页面不会被缓存(除非在 manifest 文件中直接指定了该页面)。</p> </blockquote> <p>manifest 文件的建议的文件扩展名是:".appcache"。</p> <p>请注意,manifest 文件需要配置正确的 MIME-type,即 "text/cache-manifest"。必须在 web 服务器上进行配置。</p> <hr> <h2>Manifest 文件</h2> <p>manifest 文件是简单的文本文件,它告知浏览器被缓存的内容(以及不缓存的内容)。</p> <p>manifest 文件可分为三个部分:</p> <ul> <li><em>CACHE MANIFEST</em> - 在此标题下列出的文件将在首次下载后进行缓存</li> <li><em>NETWORK</em> - 在此标题下列出的文件需要与服务器的连接,且不会被缓存</li> <li><em>FALLBACK</em> - 在此标题下列出的文件规定当页面无法访问时的回退页面(比如 404 页面)</li> </ul> <h3>CACHE MANIFEST</h3> <p>第一行,CACHE MANIFEST,是必需的:</p> <blockquote> <p>CACHE MANIFEST<br> /theme.css<br> /logo.gif<br> /main.js</p> </blockquote> <p>上面的 manifest 文件列出了三个资源:一个 CSS 文件,一个 GIF 图像,以及一个 JavaScript 文件。当 manifest 文件加载后,浏览器会从网站的根目录下载这三个文件。然后,无论用户何时与因特网断开连接,这些资源依然是可用的。</p> <h3>NETWORK</h3> <p>下面的 NETWORK 小节规定文件 "login.php" 永远不会被缓存,且离线时是不可用的:</p> <blockquote> <p>NETWORK:<br> login.php</p> </blockquote> <p>可以使用星号来指示所有其他资源/文件都需要因特网连接:</p> <p>NETWORK:<br> *</p> <h3>FALLBACK</h3> <p>下面的 FALLBACK 小节规定如果无法建立因特网连接,则用 "offline.html" 替代 /html5/ 目录中的所有文件:</p> <blockquote> <p>FALLBACK:<br> /html5/ /offline.html</p> </blockquote> <p><strong>注意:</strong> 第一个 URI 是资源,第二个是替补。</p> <hr> <h2>更新缓存</h2> <p>一旦应用被缓存,它就会保持缓存直到发生下列情况:</p> <ul> <li>用户清空浏览器缓存</li> <li>manifest 文件被修改(参阅下面的提示)</li> <li>由程序来更新应用缓存</li> </ul> <h2>实例 - 完整的 Manifest 文件</h2> <blockquote> <p>CACHE MANIFEST<br> # 2012-02-21 v1.0.0<br> /theme.css<br> /logo.gif<br> /main.js<br><br> NETWORK:<br> login.php<br><br> FALLBACK:<br> /html/ /offline.html</p> </blockquote> <p><strong>提示:</strong>以 "#" 开头的是注释行,但也可满足其他用途。应用的缓存会在其 manifest 文件更改时被更新。如果您编辑了一幅图片,或者修改了一个 JavaScript 函数,这些改变都不会被重新缓存。更新注释行中的日期和版本号是一种使浏览器重新缓存文件的办法。</p> <hr> <h2>关于应用程序缓存的说明</h2> <p>请留心缓存的内容。</p> <p>一旦文件被缓存,则浏览器会继续展示已缓存的版本,即使您修改了服务器上的文件。为了确保浏览器更新缓存,您需要更新 manifest 文件。</p> <p><strong>注意:</strong> 浏览器对缓存数据的容量限制可能不太一样(某些浏览器设置的限制是每个站点 5MB)。</p> <p> </p> <h1>HTML5 Web Workers</h1> <hr> <p>web worker 是运行在后台的 JavaScript,不会影响页面的性能。</p> <hr> <h2>什么是 Web Worker?</h2> <p>当在 HTML 页面中执行脚本时,页面的状态是不可响应的,直到脚本已完成。</p> <blockquote> <p>web worker 是运行在后台的 JavaScript,独立于其他脚本,不会影响页面的性能。您可以继续做任何愿意做的事情:点击、选取内容等等,而此时 web worker 在后台运行。</p> </blockquote> <hr> <h2>浏览器支持</h2> <p><img alt="Internet Explorer" class="has" height="30" src="http://img.e-com-net.com/image/info8/cef1efe2e70641d0bc3d17dfca05ccd1.gif" width="31"><img alt="Firefox" class="has" height="30" src="http://img.e-com-net.com/image/info8/ee8c1397a3b1429ea195add5f09c9d34.gif" width="31"><img alt="Opera" class="has" height="30" src="http://img.e-com-net.com/image/info8/80e68dd1bc7840aa89c514cd4d2c0915.gif" width="28"><img alt="Google Chrome" class="has" height="30" src="http://img.e-com-net.com/image/info8/027d181959f046219097b1094b009da4.gif" width="31"><img alt="Safari" class="has" height="30" src="http://img.e-com-net.com/image/info8/11a34c1d402f4df6859b851f210eb839.jpg" width="28"></p> <p>Internet Explorer 10, Firefox, Chrome, Safari 和 Opera 都支持Web workers.</p> <hr> <h2>HTML5 Web Workers 实例</h2> <p>下面的例子创建了一个简单的 web worker,在后台计数:</p> <h2>实例</h2> <pre class="has"><code class="language-html"><!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>菜鸟教程(runoob.com)</title> </head> <body> <p>计数: <output id="result"></output></p> <button οnclick="startWorker()">开始工作</button> <button οnclick="stopWorker()">停止工作</button> <p><strong>注意:</strong> Internet Explorer 9 及更早 IE 版本浏览器不支持 Web Workers.</p> <script> var w; function startWorker() { if(typeof(Worker) !== "undefined") { if(typeof(w) == "undefined") { w = new Worker("demo_workers.js"); } w.onmessage = function(event) { document.getElementById("result").innerHTML = event.data; }; } else { document.getElementById("result").innerHTML = "抱歉,你的浏览器不支持 Web Workers..."; } } function stopWorker() { w.terminate(); w = undefined; } </script> </body> </html></code></pre> <p>demo_workers.js 文件代码:</p> <pre class="has"><code class="language-javascript">var i=0; function timedCount() {     i=i+1;     postMessage(i);     setTimeout("timedCount()",500); } timedCount(); </code></pre> <hr> <h2>检测浏览器是否支持 Web Worker</h2> <p>在创建 web worker 之前,请检测用户的浏览器是否支持它:</p> <pre class="has"><code class="language-javascript">if(typeof(Worker)!=="undefined") {     // 是的! Web worker 支持!     // 一些代码..... } else {     //抱歉! Web Worker 不支持  } </code></pre> <hr> <h2>创建 web worker 文件</h2> <p>现在,让我们在一个外部 JavaScript 中创建我们的 Web worker。</p> <p>在这里,我们创建了计数脚本。该脚本存储于 "demo_workers.js" 文件中:</p> <pre class="has"><code class="language-javascript">var i=0; function timedCount() {     i=i+1;     postMessage(i);     setTimeout("timedCount()",500); } timedCount();</code></pre> <p>以上代码中重要的部分是 <strong>postMessage() 方法</strong> - 它用于向 HTML 页面传回一段消息。</p> <p><strong>注意:</strong> Web worker 通常不用于如此简单的脚本,而是用于更耗费 CPU 资源的任务。</p> <hr> <h2>创建 Web Worker 对象</h2> <p>我们已经有了 web worker 文件,现在我们需要从 HTML 页面调用它。</p> <p>下面的代码检测是否存在 worker,如果不存在,- 它会创建一个新的 web worker 对象,然后运行 "demo_workers.js" 中的代码:</p> <pre class="has"><code class="language-javascript">if(typeof(w)=="undefined") {     w=new Worker("demo_workers.js"); }</code></pre> <p>然后我们就可以从 web worker 发生和接收消息了。</p> <p>向 web worker 添加一个 <strong>"onmessage" 事件</strong>监听器:</p> <pre class="has"><code class="language-javascript">w.onmessage=function(event){     document.getElementById("result").innerHTML=event.data; }; </code></pre> <hr> <h2>终止 Web Worker</h2> <p>当我们创建 Web worker 对象后,它会继续监听消息(即使在外部脚本完成之后)直到其被终止为止。</p> <p>如需终止 Web worker,并释放浏览器/计算机资源,请使用 terminate() 方法:</p> <pre class="has"><code class="language-javascript">w.terminate();</code></pre> <hr> <h2>完整的 Web Worker 实例代码</h2> <p>我们已经看到了 .js 文件中的 Worker 代码。下面是 HTML 页面的代码:</p> <h2>实例</h2> <pre class="has"><code class="language-html"><!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>菜鸟教程(runoob.com)</title> </head> <body> <p>计数: <output id="result"></output></p> <button οnclick="startWorker()">开始工作</button> <button οnclick="stopWorker()">停止工作</button> <p><strong>注意:</strong> Internet Explorer 9 及更早 IE 版本浏览器不支持 Web Workers.</p> <script> var w; function startWorker() { if(typeof(Worker) !== "undefined") { if(typeof(w) == "undefined") { w = new Worker("demo_workers.js"); } w.onmessage = function(event) { document.getElementById("result").innerHTML = event.data; }; } else { document.getElementById("result").innerHTML = "抱歉,你的浏览器不支持 Web Workers..."; } } function stopWorker() { w.terminate(); w = undefined; } </script> </body> </html></code></pre> <p> </p> <hr> <h2>Web Workers 和 DOM</h2> <p>由于 Web worker 位于外部文件中,它们无法访问下列 JavaScript 对象:</p> <ul> <li>window 对象</li> <li>document 对象</li> <li>parent 对象</li> </ul> <p> </p> <h1>服务器发送事件(Server-Sent Events)</h1> <hr> <p>HTML5 服务器发送事件(server-sent event)允许网页获得来自服务器的更新。</p> <hr> <h3>Server-Sent 事件-单向消息传递</h3> <p>Server-Sent 事件指的是网页自动获取来自服务器的更新。</p> <blockquote> <p>以前也可能做到这一点,前提是网页不得不询问是否有可用的更新。通过服务器发送事件,更新能够自动到达。</p> </blockquote> <p>例子:Facebook/Twitter 更新、股价更新、新的博文、赛事结果等。</p> <hr> <h3>检测 Server-Sent 事件支持</h3> <p>以下实例,我们编写了一段额外的代码来检测服务器发送事件的浏览器支持情况:</p> <pre class="has"><code class="language-javascript">if(typeof(EventSource)!=="undefined"){ // 浏览器支持 Server-sent // 一些代码... } else{ // 浏览器不支持Server-sent }</code></pre> <hr> <h3>服务器端代码实例</h3> <p>为了让上面的例子可以运行,您还需要能够发送数据更新的服务器(比如 PHP 和 ASP)。</p> <p>服务器端事件流的语法是非常简单的。<strong>把 "Content-Type" 报头设置为 "text/event-stream"</strong>。现在,您可以开始发送事件流了。</p> <pre class="has"><code class="language-php"><?php header('Content-Type: text/event-stream'); header('Cache-Control: no-cache'); $time = date('r'); echo "data: The server time is: {$time}\n\n"; flush(); ?></code></pre> <p>ASP 代码 (VB) (demo_sse.asp):</p> <pre class="has"><code><% Response.ContentType="text/event-stream" Response.Expires=-1 Response.Write("data: " & now()) Response.Flush() %></code></pre> <p>代码解释:</p> <ul> <li>把报头 "Content-Type" 设置为 "text/event-stream"</li> <li>规定不对页面进行缓存</li> <li>输出发送日期(始终以 "data: " 开头)</li> <li>向网页刷新输出数据</li> </ul> <hr> <h3>EventSource 对象</h3> <p>在上面的例子中,我们使用 onmessage 事件来获取消息。不过还可以使用其他事件:</p> <table> <tbody> <tr> <th>事件</th> <th>描述</th> </tr> <tr> <td>onopen</td> <td>当通往服务器的连接被打开</td> </tr> <tr> <td>onmessage</td> <td>当接收到消息</td> </tr> <tr> <td>onerror</td> <td>当发生错误</td> </tr> </tbody> </table> <p> </p> <h1>Web Socket</h1> <p>WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。</p> <p>WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。</p> <p>在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。</p> <p>现在,很多网站为了实现推送技术,所用的技术都是 Ajax 轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。</p> <p>HTML5 定义的 WebSocket 协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。</p> <p><a href="http://img.e-com-net.com/image/info8/402f7a5a07214d9eb4c9ea69573e01a0.png" target="_blank"><img alt="HTML5学习笔记_第4张图片" class="has" src="http://img.e-com-net.com/image/info8/402f7a5a07214d9eb4c9ea69573e01a0.png" width="834" height="444" style="border:1px solid black;"></a></p> <p>浏览器通过 JavaScript 向服务器发出建立 WebSocket 连接的请求,连接建立以后,客户端和服务器端就可以通过 TCP 连接直接交换数据。</p> <p>当你获取 Web Socket 连接后,你可以通过 <strong>send()</strong> 方法来向服务器发送数据,并通过 <strong>onmessage</strong> 事件来接收服务器返回的数据。</p> <p>以下 API 用于创建 WebSocket 对象。</p> <pre class="has"><code class="language-javascript">var Socket = new WebSocket(url,[protocol]);</code></pre> <p> 以上代码中的第一个参数 url, 指定连接的 URL。第二个参数 protocol 是可选的,指定了可接受的子协议。</p> <hr> <h3>WebSocket 属性</h3> <p>以下是 WebSocket 对象的属性。假定我们使用了以上代码创建了 Socket 对象:</p> <table> <tbody> <tr> <th>属性</th> <th>描述</th> </tr> <tr> <td>Socket.readyState</td> <td> <p>只读属性 <strong>readyState</strong> 表示连接状态,可以是以下值:</p> <ul> <li> <p>0 - 表示连接尚未建立。</p> </li> <li> <p>1 - 表示连接已建立,可以进行通信。</p> </li> <li> <p>2 - 表示连接正在进行关闭。</p> </li> <li> <p>3 - 表示连接已经关闭或者连接不能打开。</p> </li> </ul></td> </tr> <tr> <td>Socket.bufferedAmount</td> <td> <p>只读属性 <strong>bufferedAmount</strong> 已被 send() 放入正在队列中等待传输,但是还没有发出的 UTF-8 文本字节数。</p> </td> </tr> </tbody> </table> <hr> <h3>WebSocket 事件</h3> <p>以下是 WebSocket 对象的相关事件。假定我们使用了以上代码创建了 Socket 对象:</p> <table> <tbody> <tr> <th>事件</th> <th>事件处理程序</th> <th>描述</th> </tr> <tr> <td>open</td> <td>Socket.onopen</td> <td>连接建立时触发</td> </tr> <tr> <td>message</td> <td>Socket.onmessage</td> <td>客户端接收服务端数据时触发</td> </tr> <tr> <td>error</td> <td>Socket.onerror</td> <td>通信发生错误时触发</td> </tr> <tr> <td>close</td> <td>Socket.onclose</td> <td>连接关闭时触发</td> </tr> </tbody> </table> <hr> <h3>WebSocket 方法</h3> <p>以下是 WebSocket 对象的相关方法。假定我们使用了以上代码创建了 Socket 对象:</p> <table> <tbody> <tr> <th>方法</th> <th>描述</th> </tr> <tr> <td>Socket.send()</td> <td> <p>使用连接发送数据</p> </td> </tr> <tr> <td>Socket.close()</td> <td> <p>关闭连接</p> </td> </tr> </tbody> </table> <hr> <h3>WebSocket 实例</h3> <p>WebSocket 协议本质上是一个基于 TCP 的协议。</p> <p>为了建立一个 WebSocket 连接,客户端浏览器首先要向服务器发起一个 HTTP 请求,这个请求和通常的 HTTP 请求不同,包含了一些附加头信息,其中<strong>附加头信息"Upgrade: WebSocket"</strong>表明这是一个申请协议升级的 HTTP 请求,服务器端解析这些附加的头信息然后产生应答信息返回给客户端,客户端和服务器端的 WebSocket 连接就建立起来了,双方就可以通过这个连接通道自由的传递信息,并且这个连接会持续存在直到客户端或者服务器端的某一方主动的关闭连接。</p> <h3>客户端的 HTML 和 JavaScript</h3> <p>目前大部分浏览器支持 WebSocket() 接口,你可以在以下浏览器中尝试实例: Chrome, Mozilla, Opera 和 Safari。</p> <p>runoob_websocket.html 文件内容:</p> <pre class="has"><code class="language-html"><!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>菜鸟教程(runoob.com)</title>      <script type="text/javascript"> function WebSocketTest() { if ("WebSocket" in window) { alert("您的浏览器支持 WebSocket!"); // 打开一个 web socket var ws = new WebSocket("ws://localhost:9998/echo");                  ws.onopen = function() { // Web Socket 已连接上,使用 send() 方法发送数据 ws.send("发送数据"); alert("数据发送中..."); };                  ws.onmessage = function (evt) { var received_msg = evt.data; alert("数据已接收..."); };                  ws.onclose = function() { // 关闭 websocket alert("连接已关闭..."); }; } else { // 浏览器不支持 WebSocket alert("您的浏览器不支持 WebSocket!"); } } </script>          </head> <body> <div id="sse"> <a href="javascript:WebSocketTest()">运行 WebSocket</a> </div> </body> </html></code></pre> <hr> <h3>安装 pywebsocket</h3> <p>在执行以上程序前,我们需要创建一个支持 WebSocket 的服务。从 pywebsocket 下载 mod_pywebsocket ,或者使用 git 命令下载:</p> <blockquote> <pre>git clone https://github.com/google/pywebsocket.git</pre> </blockquote> <p>mod_pywebsocket 需要 python 环境支持</p> <p>mod_pywebsocket 是一个 Apache HTTP 的 Web Socket扩展,安装步骤如下:</p> <ul> <li> <p>解压下载的文件。</p> </li> <li> <p>进入 <strong>pywebsocket</strong> 目录。</p> </li> <li> <p>执行命令:</p> <blockquote> <pre>$ python setup.py build $ sudo python setup.py install</pre> </blockquote> </li> <li> <p>查看文档说明:</p> <blockquote> <pre>$ pydoc mod_pywebsocket</pre> </blockquote> </li> </ul> <h3>开启服务</h3> <p>在 <strong>pywebsocket/mod_pywebsocket</strong> 目录下执行以下命令:</p> <blockquote> <pre>$ sudo python standalone.py -p 9998 -w ../example/</pre> </blockquote> <p>以上命令会开启一个端口号为 9998 的服务,使用 -w 来设置处理程序 echo_wsh.py 所在的目录。</p> <p>现在我们可以在 Chrome 浏览器打开前面创建的 runoob_websocket.html 文件。如果你的浏览器支持 WebSocket(), 点击"运行 WebSocket",你就可以看到整个流程各个步骤弹出的窗口,流程 Gif 演示:</p> <p><a href="http://img.e-com-net.com/image/info8/1504260da3fa4b3aaeee7e8ba6e3e618.gif" target="_blank"><img alt="HTML5学习笔记_第5张图片" class="has" src="http://img.e-com-net.com/image/info8/1504260da3fa4b3aaeee7e8ba6e3e618.gif" width="905" height="520" style="border:1px solid black;"></a></p> <p>在我们停止服务后,会弹出 "连接已关闭..."。</p> <hr> <p>Websocket 使用 ws 或 wss 的统一资源标志符,类似于 HTTPS,其中 wss 表示在 TLS 之上的 Websocket。如:</p> <blockquote> <pre>ws://example.com/wsapi wss://secure.example.com/</pre> </blockquote> <p>Websocket 使用和 HTTP 相同的 TCP 端口,可以绕过大多数防火墙的限制。默认情况下,Websocket 协议使用 80 端口;运行在 TLS 之上时,默认使用 443 端口。</p> <p><strong>一个典型的Websocket握手请求如下:</strong></p> <p>客户端请求</p> <blockquote> <pre>GET / HTTP/1.1 Upgrade: websocket Connection: Upgrade Host: example.com Origin: http://example.com Sec-WebSocket-Key: sN9cRrP/n9NdMgdcy2VJFQ== Sec-WebSocket-Version: 13</pre> </blockquote> <p>服务器回应</p> <blockquote> <pre>HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: fFBooB7FAkLlXgRSz0BT3v4hq5s= Sec-WebSocket-Location: ws://example.com/</pre> </blockquote> <ul> <li>Connection 必须设置 Upgrade,表示客户端希望连接升级。</li> <li>Upgrade 字段必须设置 Websocket,表示希望升级到 Websocket 协议。</li> <li>Sec-WebSocket-Key 是随机的字符串,服务器端会用这些数据来构造出一个 SHA-1 的信息摘要。把 “Sec-WebSocket-Key” 加上一个特殊字符串 “258EAFA5-E914-47DA-95CA-C5AB0DC85B11”,然后计算 SHA-1 摘要,之后进行 BASE-64 编码,将结果做为 “Sec-WebSocket-Accept” 头的值,返回给客户端。如此操作,可以尽量避免普通 HTTP 请求被误认为 Websocket 协议。</li> <li>Sec-WebSocket-Version 表示支持的 Websocket 版本。RFC6455 要求使用的版本是 13,之前草案的版本均应当弃用。</li> <li>Origin 字段是可选的,通常用来表示在浏览器中发起此 Websocket 连接所在的页面,类似于 Referer。但是,与 Referer 不同的是,Origin 只包含了协议和主机名称。</li> <li>其他一些定义在 HTTP 协议中的字段,如 Cookie 等,也可以在 Websocket 中使用。</li> </ul> <p>在服务器方面,网上都有不同对websocket支持的服务器:</p> <ul> <li>php - http://code.google.com/p/phpwebsocket/</li> <li>jetty - http://jetty.codehaus.org/jetty/(版本7开始支持websocket)</li> <li>netty - http://www.jboss.org/netty</li> <li>ruby - http://github.com/gimite/web-socket-ruby</li> <li>Kaazing - https://web.archive.org/web/20100923224709/http://www.kaazing.org/confluence/display/KAAZING/Home</li> <li>Tomcat - http://tomcat.apache.org/(7.0.27支持websocket,建议用tomcat8,7.0.27中的接口已经过时)</li> <li>WebLogic - http://www.oracle.com/us/products/middleware/cloud-app-foundation/weblogic/overview/index.html(12.1.2開始支持)</li> <li>node.js - https://github.com/Worlize/WebSocket-Node</li> <li>node.js - http://socket.io</li> <li>nginx - http://nginx.com/</li> <li>mojolicious - http://mojolicio.us/</li> <li>python - https://github.com/abourget/gevent-socketio</li> <li>Django - https://github.com/stephenmcd/django-socketio</li> <li>erlang - https://github.com/ninenines/cowboy.git</li> </ul> <p> </p> <h1>HTML(5) 代码规范</h1> <h2>HTML 代码约定</h2> <p>很多 Web 开发人员对 HTML 的代码规范知之甚少。</p> <p>在2000年至2010年,许多Web开发人员从 HTML 转换到 XHTML。</p> <p>使用 XHTML 开发人员逐渐养成了比较好的 HTML 编写规范。</p> <p>而针对于 HTML5 ,我们应该形成比较好的代码规范,以下提供了几种规范的建议。</p> <hr> <h2>使用正确的文档类型</h2> <p>文档类型声明位于HTML文档的第一行:</p> <pre class="has"><code class="language-html"><!DOCTYPE html></code></pre> <p>如果你想跟其他标签一样使用小写,可以使用以下代码:</p> <pre class="has"><code class="language-html"><!doctype html></code></pre> <hr> <h2>使用小写元素名</h2> <p>HTML5 元素名可以使用大写和小写字母。</p> <p>推荐使用小写字母:</p> <ul> <li>混合了大小写的风格是非常糟糕的。</li> <li>开发人员通常使用小写 (类似 XHTML)。</li> <li>小写风格看起来更加清爽。</li> <li>小写字母容易编写。</li> </ul> <h3>不推荐:</h3> <p><SECTION> <br>   <p>这是一个段落。</p><br> </SECTION></p> <h3>非常糟糕:</h3> <p><Section> <br>   <p>这是一个段落。</p><br> </SECTION></p> <h3>推荐:</h3> <pre class="has"><code class="language-html"><section>    <p>这是一个段落。</p> </section></code></pre> <p> </p> <hr> <h2>关闭所有 HTML 元素</h2> <p>在 HTML5 中, 你不一定要关闭所有元素 (例如 <p> 元素),但我们建议每个元素都要添加关闭标签。</p> <h3>不推荐:</h3> <p><section><br>   <p>这是一个段落。<br>   <p>这是一个段落。<br> </section></p> <h3>推荐:</h3> <pre class="has"><code class="language-html"><section>   <p>这是一个段落。</p>   <p>这是一个段落。</p> </section></code></pre> <hr> <h2>关闭空的 HTML 元素</h2> <p>在 HTML5 中, 空的 HTML 元素也不一定要关闭:</p> <p>我们可以这么写:</p> <p><meta charset="utf-8"></p> <p>也可以这么写:</p> <pre class="has"><code class="language-html"><meta charset="utf-8" /></code></pre> <p>在 XHTML 和 XML 中斜线 (/) 是必须的。</p> <p>如果你期望 XML 软件使用你的页面,使用这种风格是非常好的。</p> <hr> <h2>使用小写属性名</h2> <p>HTML5 属性名允许使用大写和小写字母。</p> <p>我们推荐使用小写字母属性名:</p> <ul> <li>同时使用大小写是非常不好的习惯。</li> <li>开发人员通常使用小写 (类似 XHTML)。</li> <li>小写风格看起来更加清爽。</li> <li>小写字母容易编写。</li> </ul> <p>不推荐:</p> <p><div CLASS="menu"></p> <p>推荐:</p> <pre class="has"><code class="language-html"><div class="menu"></code></pre> <hr> <h2>属性值</h2> <p>HTML5 属性值可以不用引号。</p> <p>属性值我们推荐使用引号:</p> <ul> <li>如果属性值含有空格需要使用引号。</li> <li>混合风格不推荐的,建议统一风格。</li> <li>属性值使用引号易于阅读。</li> </ul> <p>以下实例属性值包含空格,没有使用引号,所以不能起作用:</p> <p><table class=table striped></p> <p>以下使用了双引号,是正确的:</p> <pre class="has"><code class="language-html"><table class="table striped"></code></pre> <hr> <h2>图片属性</h2> <p>图片通常使用 <strong>alt</strong> 属性。 在图片不能显示时,它能替代图片显示。</p> <pre class="has"><code class="language-html"><img src="html5.gif" alt="HTML5" style="width:128px;height:128px"></code></pre> <p>定义好图片的尺寸,在加载时可以预留指定空间,减少闪烁。</p> <p><img src="html5.gif"<strong> alt="HTML5"</strong> <strong>style=</strong><strong>"width:128px;height:128px</strong>"></p> <hr> <h2>空格和等号</h2> <p>等号前后可以使用空格。</p> <p><link rel = "stylesheet" href = "styles.css"></p> <p>但我们推荐<strong>少用空格</strong>:</p> <pre class="has"><code class="language-html"><link rel="stylesheet" href="styles.css"></code></pre> <hr> <h2>避免一行代码过长</h2> <p>使用 HTML 编辑器,左右滚动代码是不方便的。</p> <p>每行代码尽量少于 80 个字符。</p> <hr> <h2>空行和缩进</h2> <p>不要无缘无故添加空行。</p> <p>为每个逻辑功能块添加空行,这样更易于阅读。</p> <p>缩进使用两个空格,不建议使用 TAB。</p> <p>比较短的代码间不要使用不必要的空行和缩进。</p> <h3>不必要的空行和缩进:</h3> <p><body><br><br>   <h1>菜鸟教程</h1><br><br>   <h2>HTML</h2><br><br>   <p><br>     菜鸟教程,学的不仅是技术,更是梦想。<br>     菜鸟教程,学的不仅是技术,更是梦想。<br>    菜鸟教程,学的不仅是技术,更是梦想,<br>     菜鸟教程,学的不仅是技术,更是梦想。<br>   </p><br><br> </body></p> <h3>推荐:</h3> <pre class="has"><code class="language-html"><body> <h1>菜鸟教程</h1> <h2></h2> <p>菜鸟教程,学的不仅是技术,更是梦想。 菜鸟教程,学的不仅是技术,更是梦想。 菜鸟教程,学的不仅是技术,更是梦想。 菜鸟教程,学的不仅是技术,更是梦想。</p> </body></code></pre> <h3>表格实例:</h3> <pre class="has"><code class="language-html"><table>   <tr>     <th>Name</th>     <th>Description</th>   </tr>   <tr>     <td>A</td>     <td>Description of A</td>   </tr>   <tr>     <td>B</td>     <td>Description of B</td>   </tr> </table></code></pre> <h3>列表实例:</h3> <pre class="has"><code class="language-html"><ol>   <li>London</li>   <li>Paris</li>   <li>Tokyo</li> </ol> </code></pre> <hr> <h2>省略 <html> 和 <body>?</h2> <p>在标准 HTML5 中, <html> 和 <body> 标签是可以省略的。</p> <p><strong>但是,不推荐省略 <html> 和 <body> 标签。</strong></p> <p><html> 元素是文档的根元素,用于描述页面的语言:</p> <pre class="has"><code class="language-html"><!DOCTYPE html> <html lang="zh"></code></pre> <p>声明语言是为了方便屏幕阅读器及搜索引擎。</p> <p>省略 <html> 或 <body> 在 DOM 和 XML 软件中会崩溃。</p> <p>省略 <body> 在旧版浏览器 (IE9)会发生错误。</p> <hr> <h2>省略 <head>?</h2> <p>在标准 HTML5 中, <head>标签是可以省略的。</p> <p>默认情况下,浏览器会将 <body> 之前的内容添加到一个默认的 <head> 元素上。</p> <p><strong>现在省略 head 标签还不推荐使用。</strong></p> <hr> <p> </p> <h2>元数据</h2> <p>HTML5 中 <title> 元素是必须的,标题名描述了页面的主题:</p> <p><title>菜鸟教程</title></p> <p>标题和语言可以让搜索引擎很快了解你页面的主题:</p> <pre class="has"><code class="language-html"><!DOCTYPE html> <html lang="zh"> <head>   <meta charset="UTF-8">   <title>菜鸟教程</title> </head></code></pre> <hr> <h2>HTML 注释</h2> <p>注释可以写在 <!-- 和 --> 中:</p> <pre class="has"><code class="language-html"><!-- 这是注释 --></code></pre> <p>比较长的评论可以在 <!-- 和 --> 中分行写:</p> <pre class="has"><code class="language-html"><!--    这是一个较长评论。 这是 一个较长评论。这是一个较长评论。   这是 一个较长评论 这是一个较长评论。 这是 一个较长评论。 --> </code></pre> <p>长评论第一个字符缩进两个空格,更易于阅读。</p> <hr> <h2>样式表</h2> <p>样式表使用简洁的语法格式 ( type 属性不是必须的):</p> <p><link rel="stylesheet" href="styles.css"></p> <p>短的规则可以写成一行:</p> <p>p.into {font-family: Verdana; font-size: 16em;}</p> <p>长的规则可以写成多行:</p> <p>body {<br>   background-color: lightgrey;<br>   font-family: "Arial Black", Helvetica, sans-serif;<br>   font-size: 16em;<br>   color: black;<br> }</p> <ul> <li>将左花括号与选择器放在同一行。</li> <li>左花括号与选择器间添加一个空格。</li> <li>使用两个空格来缩进。</li> <li>冒号与属性值之间添加一个空格。</li> <li>逗号和符号之后使用一个空格。</li> <li>每个属性与值结尾都要使用分号。</li> <li>只有属性值包含空格时才使用引号。</li> <li>右花括号放在新的一行。</li> <li>每行最多 80 个字符。</li> </ul> <table> <tbody> <tr> <th><img alt="Note" class="has" src="http://img.e-com-net.com/image/info8/2fa4a2de8daa49c38ddc6dcccae8577c.jpg" width="32" height="32"></th> <td>在逗号和冒号后添加空格是常用的一个规则。</td> </tr> </tbody> </table> <hr> <h2>在 HTML 中载入 JavaScript</h2> <p>使用简洁的语法来载入外部的脚本文件 ( type 属性不是必须的 ):</p> <p><script src="myscript.js"></p> <hr> <h2>使用 JavaScript 访问 HTML 元素</h2> <p>一个糟糕的 HTML 格式可能会导致 JavaScript 执行错误。</p> <p>以下两个 JavaScript 语句会输出不同结果:</p> <p>var obj = getElementById("Demo")<br><br> var obj = getElementById("demo")</p> <p>HTML 中 JavaScript 尽量使用相同的命名规则。</p> <p>访问 JavaScript 代码规范。</p> <hr> <h2>使用小写文件名</h2> <p>大多 Web 服务器 (Apache, Unix) 对大小写敏感: london.jpg 不能通过 London.jpg 访问。</p> <p>其他 Web 服务器 (Microsoft, IIS) 对大小写不敏感: london.jpg 可以通过 London.jpg 或 london.jpg 访问。</p> <p>你必须保持统一的风格,我们建议统一使用小写的文件名。</p> <hr> <h2>文件扩展名</h2> <p>HTML 文件后缀可以是 <strong>.html</strong> (或 <strong>.htm</strong>)。</p> <p>CSS 文件后缀是 <strong>.css</strong> 。</p> <p>JavaScript 文件后缀是 <strong>.js</strong> 。</p> <hr> <h2>.htm 和 .html 的区别</h2> <p>.htm 和 .html 的扩展名文件本质上是没有区别的。浏览器和 Web 服务器都会把它们当作 HTML 文件来处理。</p> <p>区别在于:</p> <p>.htm 应用在早期 DOS 系统,系统现在或者只能有三个字符。</p> <p>在 Unix 系统中后缀没有特别限制,一般用 .html。</p> <h2>技术上区别</h2> <p>如果一个 URL 没有指定文件名 (如 http://www.runoob.com/css/), 服务器会返回默认的文件名。通常默认文件名为 index.html, index.htm, default.html, 和 default.htm。</p> <p>如果服务器只配置了 "index.html" 作为默认文件,你必须将文件命名为 "index.html", 而不是 "index.htm"。</p> <p>但是,通常服务器可以设置多个默认文件,你可以根据需要设置默认文件名。</p> <p>不管怎样,HTML 完整的后缀是 ".html"。</p> <p> </p> <hr> <p>HTML5学习告一段落,本篇暂不更新。</p> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1188577239575404544"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(HTML)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1835509770287673344.htm" title="swagger访问路径" target="_blank">swagger访问路径</a> <span class="text-muted">igotyback</span> <a class="tag" taget="_blank" href="/search/swagger/1.htm">swagger</a> <div>Swagger2.x版本访问地址:http://{ip}:{port}/{context-path}/swagger-ui.html{ip}是你的服务器IP地址。{port}是你的应用服务端口,通常为8080。{context-path}是你的应用上下文路径,如果应用部署在根路径下,则为空。Swagger3.x版本对于Swagger3.x版本(也称为OpenAPI3)访问地址:http://{ip</div> </li> <li><a href="/article/1835508130608410624.htm" title="html 中如何使用 uniapp 的部分方法" target="_blank">html 中如何使用 uniapp 的部分方法</a> <span class="text-muted">某公司摸鱼前端</span> <a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/uni-app/1.htm">uni-app</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>示例代码:Documentconsole.log(window);效果展示:好了,现在就可以uni.使用相关的方法了</div> </li> <li><a href="/article/1835499615491813376.htm" title="四章-32-点要素的聚合" target="_blank">四章-32-点要素的聚合</a> <span class="text-muted">彩云飘过</span> <div>本文基于腾讯课堂老胡的课《跟我学Openlayers--基础实例详解》做的学习笔记,使用的openlayers5.3.xapi。源码见1032.html,对应的官网示例https://openlayers.org/en/latest/examples/cluster.htmlhttps://openlayers.org/en/latest/examples/earthquake-clusters.</div> </li> <li><a href="/article/1835498925755297792.htm" title="DIV+CSS+JavaScript技术制作网页(旅游主题网页设计与制作)云南大理" target="_blank">DIV+CSS+JavaScript技术制作网页(旅游主题网页设计与制作)云南大理</a> <span class="text-muted">STU学生网页设计</span> <a class="tag" taget="_blank" href="/search/%E7%BD%91%E9%A1%B5%E8%AE%BE%E8%AE%A1/1.htm">网页设计</a><a class="tag" taget="_blank" href="/search/%E6%9C%9F%E6%9C%AB%E7%BD%91%E9%A1%B5%E4%BD%9C%E4%B8%9A/1.htm">期末网页作业</a><a class="tag" taget="_blank" href="/search/html%E9%9D%99%E6%80%81%E7%BD%91%E9%A1%B5/1.htm">html静态网页</a><a class="tag" taget="_blank" href="/search/html5%E6%9C%9F%E6%9C%AB%E5%A4%A7%E4%BD%9C%E4%B8%9A/1.htm">html5期末大作业</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E9%A1%B5%E8%AE%BE%E8%AE%A1/1.htm">网页设计</a><a class="tag" taget="_blank" href="/search/web%E5%A4%A7%E4%BD%9C%E4%B8%9A/1.htm">web大作业</a> <div>️精彩专栏推荐作者主页:【进入主页—获取更多源码】web前端期末大作业:【HTML5网页期末作业(1000套)】程序员有趣的告白方式:【HTML七夕情人节表白网页制作(110套)】文章目录二、网站介绍三、网站效果▶️1.视频演示2.图片演示四、网站代码HTML结构代码CSS样式代码五、更多源码二、网站介绍网站布局方面:计划采用目前主流的、能兼容各大主流浏览器、显示效果稳定的浮动网页布局结构。网站程</div> </li> <li><a href="/article/1835496149843275776.htm" title="关于城市旅游的HTML网页设计——(旅游风景云南 5页)HTML+CSS+JavaScript" target="_blank">关于城市旅游的HTML网页设计——(旅游风景云南 5页)HTML+CSS+JavaScript</a> <span class="text-muted">二挡起步</span> <a class="tag" taget="_blank" href="/search/web%E5%89%8D%E7%AB%AF%E6%9C%9F%E6%9C%AB%E5%A4%A7%E4%BD%9C%E4%B8%9A/1.htm">web前端期末大作业</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/%E6%97%85%E6%B8%B8/1.htm">旅游</a><a class="tag" taget="_blank" href="/search/%E9%A3%8E%E6%99%AF/1.htm">风景</a> <div>⛵源码获取文末联系✈Web前端开发技术描述网页设计题材,DIV+CSS布局制作,HTML+CSS网页设计期末课程大作业|游景点介绍|旅游风景区|家乡介绍|等网站的设计与制作|HTML期末大学生网页设计作业,Web大学生网页HTML:结构CSS:样式在操作方面上运用了html5和css3,采用了div+css结构、表单、超链接、浮动、绝对定位、相对定位、字体样式、引用视频等基础知识JavaScrip</div> </li> <li><a href="/article/1835496148601761792.htm" title="HTML网页设计制作大作业(div+css) 云南我的家乡旅游景点 带文字滚动" target="_blank">HTML网页设计制作大作业(div+css) 云南我的家乡旅游景点 带文字滚动</a> <span class="text-muted">二挡起步</span> <a class="tag" taget="_blank" href="/search/web%E5%89%8D%E7%AB%AF%E6%9C%9F%E6%9C%AB%E5%A4%A7%E4%BD%9C%E4%B8%9A/1.htm">web前端期末大作业</a><a class="tag" taget="_blank" href="/search/web%E8%AE%BE%E8%AE%A1%E7%BD%91%E9%A1%B5%E8%A7%84%E5%88%92%E4%B8%8E%E8%AE%BE%E8%AE%A1/1.htm">web设计网页规划与设计</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/dreamweaver/1.htm">dreamweaver</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>Web前端开发技术描述网页设计题材,DIV+CSS布局制作,HTML+CSS网页设计期末课程大作业游景点介绍|旅游风景区|家乡介绍|等网站的设计与制作HTML期末大学生网页设计作业HTML:结构CSS:样式在操作方面上运用了html5和css3,采用了div+css结构、表单、超链接、浮动、绝对定位、相对定位、字体样式、引用视频等基础知识JavaScript:做与用户的交互行为文章目录前端学习路线</div> </li> <li><a href="/article/1835435506645692416.htm" title="00. 这里整理了最全的爬虫框架(Java + Python)" target="_blank">00. 这里整理了最全的爬虫框架(Java + Python)</a> <span class="text-muted">有一只柴犬</span> <a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB%E7%B3%BB%E5%88%97/1.htm">爬虫系列</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>目录1、前言2、什么是网络爬虫3、常见的爬虫框架3.1、java框架3.1.1、WebMagic3.1.2、Jsoup3.1.3、HttpClient3.1.4、Crawler4j3.1.5、HtmlUnit3.1.6、Selenium3.2、Python框架3.2.1、Scrapy3.2.2、BeautifulSoup+Requests3.2.3、Selenium3.2.4、PyQuery3.2</div> </li> <li><a href="/article/1835435141535723520.htm" title="详解:如何设计出健壮的秒杀系统?" target="_blank">详解:如何设计出健壮的秒杀系统?</a> <span class="text-muted">夜空_2cd3</span> <div>作者:Yrion博客园:cnblogs.com/wyq178/p/11261711.html前言:秒杀系统相信很多人见过,比如京东或者淘宝的秒杀,小米手机的秒杀。那么秒杀系统的后台是如何实现的呢?我们如何设计一个秒杀系统呢?对于秒杀系统应该考虑哪些问题?如何设计出健壮的秒杀系统?本期我们就来探讨一下这个问题:image目录一:****秒杀系统应该考虑的问题二:****秒杀系统的设计和技术方案三:*</div> </li> <li><a href="/article/1835403246865313792.htm" title="斟一小组鸡血视频" target="_blank">斟一小组鸡血视频</a> <span class="text-muted">和自己一起成长</span> <div>http://m.v.qq.com/play/play.html?coverid=&vid=c0518henl2a&ptag=2_6.0.0.14297_copy有一种努力叫做靠自己http://m.v.qq.com/play/play.html?coverid=&vid=i0547o426g4&ptag=2_6.0.0.14297_copy世界最励志短片https://v.qq.com/x/pa</div> </li> <li><a href="/article/1835395039572881408.htm" title="Dockerfile命令详解之 FROM" target="_blank">Dockerfile命令详解之 FROM</a> <span class="text-muted">清风怎不知意</span> <a class="tag" taget="_blank" href="/search/%E5%AE%B9%E5%99%A8%E5%8C%96/1.htm">容器化</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>许多同学不知道Dockerfile应该如何写,不清楚Dockerfile中的指令分别有什么意义,能达到什么样的目的,接下来我将在容器化专栏中详细的为大家解释每一个指令的含义以及用法。专栏订阅传送门https://blog.csdn.net/qq_38220908/category_11989778.html指令不区分大小写。但是,按照惯例,它们应该是大写的,以便更容易地将它们与参数区分开来。(引用</div> </li> <li><a href="/article/1835389111658180608.htm" title="《HTML 与 CSS—— 响应式设计》" target="_blank">《HTML 与 CSS—— 响应式设计》</a> <span class="text-muted">陈在天box</span> <a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>一、引言在当今数字化时代,人们使用各种不同的设备访问互联网,包括智能手机、平板电脑、笔记本电脑和台式机等。为了确保网站在不同设备上都能提供良好的用户体验,响应式设计成为了网页开发的关键。HTML和CSS作为网页开发的基础技术,在实现响应式设计方面发挥着重要作用。本文将深入探讨HTML与CSS中的响应式设计原理、方法和最佳实践。二、响应式设计的概念与重要性(一)概念响应式设计是一种网页设计方法,旨在</div> </li> <li><a href="/article/1835387977480630272.htm" title="【C语言】- 自定义类型:结构体、枚举、联合" target="_blank">【C语言】- 自定义类型:结构体、枚举、联合</a> <span class="text-muted">Cavalier_01</span> <a class="tag" taget="_blank" href="/search/C%E8%AF%AD%E8%A8%80/1.htm">C语言</a> <div>【C语言】:操作符(https://mp.csdn.net/editor/html/115218055)数据类型(https://mp.csdn.net/editor/html/115219664)自定义类型:结构体、枚举、联合(https://mp.csdn.net/editor/html/115373785)变量、常量(https://mp.csdn.net/editor/html/11523</div> </li> <li><a href="/article/1835382685745377280.htm" title="html+css网页设计 旅游网站首页1个页面" target="_blank">html+css网页设计 旅游网站首页1个页面</a> <span class="text-muted">html+css+js网页设计</span> <a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/%E6%97%85%E6%B8%B8/1.htm">旅游</a> <div>html+css网页设计旅游网站首页1个页面网页作品代码简单,可使用任意HTML辑软件(如:Dreamweaver、HBuilder、Vscode、Sublime、Webstorm、Text、Notepad++等任意html编辑软件进行运行及修改编辑等操作)。获取源码1,访问该网站https://download.csdn.net/download/qq_42431718/897527112,点击</div> </li> <li><a href="/article/1835379153730367488.htm" title="spring mvc @RequestBody String类型参数" target="_blank">spring mvc @RequestBody String类型参数</a> <span class="text-muted">zoyation</span> <a class="tag" taget="_blank" href="/search/spring-mvc/1.htm">spring-mvc</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/mvc/1.htm">mvc</a> <div>通过如下配置:text/html;charset=UTF-8application/json;charset=UTF-8在springmvc的Controller层使用@RequestBody接收Content-Type为application/json的数据时,默认支持Map方式和对象方式参数@RequestMapping(value="/{code}/saveUser",method=Requ</div> </li> <li><a href="/article/1835377684025274368.htm" title="ubuntu安装opencv最快的方法" target="_blank">ubuntu安装opencv最快的方法</a> <span class="text-muted">Derek重名了</span> <div>最快方法,当然不能太多文字$sudoapt-getinstallpython-opencv借助python就可以把ubuntu的opencv环境搞起来,非常快非常容易参考:https://docs.opencv.org/trunk/d2/de6/tutorial_py_setup_in_ubuntu.html</div> </li> <li><a href="/article/1835376759739084800.htm" title="处理标签包裹的字符串,并取出前250字符" target="_blank">处理标签包裹的字符串,并取出前250字符</a> <span class="text-muted">周bro</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>//假设这是你的HTML字符串varhtmlString=`这是一个段落。这是一个标题这是另一个段落,包含一些链接。`;//解析HTML字符串并提取文本functionextractTextFromHTML(html){varparser=newDOMParser();vardoc=parser.parseFromString(html,"text/html");vartextContent=do</div> </li> <li><a href="/article/1835372727582683136.htm" title="h5小游戏定制开发" target="_blank">h5小游戏定制开发</a> <span class="text-muted">红匣子实力推荐</span> <div>随着科技的不断发展,移动互联网已经成为人们生活中不可或缺的一部分。在这个背景下,H5小游戏应运而生,为人们带来了丰富的娱乐体验。H5小游戏定制开发作为一种新兴的游戏开发方式,正逐渐受到市场的关注和青睐。那么,什么是H5小游戏定制开发呢?它又具有哪些特点和优势呢?让我们一起来深入了解一下。首先,我们来了解一下H5小游戏的基本概念。H5小游戏是一种基于HTML5技术的游戏,可以在移动端、PC端等多平台</div> </li> <li><a href="/article/1835354700392787968.htm" title="Nginx的使用场景:构建高效、可扩展的Web架构" target="_blank">Nginx的使用场景:构建高效、可扩展的Web架构</a> <span class="text-muted">张某布响丸辣</span> <a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a> <div>Nginx,作为当今最流行的Web服务器和反向代理软件之一,凭借其高性能、稳定性和灵活性,在众多Web项目中扮演着核心角色。无论是个人博客、中小型网站,还是大型企业级应用,Nginx都能提供强大的支持。本文将探讨Nginx的几个主要使用场景,帮助读者理解如何在实际项目中充分利用Nginx的优势。1.静态文件服务对于包含大量静态文件(如HTML、CSS、JavaScript、图片等)的网站,Ngin</div> </li> <li><a href="/article/1835354447627251712.htm" title="前端知识点" target="_blank">前端知识点</a> <span class="text-muted">ZhangTao_zata</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a> <div>下面是一个最基本的html代码body{font-family:Arial,sans-serif;margin:20px;}//JavaScriptfunctionthatdisplaysanalertwhencalledfunctionshowMessage(){alert("Hello!Youclickedthebutton.");}MyFirstHTMLPageWelcometoMyPage</div> </li> <li><a href="/article/1835349024102772736.htm" title="非关系型数据库" target="_blank">非关系型数据库</a> <span class="text-muted">天秤-white</span> <a class="tag" taget="_blank" href="/search/nosql/1.htm">nosql</a> <div>一、为什么要用Nosql1.单机MySQL的时代。一个基本的网站访问量一般不会太大,单个数据库完全足够。那时候更多使用的静态网页html,服务器根本没有太大压力。这时候网站的瓶颈是什么?-数据量如果太大,一个机器放不下。-数据量太大需要建立数据的索引(B+Tree),一个服务器内存放不下。-访问量读写混合,一个服务器承受不了。2.memcached缓存+MySQL+垂直拆分(读写分离)。网站80%</div> </li> <li><a href="/article/1835342718067372032.htm" title="Python精选200Tips:121-125" target="_blank">Python精选200Tips:121-125</a> <span class="text-muted">AnFany</span> <a class="tag" taget="_blank" href="/search/Python200%2BTips/1.htm">Python200+Tips</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>Spendyourtimeonself-improvement121Requests-简化的HTTP请求处理发送GET请求发送POST请求发送PUT请求发送DELETE请求会话管理处理超时文件上传122BeautifulSoup-网页解析和抓取解析HTML和XML文档查找单个标签查找多个标签使用CSS选择器查找标签提取文本修改文档内容删除标签处理XML文档123Scrapy-强大的网络爬虫框架示例</div> </li> <li><a href="/article/1835333268375957504.htm" title="爬虫技术抓取网站数据" target="_blank">爬虫技术抓取网站数据</a> <span class="text-muted">Bearjumpingcandy</span> <a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a> <div>爬虫技术是一种自动化获取网站数据的技术,它可以模拟人类浏览器的行为,访问网页并提取所需的信息。以下是爬虫技术抓取网站数据的一般步骤:发起HTTP请求:爬虫首先会发送HTTP请求到目标网站,获取网页的内容。解析HTML:获取到网页内容后,爬虫会使用HTML解析器解析HTML代码,提取出需要的数据。数据提取:通过使用XPath、CSS选择器或正则表达式等工具,爬虫可以从HTML中提取出所需的数据,如文</div> </li> <li><a href="/article/1835316434805288960.htm" title="七.正则化" target="_blank">七.正则化</a> <span class="text-muted">愿风去了</span> <div>吴恩达机器学习之正则化(Regularization)http://www.cnblogs.com/jianxinzhou/p/4083921.html从数学公式上理解L1和L2https://blog.csdn.net/b876144622/article/details/81276818虽然在线性回归中加入基函数会使模型更加灵活,但是很容易引起数据的过拟合。例如将数据投影到30维的基函数上,模</div> </li> <li><a href="/article/1835296397365178368.htm" title="创建一个完整的购物商城系统是一个复杂的项目,涉及前端(用户界面)、后端(服务器逻辑)、数据库等多个部分。由于篇幅限制,我无法在这里提供一个完整的系统代码,但我可以分别给出一些关键部分的示例代码,涵盖几" target="_blank">创建一个完整的购物商城系统是一个复杂的项目,涉及前端(用户界面)、后端(服务器逻辑)、数据库等多个部分。由于篇幅限制,我无法在这里提供一个完整的系统代码,但我可以分别给出一些关键部分的示例代码,涵盖几</a> <span class="text-muted">uthRaman</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/ui/1.htm">ui</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a> <div>前端(HTML/CSS/JavaScript)grsyzp.cnHTML页面结构(index.html)html购物商城欢迎来到购物商城JavaScript(Ajax请求商品数据,app.js)javascriptdocument.addEventListener('DOMContentLoaded',function(){fetch('/api/products').then(response=</div> </li> <li><a href="/article/1835285939723792384.htm" title="利用frp实现内网穿透(需要云主机)" target="_blank">利用frp实现内网穿透(需要云主机)</a> <span class="text-muted">heiyumiao</span> <a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%B7%A5%E5%85%B7/1.htm">网络工具</a><a class="tag" taget="_blank" href="/search/github/1.htm">github</a><a class="tag" taget="_blank" href="/search/windows/1.htm">windows</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a> <div>详细实现教程:https://www.iplaysoft.com/frp.htmlhttps://blog.csdn.net/u013144287/article/details/78589643/项目官网地址:https://github.com/fatedier/frp/releases按照系统下载相应的程序包什么是frp内网穿透工具有很多,其中Frp(FastReverseProxy)是比较</div> </li> <li><a href="/article/1835270061674295296.htm" title="word转html制作操作手册,Word文档转换为HTML帮助文档操作手册范本.pdf" target="_blank">word转html制作操作手册,Word文档转换为HTML帮助文档操作手册范本.pdf</a> <span class="text-muted">想吃草莓干</span> <a class="tag" taget="_blank" href="/search/word%E8%BD%AChtml%E5%88%B6%E4%BD%9C%E6%93%8D%E4%BD%9C%E6%89%8B%E5%86%8C/1.htm">word转html制作操作手册</a> <div>Word文档转换为HTML帮助文档操作手册一、使用到的软件DOC2CHMDreamweaverCS3Helpandmanual4二、操作步骤1.先建立一个工作目录。如hhwork。2.将需要转换的文件复制到此工作目录下。如果是中文文件名,最好将其改为英文文件名。例:现在要将《小神探点检定修信息管理系统使用手册0.3.6.doc》转换为Html格式的帮助文档,首先将此文档复制到hhwork目录下并将</div> </li> <li><a href="/article/1835262372638453760.htm" title="WORD批量转换器MultiDoc Converter" target="_blank">WORD批量转换器MultiDoc Converter</a> <span class="text-muted">uolian</span> <a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/word/1.htm">word</a> <div>WORD批量转换器MultiDocConverterhttps://www.52pojie.cn/thread-1318745-1-1.html可批量将doc、docx等文件格式转成doc、docx、pdf、rtf、txt、html、epub等格式。安装包下载地址:https://wws.lanzouj.com/irvVbiz0pkd最终下载文件打包地址(未作成单文件,不确定是否可以直接使用):h</div> </li> <li><a href="/article/1835258583235784704.htm" title="HTML中"bgcolor"与"background-color"的区别" target="_blank">HTML中"bgcolor"与"background-color"的区别</a> <span class="text-muted">Sardar_</span> <a class="tag" taget="_blank" href="/search/html/1.htm">html</a> <div>bgcolor只是标签属性,而backgroud更多作为css的样式属性。它们俩大多数情况下效果完全相同。但在标签下效果不同。不支持bgcolor属性,只能用style标签添加CSS样式。作为table的属性而言:HelloWorld!和HelloWorld!效果完全相同。作为body属性而言:效果完全相同。不过个人推荐统一用CSS样式进行控制,把style统一放到.css文件中。backgrou</div> </li> <li><a href="/article/1835257575277424640.htm" title="【Python爬虫】百度百科词条内容" target="_blank">【Python爬虫】百度百科词条内容</a> <span class="text-muted">PokiFighting</span> <a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%A4%84%E7%90%86/1.htm">数据处理</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>词条内容我这里随便选取了一个链接,用的是FBI的词条importurllib.requestimporturllib.parsefromlxmlimportetreedefquery(url):headers={'user-agent':'Mozilla/5.0(WindowsNT6.1;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/80.</div> </li> <li><a href="/article/1835249513875468288.htm" title="说说在 Vue.js 中如何实现组件间通信" target="_blank">说说在 Vue.js 中如何实现组件间通信</a> <span class="text-muted">deniro</span> <div>1用法假设父组件的模板包含子组件,我们可以通过props来正向地把数据从父组件传递给子组件。props可以是字符串数组,也可以是对象。html:js:Vue.component('deniro-component',{props:['message'],template:'{{message}}'});varapp=newVue({el:'#app',data:{}});渲染结果:"嫦娥四号"成功</div> </li> <li><a href="/article/91.htm" title="java解析APK" target="_blank">java解析APK</a> <span class="text-muted">3213213333332132</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/apk/1.htm">apk</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E8%A7%A3%E6%9E%90APK/1.htm">解析APK</a> <div>解析apk有两种方法 1、结合安卓提供apktool工具,用java执行cmd解析命令获取apk信息 2、利用相关jar包里的集成方法解析apk 这里只给出第二种方法,因为第一种方法在linux服务器下会出现不在控制范围之内的结果。 public class ApkUtil { /** * 日志对象 */ private static Logger </div> </li> <li><a href="/article/218.htm" title="nginx自定义ip访问N种方法" target="_blank">nginx自定义ip访问N种方法</a> <span class="text-muted">ronin47</span> <a class="tag" taget="_blank" href="/search/nginx+%E7%A6%81%E6%AD%A2ip%E8%AE%BF%E9%97%AE/1.htm">nginx 禁止ip访问</a> <div>   因业务需要,禁止一部分内网访问接口, 由于前端架了F5,直接用deny或allow是不行的,这是因为直接获取的前端F5的地址。    所以开始思考有哪些主案可以实现这样的需求,目前可实施的是三种:    一:把ip段放在redis里,写一段lua &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 二:利用geo传递变量,写一段</div> </li> <li><a href="/article/345.htm" title="mysql timestamp类型字段的CURRENT_TIMESTAMP与ON UPDATE CURRENT_TIMESTAMP属性" target="_blank">mysql timestamp类型字段的CURRENT_TIMESTAMP与ON UPDATE CURRENT_TIMESTAMP属性</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a> <div>timestamp有两个属性,分别是CURRENT_TIMESTAMP 和ON UPDATE CURRENT_TIMESTAMP两种,使用情况分别如下: &nbsp; 1. &nbsp; CURRENT_TIMESTAMP&nbsp; &nbsp; 当要向数据库执行insert操作时,如果有个timestamp字段属性设为 &nbsp; CURRENT_TIMESTAMP,则无论这</div> </li> <li><a href="/article/472.htm" title="struts2+spring+hibernate分页显示" target="_blank">struts2+spring+hibernate分页显示</a> <span class="text-muted">171815164</span> <a class="tag" taget="_blank" href="/search/Hibernate/1.htm">Hibernate</a> <div>分页显示一直是web开发中一大烦琐的难题,传统的网页设计只在一个JSP或者ASP页面中书写所有关于数据库操作的代码,那样做分页可能简单一点,但当把网站分层开发后,分页就比较困难了,下面是我做Spring+Hibernate+Struts2项目时设计的分页代码,与大家分享交流。   1、DAO层接口的设计,在MemberDao接口中定义了如下两个方法: public in</div> </li> <li><a href="/article/599.htm" title="构建自己的Wrapper应用" target="_blank">构建自己的Wrapper应用</a> <span class="text-muted">g21121</span> <a class="tag" taget="_blank" href="/search/rap/1.htm">rap</a> <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们已经了解Wrapper的目录结构,下面可是正式利用Wrapper来包装我们自己的应用,这里假设Wrapper的安装目录为:/usr/local/wrapper。 &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先,创建项目应用 &nbsp; &nb</div> </li> <li><a href="/article/726.htm" title="[简单]工作记录_多线程相关" target="_blank">[简单]工作记录_多线程相关</a> <span class="text-muted">53873039oycg</span> <a class="tag" taget="_blank" href="/search/%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">多线程</a> <div>&nbsp;&nbsp;&nbsp;&nbsp; 最近遇到多线程的问题,原来使用异步请求多个接口(n*3次请求)&nbsp;&nbsp;&nbsp;&nbsp; 方案一 使用多线程一次返回数据,最开始是使用5个线程,一个线程顺序请求3个接口,超时终止返回&nbsp;&nbsp;&nbsp;&nbsp; 缺点&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 测试发现必须3个接</div> </li> <li><a href="/article/853.htm" title="调试jdk中的源码,查看jdk局部变量" target="_blank">调试jdk中的源码,查看jdk局部变量</a> <span class="text-muted">程序员是怎么炼成的</span> <a class="tag" taget="_blank" href="/search/jdk+%E6%BA%90%E7%A0%81/1.htm">jdk 源码</a> <div>转自:http://www.douban.com/note/211369821/ &nbsp; &nbsp;学习jdk源码时使用-- &nbsp; 学习java最好的办法就是看jdk源代码,面对浩瀚的jdk(光源码就有40M多,比一个大型网站的源码都多)从何入手呢,要是能单步调试跟进到jdk源码里并且能查看其中的局部变量最好了。 可惜的是sun提供的jdk并不能查看运行中的局部变量</div> </li> <li><a href="/article/980.htm" title="Oracle RAC Failover 详解" target="_blank">Oracle RAC Failover 详解</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a> <div>Oracle RAC 同时具备HA(High Availiablity) 和LB(LoadBalance). 而其高可用性的基础就是Failover(故障转移). 它指集群中任何一个节点的故障都不会影响用户的使用,连接到故障节点的用户会被自动转移到健康节点,从用户感受而言, 是感觉不到这种切换。 Oracle 10g RAC 的Failover 可以分为3种: 1. Client-Si</div> </li> <li><a href="/article/1107.htm" title="form表单提交数据编码方式及tomcat的接受编码方式" target="_blank">form表单提交数据编码方式及tomcat的接受编码方式</a> <span class="text-muted">antonyup_2006</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/tomcat/1.htm">tomcat</a><a class="tag" taget="_blank" href="/search/%E6%B5%8F%E8%A7%88%E5%99%A8/1.htm">浏览器</a><a class="tag" taget="_blank" href="/search/%E4%BA%92%E8%81%94%E7%BD%91/1.htm">互联网</a><a class="tag" taget="_blank" href="/search/servlet/1.htm">servlet</a> <div>原帖地址:http://www.iteye.com/topic/266705 form有2中方法把数据提交给服务器,get和post,分别说下吧。 (一)get提交 1.首先说下客户端(浏览器)的form表单用get方法是如何将数据编码后提交给服务器端的吧。 &nbsp;&nbsp; 对于get方法来说,都是把数据串联在请求的url后面作为参数,如:http://localhost:</div> </li> <li><a href="/article/1234.htm" title="JS初学者必知的基础" target="_blank">JS初学者必知的基础</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/js%E5%87%BD%E6%95%B0/1.htm">js函数</a><a class="tag" taget="_blank" href="/search/js%E5%85%A5%E9%97%A8%E5%9F%BA%E7%A1%80/1.htm">js入门基础</a> <div>JavaScript是网页的交互语言,实现网页的各种效果, JavaScript 是世界上最流行的脚本语言。 JavaScript 是属于 web 的语言,它适用于 PC、笔记本电脑、平板电脑和移动电话。 JavaScript 被设计为向 HTML 页面增加交互性。 许多 HTML 开发者都不是程序员,但是 JavaScript 却拥有非常简单的语法。几乎每个人都有能力将小的 </div> </li> <li><a href="/article/1361.htm" title="iBatis的分页分析与详解" target="_blank">iBatis的分页分析与详解</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/ibatis/1.htm">ibatis</a> <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 分页是操作数据库型系统常遇到的问题。分页实现方法很多,但效率的差异就很大了。iBatis是通过什么方式来实现这个分页的了。查看它的实现部分,发现返回的PaginatedList实际上是个接口,实现这个接口的是PaginatedDataList类的对象,查看PaginatedDataList类发现,每次翻页的时候最</div> </li> <li><a href="/article/1488.htm" title="精通Oracle10编程SQL(15)使用对象类型" target="_blank">精通Oracle10编程SQL(15)使用对象类型</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/plsql/1.htm">plsql</a> <div>/* *使用对象类型 */ --建立和使用简单对象类型 --对象类型包括对象类型规范和对象类型体两部分。 --建立和使用不包含任何方法的对象类型 CREATE OR REPLACE TYPE person_typ1 as OBJECT( name varchar2(10),gender varchar2(4),birthdate date ); drop type p</div> </li> <li><a href="/article/1615.htm" title="【Linux命令二】文本处理命令awk" target="_blank">【Linux命令二】文本处理命令awk</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/linux%E5%91%BD%E4%BB%A4/1.htm">linux命令</a> <div>awk是Linux用来进行文本处理的命令,在日常工作中,广泛应用于日志分析。awk是一门解释型编程语言,包含变量,数组,循环控制结构,条件控制结构等。它的语法采用类C语言的语法。 &nbsp; awk命令用来做什么? 1.awk适用于具有一定结构的文本行,对其中的列进行提取信息 2.awk可以把当前正在处理的文本行提交给Linux的其它命令处理,然后把直接结构返回给awk 3.awk实际工</div> </li> <li><a href="/article/1742.htm" title="JAVA(ssh2框架)+Flex实现权限控制方案分析" target="_blank">JAVA(ssh2框架)+Flex实现权限控制方案分析</a> <span class="text-muted">白糖_</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>&nbsp; 目前项目使用的是Struts2+Hibernate+Spring的架构模式,目前已经有一套针对SSH2的权限系统,运行良好。但是项目有了新需求:在目前系统的基础上使用Flex逐步取代JSP,在取代JSP过程中可能存在Flex与JSP并存的情况,所以权限系统需要进行修改。 【SSH2权限系统的实现机制】 权限控制分为页面和后台两块:不同类型用户的帐号分配的访问权限是不同的,用户使</div> </li> <li><a href="/article/1869.htm" title="angular.forEach" target="_blank">angular.forEach</a> <span class="text-muted">boyitech</span> <a class="tag" taget="_blank" href="/search/AngularJS/1.htm">AngularJS</a><a class="tag" taget="_blank" href="/search/AngularJS+API/1.htm">AngularJS API</a><a class="tag" taget="_blank" href="/search/angular.forEach/1.htm">angular.forEach</a> <div>angular.forEach 描述: 循环对obj对象的每个元素调用iterator, obj对象可以是一个Object或一个Array. Iterator函数调用方法: iterator(value, key, obj), 其中obj是被迭代对象,key是obj的property key或者是数组的index,value就是相应的值啦.&nbsp;(此函数不能够迭代继承的属性.) </div> </li> <li><a href="/article/1996.htm" title="java-谷歌面试题-给定一个排序数组,如何构造一个二叉排序树" target="_blank">java-谷歌面试题-给定一个排序数组,如何构造一个二叉排序树</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/%E4%BA%8C%E5%8F%89%E6%8E%92%E5%BA%8F%E6%A0%91/1.htm">二叉排序树</a> <div> import java.util.LinkedList; public class CreateBSTfromSortedArray { /** * 题目:给定一个排序数组,如何构造一个二叉排序树 * 递归 */ public static void main(String[] args) { int[] data = { 1, 2, 3, 4, </div> </li> <li><a href="/article/2123.htm" title="action执行2次" target="_blank">action执行2次</a> <span class="text-muted">Chen.H</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/jsp/1.htm">jsp</a><a class="tag" taget="_blank" href="/search/XHTML/1.htm">XHTML</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/Webwork/1.htm">Webwork</a> <div>xwork 写道 &lt;action name=&quot;userTypeAction&quot; class=&quot;com.ekangcount.website.system.view.action.UserTypeAction&quot;&gt; &lt;result name=&quot;ssss&quot; type=&quot;dispatcher&quot;&gt; </div> </li> <li><a href="/article/2250.htm" title="[时空与能量]逆转时空需要消耗大量能源" target="_blank">[时空与能量]逆转时空需要消耗大量能源</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/%E8%83%BD%E6%BA%90/1.htm">能源</a> <div> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 无论如何,人类始终都想摆脱时间和空间的限制....但是受到质量与能量关系的限制,我们人类在目前和今后很长一段时间内,都无法获得大量廉价的能源来进行时空跨越..... &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在进行时空穿梭的实验中,消耗超大规模的能源是必然</div> </li> <li><a href="/article/2377.htm" title="oracle的正则表达式(regular expression)详细介绍" target="_blank">oracle的正则表达式(regular expression)详细介绍</a> <span class="text-muted">daizj</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/1.htm">正则表达式</a> <div>&nbsp;&nbsp;&nbsp; 正则表达式是很多编程语言中都有的。可惜oracle8i、oracle9i中一直迟迟不肯加入,好在oracle10g中终于增加了期盼已久的正则表达式功能。你可以在oracle10g中使用正则表达式肆意地匹配你想匹配的任何字符串了。 正则表达式中常用到的元数据(metacharacter)如下: ^ 匹配字符串的开头位置。 $ 匹配支付传的结尾位置。 * </div> </li> <li><a href="/article/2504.htm" title="报表工具与报表性能的关系" target="_blank">报表工具与报表性能的关系</a> <span class="text-muted">datamachine</span> <a class="tag" taget="_blank" href="/search/%E6%8A%A5%E8%A1%A8%E5%B7%A5%E5%85%B7/1.htm">报表工具</a><a class="tag" taget="_blank" href="/search/birt/1.htm">birt</a><a class="tag" taget="_blank" href="/search/%E6%8A%A5%E8%A1%A8%E6%80%A7%E8%83%BD/1.htm">报表性能</a><a class="tag" taget="_blank" href="/search/%E6%B6%A6%E4%B9%BE%E6%8A%A5%E8%A1%A8/1.htm">润乾报表</a> <div>在选择报表工具时,性能一直是用户关心的指标,但是,报表工具的性能和整个报表系统的性能有多大关系呢? 要回答这个问题,首先要分析一下报表的处理过程包含哪些环节,哪些环节容易出现性能瓶颈,如何优化这些环节。 &nbsp; 一、报表处理的一般过程分析 1、用户选择报表输入参数后,报表引擎会根据报表模板和输入参数来解析报表,并将数据计算和读取请求以SQL的方式发送给数据库。 &nbsp; 2、</div> </li> <li><a href="/article/2631.htm" title="初一上学期难记忆单词背诵第一课" target="_blank">初一上学期难记忆单词背诵第一课</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/word/1.htm">word</a><a class="tag" taget="_blank" href="/search/english/1.htm">english</a> <div>what 什么&nbsp; your 你 name 名字 my 我的 am 是 one 一 two 二 three 三 four 四 five 五 class 班级,课 &nbsp; six 六 seven 七 eight 八 nince 九 ten 十 zero 零 how 怎样 old 老的 eleven 十一 twelve 十二 thirteen </div> </li> <li><a href="/article/2758.htm" title="我学过和准备学的各种技术" target="_blank">我学过和准备学的各种技术</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/%E6%8A%80%E6%9C%AF/1.htm">技术</a> <div>语言VB&nbsp;https://msdn.microsoft.com/zh-cn/library/2x7h1hfk.aspxJava&nbsp;http://docs.oracle.com/javase/8/C#&nbsp;https://msdn.microsoft.com/library/vstudioPHP&nbsp;http://php.net/manual/en/Html&nbsp;</div> </li> <li><a href="/article/2885.htm" title="struts2中token防止重复提交表单" target="_blank">struts2中token防止重复提交表单</a> <span class="text-muted">蕃薯耀</span> <a class="tag" taget="_blank" href="/search/%E9%87%8D%E5%A4%8D%E6%8F%90%E4%BA%A4%E8%A1%A8%E5%8D%95/1.htm">重复提交表单</a><a class="tag" taget="_blank" href="/search/struts2%E4%B8%ADtoken/1.htm">struts2中token</a> <div>struts2中token防止重复提交表单 &nbsp; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; 蕃薯耀 2015年7月12日 11:52:32 星期日 ht</div> </li> <li><a href="/article/3012.htm" title="线性查找二维数组" target="_blank">线性查找二维数组</a> <span class="text-muted">hao3100590</span> <a class="tag" taget="_blank" href="/search/%E4%BA%8C%E7%BB%B4%E6%95%B0%E7%BB%84/1.htm">二维数组</a> <div>1.算法描述 有序(行有序,列有序,且每行从左至右递增,列从上至下递增)二维数组查找,要求复杂度O(n) &nbsp; 2.使用到的相关知识: 结构体定义和使用,二维数组传递(http://blog.csdn.net/yzhhmhm/article/details/2045816) &nbsp; 3.使用数组名传递 这个的不便之处很明显,一旦确定就是不能设置列值 //使</div> </li> <li><a href="/article/3139.htm" title="spring security 3中推荐使用BCrypt算法加密密码" target="_blank">spring security 3中推荐使用BCrypt算法加密密码</a> <span class="text-muted">jackyrong</span> <a class="tag" taget="_blank" href="/search/Spring+Security/1.htm">Spring Security</a> <div>spring security 3中推荐使用BCrypt算法加密密码了,以前使用的是md5, Md5PasswordEncoder 和 ShaPasswordEncoder,现在不推荐了,推荐用bcrpt Bcrpt中的salt可以是随机的,比如: int i = 0; while (i &lt; 10) { String password = &quot;1234</div> </li> <li><a href="/article/3266.htm" title="学习编程并不难,做到以下几点即可!" target="_blank">学习编程并不难,做到以下几点即可!</a> <span class="text-muted">lampcy</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80/1.htm">编程语言</a> <div>不论你是想自己设计游戏,还是开发iPhone或安卓手机上的应用,还是仅仅为了娱乐,学习编程语言都是一条必经之路。编程语言种类繁多,用途各 异,然而一旦掌握其中之一,其他的也就迎刃而解。作为初学者,你可能要先从Java或HTML开始学,一旦掌握了一门编程语言,你就发挥无穷的想象,开发 各种神奇的软件啦。 1、确定目标 学习编程语言既充满乐趣,又充满挑战。有些花费多年时间学习一门编程语言的大学生到</div> </li> <li><a href="/article/3393.htm" title="架构师之mysql----------------用group+inner join,left join ,right join 查重复数据(替代in)" target="_blank">架构师之mysql----------------用group+inner join,left join ,right join 查重复数据(替代in)</a> <span class="text-muted">nannan408</span> <a class="tag" taget="_blank" href="/search/right+join/1.htm">right join</a> <div>1.前言。 &nbsp; 如题。 2.代码 (1)单表查重复数据,根据a分组 &nbsp; SELECT m.a,m.b, INNER JOIN (select a,b,COUNT(*) AS rank FROM test.`A` A GROUP BY a HAVING rank&gt;1 )k ON m.a=k.a (2)多表查询 , 使用改为le</div> </li> <li><a href="/article/3520.htm" title="jQuery选择器小结 VS 节点查找(附css的一些东西)" target="_blank">jQuery选择器小结 VS 节点查找(附css的一些东西)</a> <span class="text-muted">Everyday都不同</span> <a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/name%E9%80%89%E6%8B%A9%E5%99%A8/1.htm">name选择器</a><a class="tag" taget="_blank" href="/search/%E8%BF%BD%E5%8A%A0%E5%85%83%E7%B4%A0/1.htm">追加元素</a><a class="tag" taget="_blank" href="/search/%E6%9F%A5%E6%89%BE%E8%8A%82%E7%82%B9/1.htm">查找节点</a> <div>最近做前端页面,频繁用到一些jQuery的选择器,所以特意来总结一下: &nbsp; 测试页面: &lt;html&gt; &lt;head&gt; &lt;script src=&quot;jquery-1.7.2.min.js&quot;&gt;&lt;/script&gt; &lt;script&gt; /*$(function() { $(documen</div> </li> <li><a href="/article/3647.htm" title="关于EXT" target="_blank">关于EXT</a> <span class="text-muted">tntxia</span> <a class="tag" taget="_blank" href="/search/ext/1.htm">ext</a> <div>&nbsp; ExtJS是一个很不错的Ajax框架,可以用来开发带有华丽外观的富客户端应用,使得我们的b/s应用更加具有活力及生命力。ExtJS是一个用 javascript编写,与后台技术无关的前端ajax框架。因此,可以把ExtJS用在.Net、Java、Php等各种开发语言开发的应用中。 &nbsp; &nbsp; &nbsp; ExtJs最开始基于YUI技术,由开发人员Jack </div> </li> <li><a href="/article/3774.htm" title="一个MIT计算机博士对数学的思考" target="_blank">一个MIT计算机博士对数学的思考</a> <span class="text-muted">xjnine</span> <a class="tag" taget="_blank" href="/search/Math/1.htm">Math</a> <div>&nbsp;在过去的一年中,我一直在数学的海洋中游荡,research进展不多,对于数学世界的阅历算是有了一些长进。为什么要深入数学的世界?作为计算机的学生,我没有任何企图要成为一个数学家。我学习数学的目的,是要想爬上巨人的肩膀,希望站在更高的高度,能把我自己研究的东西看得更深广一些。说起来,我在刚来这个学校的时候,并没有预料到我将会有一个深入数学的旅程。我的导师最初希望我去做的题目,是对appe</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>