Javascript学习笔记21 HTML5 API (requestAnimationFrame FileReader WebWoker)

HTML5的FileReader接口提供了几个关键方法来实现文件读取 它内部有一个缓冲区,能够暂存待写入的数据,直到有空闲时间再一次性写入磁盘,从而减少了频繁与磁盘交互带来的I/O开销,提高了写入性能。当你尝试从FileReader读取数据时,可能会遇到各种I/O异常,比如FileNotFoundException(如果指定的文件不存在)、IOException(文件损坏或其他读取错误)。在这个示例中,如果文件不存在或读取过程中发生其他错误,catch块内的代码会执行相应的错误处理操作。: 提供格式化的输出,通常与 File 类结合使用,用于创建新文件或追加到已有文件。 阅读详情

requestAnimationFrame()

为解决setInterval()和setTimeout()执行动画事件不精确的问题,HTML5 创造了该方法来告诉浏览器您希望执行动画操作并请求浏览器在下一次重绘之前调用指定的函数来更新动画。回调的次数通常是每秒60次,当运行在后台标签页或者隐藏的<iframe> 里时,requestAnimationFrame() 会暂停调用以提升性能和电池寿命。

window.requestAnimationFrame(callbackFunction);
  • 该方法接受一个回调函数,用于在下次重新绘制动画时调用。这个回调函数只有传参,DOMHighResTimeStamp,指示当前被 requestAnimationFrame() 排序的回调函数被触发的时间,单位为毫秒。若想要在下次重绘时产生另一个动画画面,您的回调例程必须调用requestAnimationFrame()。
  • 返回一个请求ID,可以传给window.cancelAnimationFrame() 取消回调函数

示例

var start = null;
var element = document.getElementById('SomeElementYouWantToAnimate');
element.style.position = 'absolute';

function step(timestamp) {
  if (!start) start = timestamp;
  var progress = timestamp - start;
  element.style.left = Math.min(progress / 10, 200) + 'px';
  if (progress < 2000) {
    window.requestAnimationFrame(step);
  }
}

window.requestAnimationFrame(step);

Page Visbility API

使开发人员知道页面是否对用户可见。如果页面最小化了或者被隐藏在了其他标签页后面,那么可以使某些功能(例如轮播图)暂停下来

属性

  • document.hidden: 隐藏时返回true,否则返回false
  • document.visibilityState:展示文档可先性的字符串。可能的值为visible(页面内容至少部分可见),hidden(不可见),prerender(正在渲染,用户不可见),unloaded(页面正在被卸载)

事件
visibilityChange事件:当文档从可见变为不可见或从不可见变为可见时触发

//startSimulation 和 pauseSimulation 在其他地方定义
function handleVisibilityChange() {
  if (document.hidden) {
    pauseSimulation();
  } else  {
    startSimulation();
  }
}

document.addEventListener("visibilitychange", handleVisibilityChange, false);

Geolocation API

地理位置 API 允许用户向 Web 应用程序提供他们的位置。出于隐私考虑,报告地理位置前会先请求用户许可。地理位置 API 通过 navigator.geolocation 提供。

检测浏览器是否支持该API

if ("geolocation" in navigator) {
  /* 地理位置服务可用 */
} else {
  /* 地理位置服务不可用 */
}

获取当前定位

您可以调用 getCurrentPosition() 方法获取用户当前定位位置。该方法接受3个参数:成功回调函数,可选的失败回调函数和可选的选项对象。

navigator.geolocation.getCurrentPosition(function(position) {
  do_something(position.coords.latitude, position.coords.longitude);
});
  • 成功回调函数会接受到一个Position对象参数,Position.coors.latitude和Position.coors.longitude属性保存着以十进制度数表示的纬度和经度坐标
  • 失败回调函数会接受到一个对象,其包含两个属性message和code,分别为出错的信息和错误的类型
  • 第三个参数选项对象用于设置一些定位参数,enableHighAccuracy是一个布尔值,表示是否使用精确定位,除非确实需要,都应该设置为false。timeout表示等待位置信息的最长时间,单位为毫秒,maximumAge为表示上一次取得坐标信息的有效时间,单位为毫秒,如果时间已超过有效时间,则重新获取坐标,否则使用上一次取得的坐标。
