整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

「JS进阶」 HTML5 之文件操作(file)

在 HTML 文档中 <input type="file"> 标签每出现一次,一个 FileUpload 对象就会被创建。

该元素包含一个文本输入字段,用来输入文件名,还有一个按钮,用来打开文件选择对话框以便图形化选择文件。

该元素的 value 属性保存了用户指定的文件的名称,但是当包含一个 file-upload 元素的表单被提交的时候,浏览器会向服务器发送选中的文件的内容而不仅仅是发送文件名。

当用户选择或编辑一个文件名,file-upload 元素触发 onchange 事件句柄。

看个简单例子:

[html]view plaincopy

<!-- oscar999  -->  
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
<html>  
  <head>  
  <meta http-equiv="content-type" content="text/html; charset=utf-8">  
  <meta name="author" content="oscar999">  
  <title></title>  
  <script>  
  function  handleFiles(files)  
  {  
    if(files.length)  
    {  
       var file = files[0];  
       var reader = new FileReader();  
       reader.onload = function()  
       {  
           document.getElementById("filecontent").innerHTML = this.result;  
       };  
       reader.readAsText(file);  
    }  
  }  
  </script>  
  </head>  
  <body>  
  <input type="file" id="file" onchange="handleFiles(this.files)"/>  
  <div id="filecontent"></div>  
  </body>  
</html>  

这里读取一个文件, 显示在div 中。

(在IE8 中 无效, this.files 无法读取文件。这个属于HTML5 的特性)

当选择了一个文件时,就会把包含这个文件的列表(一个FileList对象)作为参数传给handleFiles()函数了。这个FileList对象类似一个数组,可以知道文件的数目,而它的元素就是File对象了。从这个File对象可以获取name、size、lastModifiedDate和type等属性。把这个File对象传给FileReader对象的读取方法,就能读取文件了。



HTML5 Drag and Drop File

Html5 支持的File 的操作不仅仅是文件的选择,

在HTML5 之前需要使用 Applet 和 SilverLight 才能达到的文件拖拽功能,在HTML5 中也能轻松的实现,

看代码:

[html]view plaincopy

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
<html>  
  <head>  
  <meta http-equiv="content-type" content="text/html; charset=utf-8">  
  <meta name="author" content="oscar999">  
  <title></title>  
  </head>  
  <body>  
    <div id="dropbox"> Drop Here </div>  
    <div id="filecontent"></div>  
    <script>  
      var dropbox = document.getElementById("dropbox");    
      dropbox.addEventListener("dragenter", dragenter, false);    
      dropbox.addEventListener("dragover", dragover, false);    
      dropbox.addEventListener("drop", drop, false);     
    function dragenter(e) {    
        e.stopPropagation();    
        e.preventDefault();    
    }    
    function dragover(e) {    
        e.stopPropagation();    
        e.preventDefault();    
    }  
    function drop(e) {    
        e.stopPropagation();    
        e.preventDefault();     
        var dt = e.dataTransfer;    
        var files = dt.files;  
        if(files.length)  
        {  
           var file = files[0];  
           var reader = new FileReader();  
           reader.onload = function()  
           {  
               document.getElementById("filecontent").innerHTML = this.result;  
           };  
           reader.readAsText(file);  
        }  
    }   
    </script>  
  </body>  
</html>  

这里通过事件对象的 dataTransfer 可以得到文件。



读取文件内容

在第一个例子中, 我们使用 FileReader类来读取文件的内容,

在 W3C 草案中,File 对象只包含文件名,文件类型等只读属性;FileReader用于内容读取和监控读取状态。

(在firefox 中, 可以直接使用 var fileBinary = file.getAsBinary(); 读取文件的二进制源码)

FileReader提供的方法包括:

1. readAsBinaryString

2. readAsDataURL

3. readAsText

4. abort

.........


以下,举一个 使用 FileReader 将用户选择的图片不通过后台即时显示出来的例子。

[html]view plaincopy

function handleFiles(files){  
    for (var i = 0; i < files.length; i++) {  
        var file = files[i];  
        var imageType = /image.*/;  
        if (!file.type.match(imageType)) {  
            continue;  
        }  
        var img = document.createElement("img");  
        img.classList.add("obj");  
        img.file = file;  
        preview.appendChild(img);  
        var reader = new FileReader();  
        reader.onload = (function(aImg){  
            return function(e){  
                aImg.src = e.target.result;  
            };  
        })(img);  
        reader.readAsDataURL(file);  
    }  
}  



