javascript高级程序设计(六)——2026.9.5

动画与canvas图形

requestAnimationFrame/cancelAnimationFrame

控制动画执行的方法。在动画完成或组件销毁时必须调用cancelAnimationFrame取消,否则容易内存泄露。

canvas

在开始和结束标签之间的内容是后备数据,会在浏览器不支持 <canvas> 元素时显示.

arduino 复制代码
<canvas id="drawing" width="200" height="200">A drawing of something.</canvas>

webgl上下文

判断上下文

javascript 复制代码
let drawing = document.getElementById("drawing");
// 确保浏览器支持<canvas>

if (drawing.getContext) {
    try {
        gl = drawing.getContext("webgl");
    } catch (ex) {
    // 什么也不做
    }
    if (gl) {
    // 使用 WebGL
    } else {
        alert("WebGL context could not be created.");
    }
}

File api与Blob api

File api

  • file对象
    • name------本地系统中的文件名
    • size------文件大小
    • type------MINE类型
    • lastModifiedDate------最后更改时间
    • slice(start,end)------返回一个Blob实例对象
  • FileReader类型------异步获取方式
    • readAsText(file,encoding)------从文件中读取纯文本内容并保存到result属性中
    • readAsDateURL(file)------读取文件并将内容的数据URI保存在result属性中
    • readAsBinaryString(file)------以每个支付的二进制数据保存
    • readAsArrayBuffer(file)------以ArrayBuffer形式保存在result属性中
    • abort()------中止读取操作
ini 复制代码
let reader= new FileReader();
if (/image/.test(files[0].type)) {
    reader.readAsDataURL(files[0]);
    type = "image";
} else {
    reader.readAsText(files[0]);
    type = "text";
}
reader.onerror=function(){};
reader.onprogress=function(){};
reader.onload=function(){};
reader.onabort=function(){};
  • FileReaderSync类型------同步获取文件方法,但只能在worker线程中使用。

Blob对象

  • 实例属性
    • size------返回Blob对象包含的数据大小(以字节为单位)
    • type------返回一个字符串,表面该Blob对象所包含的MINE类型
  • 实例方法
    • arrayBuffer()------返回一个Promise,会兑现一个包含Blob全部内容的ArrayBuffer
    • bytes()------返回一个Promise,会兑现一个包含Blob全部内容的Unit8Array
    • slice(start,end)------返回一个新Blob对象(从start到end),对切片上传大文件时非常有用。
    • stream()------返回一个流,用于流式读取Blob内容
    • text()------一个Promise的字符串内容

对象URL和Blob

将file对象利用window.URL.createObjectURL()转换为blob URL(即对象URL)。

ini 复制代码
/// input type为"file"时
fileList.addEventListener("change",(event)=>{
    let info="",
    output=document.getElementById("output"),
    files=event.target.files,
    reader=new FileReader(),
    url=window.URL.createObjectURL(files[0]);
    if(url){
        if(/image/.test(files[0].type)){
            output.innerHTML=`<img src="${url}">`;
        }else{
            ...
        }
    } else {
    
    }
})

拖拽方法

  • drop------放下,拖拽后松开鼠标左键后触发
  • dragenter------鼠标拖动进入动作
  • dragover------鼠标推动悬停或移动
  • 其中drop要生效必须要将dragover的默认行为阻止。
  • 事件的目标是event.dataTransfer.files;

Notifications API(通知行为)

请求通知权限

Notification.requestPermission().then((permission)=>{})

  • granted------明确授权
  • denied------拒绝授权

显示、隐藏通知

  • 通知主体
arduino 复制代码
new Notification("title",{
 body: 'yes',
 image: "",
 vibrate:true // 是否震动
})
  • 显示与关闭
ini 复制代码
const n = new Notification('I will close in 1000ms');
setTimeout(() => n.close(), 1000);
  • 生命周期回调

    • onshow------通知显示时触发
    • onclick------通知被点击时触发
    • onclose------通知消失或通过close()关闭时触发
    • onerror------发生错误时触发
相关推荐
狂潮lister6 小时前
狂潮·元理论 | 第5篇:想为你的AI培养个性吗!哈哈哈……(6个测试,教你幻觉的正确玩法)
前端·人工智能
高晶6 小时前
2A3 单端甲类功放从零制作全攻略:电路设计、焊接调试到煲机维护一站式指南
前端·设计模式
deli0076 小时前
塔防游戏里怪物为什么绕远路?Canvas 实测 A* 寻路 20 波
前端
小万7426 小时前
WHO 心理自助指南深度解析:Step-by-Step 与 Doing What Matters in Times of Stress,用循证协议重构心理韧性
前端
代码猎人6 小时前
前端怎么优化用户体验
前端
deli0076 小时前
批量加水印还在用在线工具?30 张图 Canvas 本地铺满实测
前端
鸿蒙开发6 小时前
扫描 PDF 看得见却搜不到?用 Tesseract.js + PDF.js 生成可搜索 PDF
前端·react.js
小万7426 小时前
ECC(Everything Claude Code)深度解析:把编程 Agent 从“聊天写代码”拉进工程现场的 Harness 系统
前端
用户2145549310156 小时前
VeapAI 自然语言操作实战|第 02 篇:语义层——把系统讲给模型听的四个构件
前端·后端
定栓7 小时前
Webpack迁到Vite第七节(一):全家桶移除 — 配置文件与构建核心
前端·webpack·node.js