navigator.geolocation.getCurrentPosition(function(position) {
    do_something(position.coords.latitude, position.coords.longitude);
},function(error){
    console.log(error.message);
},{
    enableHighAccuracy:true,
    timeout:5000,
    maximumAge:25000
});

跟踪用户位置

通过 watchPosition() 方法实现该功能。它与 getCurrentPosition() 接受相同的参数,但回调函数会被调用多次。错误回调函数与 getCurrentPosition() 中一样是可选的,也会被多次调用。实际上其与定时调用getCurrentPosition()的效果相同

var watchID = navigator.geolocation.watchPosition(function(position) {
    do_something(position.coords.latitude, position.coords.longitude);
});
  • watchPosition() 方法会返回一个 ID,唯一地标记该位置监视器。您可以将这个 ID 传给 clearWatch() 方法来停止监视用户位置
navigator.geolocation.clearWatch(watchID);

File API

HTML5在DOM中为文件输入元素添加了一个files集合,在通过文件输入字段选择了一或多个文件时,files集合中将包含一组File对象,每个File对象对应着一个文件。每个File对象都有下列只读属性

  • name:本地文件系统中的文件名
  • size:文件的字节大小
  • type:字符串,文件的MIME类型
  • lastModifiedDate:字符串,文件上一次被修改的时间(只有Chrome实现了该属性)
var filesList = document.getElementById("files-list");
filesList.addEventListener("change",function(event){
    var files = event.files,   //获取files集合
        i = 0,
        len = files.length;
    while(i < len){
        console.log(files[i].name + ',' + files[i].type + ',' +files[i].size);
        i++;
    }
},false);

FileReader类型

FileReader类型实现的是一种异步文件读取机制。可以将FileReader想象成XMLHttpRequest,区别只是它读取的是文件系统,而不是远程服务器。更多信息及使用例子见 https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader
https://blog.youkuaiyun.com/zjw_python/article/details/78993654

其提供如下几个方法:

  • readAsText(file,encoding):以纯文本形式读取文件,将读取到的文本保存在result属性中,第二个用于指定编码类型,可选
  • readAsDataURL(file):读取文件并将文件以数据URL的形式保存在result属性中
  • readAsBinaryString(file):读取文件并将一个字符串保存在result属性中,字符串中每个字符表示一字节
  • readAsArrayBuffer(file):读取文件并将一个包含文件内容的ArrayBuffer保存在result属性中

提供了几个事件,最有用的包括

  • process:读取过程中不断触发,event对象具有lengthComputable,loaded和total属性,可用于显示读取文件进度
  • error:读取发生错误时触发,错误信息保存在FileReader对象的error属性中,error属性是一个对象,其具有code属性,1表示未找到文件,2表示安全性错误,3表示读取中断,4表示文件不可读,5表示编码错误
  • load:文件读取完毕则触发,发生错误则不触发
  • loadend:读取完毕或读取发生错误中断,就会触发

读取部分文件内容可以使用slice()方法(旧版本浏览器,可能会有不同的前缀,例如mozSlice()),该方法接受两个参数:起始字节的索引及要读取的字节数,返回一个Blob实例。Blob是File类型的父类型,可以对它进行读取

var files = event.files,
    reader = new FileReader(),
    blob = files[0].slice(0,32); //返回包含文件32b内容的blob实例

if (blob){
    reader.readAsText(blob);   //读取文件32b的内容
}

对象URL

对象URL也被称为blob URL,指的是引用保存在File或Blob中数据的URL。

要创建对象URL,可以使用window.URL.createObjectURL()方法,并传入File或Blob对象,返回值是一个URL字符串,指向内存的地址。

var files = event.files,
    reader = new FileReader(),
    url = window.URL.createObjectURL(files[0]); //返回URL