同后端的交互

在一般的HTML 中,使用方式是把file input 放在form 中, 以POST 方式把文件传递到后端。

在 HTML5 中, 也可以通过 FileReader 的 readAsBinaryString 方法读取到文件的二进制码,然后通过 XMLHttpRequest 的 sendAsBinary 方法将其发送出去。

[javascript]view plaincopy

var xhr = new XMLHttpRequest();  
xhr.open("POST", "url");  
xhr.overrideMimeType('text/plain; charset=x-user-defined-binary');  
<pre code_snippet_id="422893" snippet_file_name="blog_20140709_4_2106578" class="sh_javascript sh_sourceCode" name="code">xhr<span class="sh_symbol">.</span><span class="sh_function">sendAsBinary</span><span class="sh_symbol">(</span>binaryString<span class="sh_symbol">);</span></pre><br>  

ileReader 对象FileReader 对象主要用来把文件读入内存,并且读取文件中的数据。通过构造函数创建一个 FileReader 对象。

这个文件读取对象有以下几种方法:

1.readAsText():读取文本文件(可以使用Txt打开的文件),返回文本字符串,默认编码是UTF-8。


2.readAsBinaryString():读取任意类型的文件。返回二进制字符串。这个方法不是用来读取文件展示给用户看,而是存储文件。例如:读取文件的内容,获取二进制数据,传递给后台,后台接收了数据之后,再将数据存储。


3.readAsDataURL():读取文件获取一段以data开头的字符串,这段字符串的本质就是DataURL.DataURL是一种将文件(这个文件一般就是指图像或者能够嵌入到文档的文件格式)嵌入到文档的方案。DataURL是将资源转换为base64编码的字符串形式,并且将这些内容直接存储在url中>>优化网站的加载速度和执行效率。


4.abort():中断读取

该对象常见应用在即时预览:

即时:当用户选择完图片之后就立刻进行预览的处理 >>onchange。

预览:通过文件读取对象的readAsDataURL()完成。

以下是应用时的具体实现(推荐了解黑马程序员web前端培训课程)

HTML部分:

JS部分:

其中获取数据时,FileReader还提供一个完整的事件模型,用来捕获读取文件时的状态。

onabort:读取文件中断片时触发

onerror:读取错误时触发

onload:文件读取成功完成时触发

onloadend:读取完成时触发,无论成功还是失败

onloadstart:开始读取时触发

onprogress:读取文件过程中持续触发



TML5 对于初学者甚至是非程序员来说都有着十足的吸引力。实际上,只要你访问网站,就会和 HTML 打交道。如果能够熟悉一些关键的编程技巧,当你对网站做一些细节调整或优化基本的 Web 元素时就能节省大量的时间(甚至是金钱)。因此,本文精选了 10 个对于 Web 开发者来说非常实用的 HTML 编程技巧,而且它们不需要花太多时间精力就可以轻松掌握。

1. 可与本地缓存媒体资源交互

HTML5 FileSystem API 一开始被认为是 AppCache 的替代方案,用来实现资产的动态缓存。但是你知道吗,其实你还可以用它来实现与用户本地设备上存储文件的交互。

例如,你可以在应用中添加以下功能:

  • 断点上传器:将文件复制到一个本地沙箱中,然后分批上传。出现连接中断、浏览器崩溃故障后可以重新启动上传操作。
  • 为游戏、音乐播放器,照片编辑器等媒体密集型应用启用本地缓存。
  • 为内容查看创建离线模式,例如离线视频、电子邮件附件和文本等。

注意:FileSystem API 仅被 Chrome 支持。

如果你想尝试离线存储功能,还可以参考以下资源和代码教程:

  • Eric Bidelman:如何使用 HTML5 FileSystem API[1]。
  • 管理 HTML5 离线存储 [2]。
  • HTML5 中的脱机文件:FileSystem API[3]。


2. 进行自动表单验证

对于网站安全性和流畅的用户体验来说,表单验证非常重要。所以我们应该让用户更轻松地在你的网站上输入各种正确类型的值。

在 HTML5 中有几种新的输入类型可用,这些类型已经打包进了预定义的验证功能:

  • 'email'
  • 'url'
  • 'tel'

但当你需要用户提供某些标准输入未指定的数据时(例如一个包含特殊字符的用户名),往往就会出问题了。这就是“pattern”属性派上用场的时候。