if (url){
    myDiv = doucment.getElementById("mydiv");
    myDiv.innerHTML = "<img src=\"" + url + "\">";  //显示图片
}

如果不需要相应的数据,可以将对象URL传给window.URL.revokeObjectURL()释放内存

window.URL.revokeObjectURL(url);

读取拖放的文件

除了图片和链接,从桌面把文件拖放到浏览器中也会触发drop事件。可以在event.dataTransfer.files中读取到被放置的文件,此时其是一个File对象。可以显示基本的文件信息,还能结合XMLHttpRequest实现拖放文件上传

var files = event.dataTransferfiles,   //获取files集合
    i = 0,
    len = files.length;

while(i < len){
    console.log(files[i].name + ',' + files[i].type + ',' +files[i].size);
    i++;
}

使用XHR上传文件

通过File API能够访问到文件内容 ,利用XHR就可以直接把文件上传到服务器。除了将文件内容放在send()方法中,利用POST请求上传文件外,还可以使用FormData类型,传入File对象,再上传

FormData类型介绍:https://blog.youkuaiyun.com/zjw_python/article/details/79985706

...
data = new FormData();
files = event.dataTransfer.files;  //获取drop事件中的文件

while (i < files.length){
    data.append("file"+i,files[i]);
}

xhr = new XMLHttpRequest();
xhr.open("post","load.php",true);
xhr.send(data);

Web计时

Web Timing API用于度量页面加载过程中各个阶段的时间值,从而全面了解页面在被加载过程中都经历了哪些阶段,而哪些阶段可能是影响性能的瓶颈。更多内容见:https://www.w3.org/TR/navigation-timing/

window.performance对象是WEB计时的核心,其具有两个属性navigation和timing,这两者都是对象。前者包含着与页面导航有关的属性(例如页面是第一次加载的,还是重载的,还是前进后退按钮打开的)。而后者则具有很多表示页面加载各个过程时间戳的属性。
这里写图片描述

可以通过这些时间戳的计算,来显示某个阶段的所用时间值,例如计算页面加载完成所需要的总时间

var perfData = window.performance.timing; 
var pageLoadTime = perfData.loadEventEnd - perfData.navigationStart;

Web Worker

Web Worker使Javascript在后台运行,解决了长时间运行Javascript进程导致浏览器冻结用户界面的问题。 Web worker中它所执行的 js 代码完全在另一个作用域中,其不能访问页面的DOM,也不能使用window对象的默认方法和属性,但是某些功能,例如XMLHttpRequest仍然可以使用,具有有哪些功能支持,见:https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Functions_and_classes_available_to_workers

首先创建一个worker对象,并传入要执行的Javascript文件名

//页面
var worker = new Workder("example.js");

接着,使用postMessage()方法将要处理的数据发送给worker,内容可以是任何能够被序列化的值,因此包括任意对象数据

//页面
worker.postMessage({name1:"value1",name2:"value2"});

最后,指定message事件用于接受worker处理完成后的数据

//页面
worker.onmessage = function(event){
    var data = event.data;
    // 继续操作处理后的数据
};

worker.onerror = function(event){  //处理worker执行中出现的错误
    console.log(event.filename + evnet.lineno + event.message);
};

传入的example.js文件

//example.js
self .onmessage = function(evnet){  //此处的self对象引用的是worker执行环境中的worker对象
                                     //并不是window对象,也不是页面中创建的worker对象
    var data = event.data   //接受页面传来的数据
    //处理数据
    self.postMessage(data);  //将处理过后的数据传回页面
}

停止worker工作,有两种方法,worker停止后,后续所有过程都不会再发生

//页面中停止worker
worker.terminate();
//Worker环境中停止worker
self.close();

可以使用importScripts()在web worker中添加其他脚本

//web worker中
importScripts("file1.js","files2.js");

Share worker

上述介绍的web worker是专有的,一个专用worker仅仅能被生成它的脚本所使用。而Share worker可以被多个脚本使用——即使这些脚本正在被不同的window、iframe或者worker访问。如果共享worker被多个浏览上下文调用,所有这些浏览上下文必须属于同源(相同的协议,主机和端口号)。 SharedWorker 提供了能力能够让不同标签中页面共享的同一个 Worker 脚本线程

创建Share worker对象

//页面
var myWorker = new SharedWorker('worker.js');

一个非常大的区别在于,与一个共享worker通信必须通过端口对象——一个确切的打开的端口供脚本与worker通信,打开端口有两种方法:使用onmessage事件处理函数或者start()方法。start()方法的调用只在一种情况下需要,那就是消息事件被addEventListener()方法使用。

在使用start()方法打开端口连接时,如果父级线程和worker线程需要双向通信,那么它们都需要调用start()方法

//页面
myWorker.port.start();  // 父级线程中的调用
//web worker中
port.start(); // worker线程中的调用, 假设port变量代表一个端口

发送数据

myWorker.port.postMessage(data);

接收处理后的数据

//页面
myWorker.port.onmessage = function(event) {
    data = event.data
    console.log('Message received from worker');
};

worker.js中处理数据,首先,当一个端口连接被创建时(例如:在父级线程中,设置onmessage事件处理函数,或者显式调用start()方法时),使用onconnect事件处理函数来执行代码。使用事件的ports属性来获取端口并存储在变量中。

//web worker中
onconnect = function(e) {
  var port = e.ports[0];  //获取指定端口

  port.onmessage = function(e) {  //对指定端口发送处理后的数据
      var workerResult = 'Result: ' + (e.data[0] * e.data[1]);
      port.postMessage(workerResult);
  };
};
HTML5 FileReader API:本地文件处理的奥秘 本章节详细介绍了HTML5中FileReader API的使用方法,它使得网页能够读取用户的本地文件系统中的文件。通过API,开发者可以在网页上实现文件选择、预览和上传等交互功能,极大地扩展了网页应用的能力。文章通过实例代码演示了如何读取本地图片文件,并展示了如何通过AJAX将文件内容上传到服务器。同时,提醒开发者在使用本地文件功能时注意安全性,并对浏览器兼容性进行充分测试。 阅读详情

相关推荐

NGSIM数据集字段解析:从车辆轨迹到交通行为分析

本文深度解析NGSIM数据集的核心字段及其在交通行为分析中的应用。详细解读了车辆时空定位、状态属性及交互关系等关键字段,并通过高速路“幽灵堵车”和城市路口左转行为两个实战案例,展示了如何利用该数据集进行微观交通行为建模与驾驶特征提取,为交通流研究和自动驾驶算法测试提供数据基础。

weixin_29172963的博客 147

requestAnimationFrame

requestAnimationFrame

amiaoyaofeixiang的博客 2074

用PyTorch和snnTorch库5分钟搞定一个脉冲神经网络(SNN)手写数字识别Demo

本文详细介绍了如何使用PyTorch和snnTorch库快速搭建一个脉冲神经网络(SNN)手写数字识别Demo。通过模拟生物神经元的脉冲发放机制,SNN在低功耗场景中展现出独特优势。文章涵盖环境配置、数据预处理、模型构建、训练评估全流程,并提供了性能优化技巧和常见问题解决方案,帮助开发者在5分钟内实现高效的SNN应用。

weixin_29300931的博客 392

window.requestAnimationFrame强大的前端动画神器

今天介绍一个功能强大的api—window.requestAnimationFrame,它既可以实现如丝般顺滑的动画,又能充当性能优化的利器,还能代替setTimeout,setInterval等定时器。自从学会了requestAnimationFrame,我已经不会拼写setInterval啦… 背景 动画的实现与浏览器显示 在讲具体功能和api使用方法之前,我们先来大体聊一下api的背景和原理。 在各类影视节目横行的今天,大家应该都对电影或是动画的实现有一定了解,最开始的动画是工作人员,一张图一张图画出

yun_master的博客 4802