Pattern 可让你定义自定义规则,然后使用正则表达式(RegEx)验证表单输入。RegEx 指定了<input>元素值将要检查的表达式。

下面是一个添加新规则的示例。例如,你要指定密码不应超过 15 个字符,并且只能包含小写字母:

<form action="/action_page.php">
Password: <input type="password" name="pw" pattern="[a-z].{1,15,}">
<input type="submit">
</form>

为了更好地说明规则,你还可以添加一条自定义消息,告诉用户为什么他们输入的密码不符合要求。只需再加上一行来自定义弹出消息即可:

<form action="/action_page.php">
Password: <input type="password" name="pw" pattern="[a-z].{1,15,}" title="One to fifteen characters, lowercase only".>>
<input type="submit">
</form>

3. 为 HTML5 代码元素创建缩写

Emmet[4] 是一个很好用的文本编辑器插件,可以简化你的 HTML/CSS 编码流程。这个工具使用的语法类似于 CSS 的选择器,可让你为标准 HTML 代码元素创建各种缩写。

下面是一个例子。如果你输入:

div#header>h1.logo>a{website}

则会收到:

<div id="header">
<h1 class="logo"><a href="">website</a></h1>
</div>

你可以使用 cheat sheet[5] 中的多种已有组合,也可以为任意 HTML 标签创建自定义组合,然后按 Tab 或 Ctrl + E 将其添加到文本编辑器中。我自己是一名从事了多年开发的web前端老程序员,目前辞职在做自己的web前端私人定制课程,去年我花了一个月整理了一份最适合2019年学习的web前端学习干货,各种框架都有整理,送给每一位前端小伙伴,想要获取的可以关注我的头条号并在后台私信我:前端,即可免费获取。

4. 实现更优的视频传输

使用 video 标签,可以将支持视频播放的媒体播放器无缝嵌入到网页中。

你可以选择:

  • 使用 getUserMedia() 或 WebRTC 启用来自摄像头的实时流。
  • 使用 src 属性播放本地托管的视频:<video src="file.avi"/>。

此外,你必须为视频指定“控件”(例如播放、暂停和音量调节),否则用户将没有任何控件可用。这里的示例代码如下:

<video width="768" height="432" autoplay>
<source src="video.mp4" type="video/mp4">
</video>

为了进一步改善观看体验,你还可以尝试使用以下属性:

  • disablePictureInPicture[6]:禁止浏览器显示画中画上下文菜单或自动请求画中画。
  • loop:提示浏览器在结束播放后自动重播视频。
  • muted:自动使视频中的音频静音。
  • poster:将自定义图像显示为视频缩略图。否则,浏览器将显示视频的第一帧作为缩略图。
  • preload:向浏览器指示哪些参数将带来最佳的用户体验。你可以将它设置为 none(无预加载要求);metadata:仅会预取视频元数据;auto:即使用户不希望观看整个视频,也要下载全部视频数据。注意:autoplay 属性的优先级高于此属性。

你可以在这个 HTML 速查表 [7] 中找到更多使用方便的多媒体文件标签。

5. 改善图像的显示方式

<picture>标签有助于优化图像的显示方式。

它通常用于:

  • 样式:指定在各种条件下应如何显示媒体(例如,为较小的屏幕加载图像的较小版本)。这是创建响应式设计的关键一环。
  • 提升速度:根据用户的屏幕规格指定应加载的图像尺寸。
  • 浏览器支持:在各种类型的浏览器中提供不同的图像格式,以显示正确的内容。

示例:

<picture>
<source media="(min-width: 846px)" srcset="img_1.jpg">
<source media="(min-width: 300 px)" srcset="img_2.jpg">
<img src="img_3.jpg" alt="logo">
</picture>

<picture>标签包含两个附加子元素:

  • <source>:指定媒体元素的媒体资源。
  • <img>:定义一个图像。

要启用其他样式选项,请将以下属性添加到<source>元素:

  • srcset(必需):使用它来定义图像的目标 URL。
  • media(类似于媒体查询):是一个条件,用户代理为每个<source>元素评估这个条件。
  • sizes:指定宽度描述符。
  • type:提供 MIME 类型定义。

<img>元素可用来确保在不支持<picture>元素的浏览器中正确显示图像。

6. 提升首屏页面的加载速度

如果你希望你的网站在搜索结果中获得靠前的排名,并提供出色的用户体验,那么就需要重点关注页面的加载速度。