库存管理系统项目部署方案(基于jdk17)

不需要安装到服务器,运维本地安装就行,主要是用来编译前端代码的。构建完成后将dist文件夹复制到服务器内。

程序员诚哥 6373

OpenClaw用户必看:每天0成本使用OpenClaw!NVIDIA NIM免费大模型接入教程

🚀 OpenClaw接入NVIDIA NIM免费API!glm5、minimax-m2.5等大量模型任选,0成本升级AI助手!💰

XiaoqiangClub的博客 5579

requestAnimationFrame请求动画帧

requestAnimationFrame 请求动画帧

zhang_zan 3315

Android系统解决-授予管理所有文件的权限问题

Android版本一直在加,Android9/Android10/Android11/Android12/Android13/Android14/Android15 , 客户app 也在不断适配,但是存在特别是定制产品中,客户不愿意适配,啥问题都让系统解决,绕过一定机制、实现。这里说的就是一个常见的常见需求:Android13 上面,客户要求默认授予管理所有文件的权限,如下:问题是机器重启后这个权限仍需要重新打开才行,那就是每次开机使用某些功能前都需要授权一次。是的ADB对应命令。

十年饮冰,难凉热血 2540

Web API 基础 (Web Workers API)

Web API 基础 (Web Workers API)

chinusyan的专栏 772

【光伏风电功率预测】基于 ICEEMDAN + MSCNN-BiGRU-Attention 的并行预测模型

本文提出一种基于ICEEMDAN分解与多尺度深度学习的光伏/风电功率并行预测框架。针对多能源、多时间尺度、强非平稳特性带来的建模挑战,该模型首先通过改进的ICEEMDAN算法将原始功率序列分解为不同频段的IMF分量;随后为每个IMF构建包含多尺度CNN、双向GRU和注意力机制的子模型,实现局部特征提取与时序依赖建模;最后通过并行预测与重构获得最终功率输出。实验表明,该方法能有效解决模式混叠问题,提升预测精度,并支持光伏/风电的独立或联合预测部署,适用于风光联合调度等工程场景。

专注AI大模型,软件混淆,授权 155

【OpenCV】第二十四章: 图像特征匹配:暴力特征匹配算法、FLANN特征匹配算法

参数match就是匹配器的匹配结果;参数crossCheck表示交叉检查,意思就是用第一组中的每个描述子和第二组的所有描述子进行匹配完后,再用第二组中的每个描述子和第一组的所有描述子进行匹配,这两步做完后,两步同时找到的相同的匹配对儿就是有效的匹配。方法一:用匹配器的match方法,进行特征匹配:match = bf.match(des1, des2),就是对两幅图的描述子进行计算,返回匹配的结果。匹配的时候是计算两个描述子之间的相似度,然后返回相似度最高的一对儿匹配点,也就是最终的匹配结果。

因为热爱所以坚持 5061

web前端关于 requestAnimationFrame() 学习笔记

三、requestAnimationFrame()类似 setInterval() 改变动画时间间隔。//requestAnimationFrame效果。

2401_83620927的博客 315

万字长文带你由浅入深夯实ARM汇编基础——汇编指令及寻址方式最全梳理(附示例)!

见到汇编就害怕?读完这篇,扫除汇编拦路虎!!(示例丰富,可做手册,随手查阅!)

车载系统攻城狮 1万+

HTML5之文件操作全过程(FileReader)

第一步,获取文件 前端中,获取文件必须使用input标签。而获取到这个文件,必须要用代码的方式,体现出来,让你能用代码操作它。这里主要是使用input标签的onchange事件。 <input id='file' type='file' /> var file = document.getELementById('file'); file.onchange = function(e)...

yiyueqinghui的博客 2328

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

HTML5之FileReader的使用

HTML5定义了FileReader作为文件API的重要成员用于读取文件,根据W3C的定义,FileReader接口提供了读取文件的方法和包含读取结果的事件模型。 FileReader的使用方式非常简单,可以按照如下步骤创建FileReader对象并调用其方法: 1.检测浏览器对FileReader的支持 if(window.FileReader) { var fr =

骆昊的技术专栏 14万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

HTML5 用FileReader对象读取文本

FileReader对象可以用来读取File对象所包含的文件内容。

Hillbox 760

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

网站开发进阶(三十二)HTML5之FileReader的使用_html5 filereader

不难发现这个检测是基于正则表达式的,因此可以进行各种复杂的匹配,非常有用。如果要限定上传文件的类型,可以通过文件选择器获取文件对象并通过。如果要增加一个进度条,可以使用。标签,通过下面的代码实现。属性来检查文件类型。

2401_84418883的博客 176

html5提供的FileReader是一种异步文件读取文件中的数据

触发error事件时,相关信息保存在FileReader对象的error属性中,这个属性将保存一个对象,此对象只有一个属性code,即错误码。1表示未找到文件,2表示安全性错误,3表示读取中断,4表示文件不可读,5表示编码错误。readAsText可按指定编码方式读取文件,但读取文件的单位是字符,故对于文本文件,只要按规定的编码方式读取即可;console.log("加载中", `${(readRes.loaded / readRes.total).toFixed(2)*100}/100`)

书中自有妍如玉的博客 1410

FileReader()读取文件、图片上传预览

本文详细介绍了HTML5 FileReader API的使用方法,重点讲解了图片上传预览功能的实现。主要内容包括:FileReader API的核心特性(异步读取、多种数据格式支持)和浏览器兼容性;基础使用方法(创建实例、四种读取方法、事件处理);完整的图片上传预览实现代码(支持拖放、多文件选择、预览和删除);高级功能如图片压缩、进度显示和分片读取;以及常见问题的解决方案。通过本文,开发者可以掌握如何利用FileReader API构建功能完善、用户体验良好的文件上传组件。

油墨香^-^的博客 3671

js 每日定时任务

js 每日定时任务

caperxi的博客 1313

html 5 FileReader

Blob Blob对象表示一个不可变、原始数据的类文件对象。它的数据可以按文本或二进制的格式进行读取,也可以转换成 ReadableStream来用于数据操作。 要从其他非Blob对象和数据构造一个Blob,使用 Blob()构造函数。要创建一个 Blob数据的子集Blob,使用 slice()方法。 Blob 构造函数:Blob(blobParts[, options]) Blob 属性 属性名 描述 size B...

weixin_42754922的博客 692

HTML5学习笔记——FileReader

title: HTML5之FileReader学习笔记 date: 2019-04-29 17:00:05 tags: 我们在实现文件上传的时候,一般会使用input标签,把input的type类型设置为file,这样就可以打开文件窗口选择需要上传的文件, 点击按钮,上传文件后文件有关的信息可以在input.files这个数组中取得,主要包括: 1)name: 文件名; 2)size:文件的大小...

ass_ace 506

backgroundworker 在执行dowork事件时该如何取消_requestAnimationFrame 执行机制探索

1.什么是 requestAnimationFramewindow.requestAnimationFrame()告诉浏览器——你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。该方法需要传入一个回调函数作为参数,该回调函数会在浏览器下一次重绘之前执行。MDN定义:https://developer.mozilla.org/zh-CN/docs/Web/API...

weixin_42715262的博客 830

html5 filereader对象读取本地文件、图像

在html5之前在本地上传图片后预览的方法是,以前我们通常的做法是将选择的图片文件通过ajax上传至后端服务器,后端对其进行存储,再将图片的URL返回到前端,前端通过这个URL来显示图片。 而HTML5的FileReader接口支持本地预览,FileReader接口主要是将文件读入内存,并提供相应的方法,来读取文件中的数据,当然就能显示本地图片不需上传了。目前高级浏览器实现了FileReader...

qq_26702033的博客 7064
上一篇: Javascript学习笔记20 代码优化技巧
下一篇: Flex 弹性盒子布局
PAT-python-zjw
博客等级 码龄10年 381粉丝 408原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值