但是,要在 Google Page Insights 中拿到高分并不是那么容易。虽然这一工具的确会标出你的网站上应该修复的内容,但是对于从头开始对网站进行编码的人们并没有提供明确的优化指导。

谷歌对于首屏设计的官方建议 [8] 有些含糊不清:

  • 调整你的 HTML 结构,以首先加载关键的首屏内容。
  • 减少你的资源使用的数据量。

所以我们来将其分解为更可操作的几个步骤:

  • 确保你的 CSS 是内联的。
  • 尽量减少、合并和消除不必要的外部 CSS 文件。
  • 自动减少阻碍渲染的 CSS 数据。
  • 使用 CSS 媒体类型和媒体查询,将某些 CSS 资源指定为非渲染阻碍类型 [9]。
  • 将<content>部分放在<sidebar>之前。
  • 推迟加载 JavaScript。
  • 生成可嵌入的字体数据以加快字体加载速度,并选择 web 安全的字体 [10]。

然后再次运行检查任务,看看是否还有需要修复的内容。

7. 网站加速

只要将 .zip 文件而不是 index.html 文件发送给浏览器,就可以节省大量带宽和下载时间。

图片来自 betterexplained[11]

要设置 .gzip 压缩,你需要在 web 主机 / 服务器上找到 htaccess 文件,并使用以下代码对其进行修改:

<ifModule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_item_include file .(html?|txt|css|js|php|pl)$
mod_gzip_item_include handler ^cgi-script$
mod_gzip_item_include mime ^text/.*
mod_gzip_item_include mime ^application/x-javascript.*
mod_gzip_item_exclude mime ^image/.*
mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
</ifModule>

如果这样做不起作用,请参考下面这些针对不同 web 服务器类型的教程:

  • Apache:https://httpd.apache.org/docs/current/mod/mod_deflate.html#enable
  • Litespeed:https://www.litespeedtech.com/support/wiki/doku.php/litespeed_wiki:config:gzip-compression
  • NGINX:https://docs.nginx.com/nginx/admin-guide/web-server/compression/

8. 利用 Microdata 进行 SEO

你可以使用 microdata 将额外的上下文编入网页。然后,网络爬虫就可以从你的页面中渲染微数据,并为用户提供更好的浏览体验,以更高的精确性对你的网站建立索引并为其提供更准确的搜索结果排名。

简而言之,Microdata 由名称 / 值(name/value)对组成,每一个项目(item)定义一组命名的属性(property)。

  • 项目具有项目类型、全局标识符和一个属性列表。要创建一个新项目,请使用 itemscope attribute。
  • 属性具有一个或多个值。要将属性分配给项目,请使用 itemprop attribute。


9. 使用 HTML5 本地存储代替 Cookie

Local Storage(也称为 DOM 存储)使你可以在本地存储用户数据,这样就无需通过 HTTP 网络请求发送数据了。它可以节省带宽并提升数据存储能力。看起来不错吧?

但是有一个重要的警告:本地存储仅能保存在客户端,而 cookie 既可以保存在服务器端也可以在客户端。因此,如果你的网站使用了服务器端的 Cookie 来基于已知的用户首选项自定义内容,则迁移到本地存储可能就需要重大的架构更改工作了。

但在比较简单的情况下(例如你使用 Cookie 来存储一些基本设置),本地存储可能是一个很好的替代品,尤其是在网络连接质量较差的区域。另外请记住,本地存储对于高敏感数据(例如财务信息)可能不是理想的选择,并且建议你对本地存储的所有数据都进行额外的加密。

Jenkov 详细介绍了如何设置和配置 HTML5 本地存储 [13]。

10. 编写有编号项目的降序列表

文章最后介绍一个非常简单的技巧:你可以使用<reversed>属性添加降序列表替代升序列表。

下面是一个示例代码片段:

<ol reversed>
<li>Ready</li>
<li>Set</li>
<li>Go!</li>
</ol>

听起来可能没有多大意义,但是当你想在页面中添加一些时髦的样式时,它可能就会派上用场了。

小结

现在你应该掌握了这 10 个新的 HTML5 技巧和窍门,它们应该可以帮助你构建更快、更人性化和更有吸引力的网站。不过千万要记得,在开始实验之前先对你的网站进行备份!



原文链接:https://mp.weixin.qq.com/s/qtQZUvsnIn0nsFbG51lQQw

作者:前端工匠