Appearance
HTML5新增API
HTML5不仅引入了新的语义化标签,还提供了一系列强大的API,极大地扩展了Web应用的功能。
本地存储API
localStorage
localStorage用于在浏览器中持久存储数据,数据不会过期。
javascript
// 存储数据
localStorage.setItem('username', '张三');
localStorage.setItem('preferences', JSON.stringify({theme: 'dark', lang: 'zh'}));
// 读取数据
const username = localStorage.getItem('username');
const preferences = JSON.parse(localStorage.getItem('preferences'));
// 删除数据
localStorage.removeItem('username');
// 清空所有数据
localStorage.clear();
sessionStorage
sessionStorage与localStorage类似,但数据仅在当前会话期间有效。
javascript
// 存储数据
sessionStorage.setItem('tempData', '临时数据');
// 读取数据
const tempData = sessionStorage.getItem('tempData');
Web Storage事件
当存储数据发生变化时触发:
javascript
window.addEventListener('storage', function(e) {
console.log('存储变化:', e.key, e.oldValue, e.newValue);
});
地理定位API (Geolocation)
用于获取用户的地理位置信息。
javascript
// 检查浏览器支持
if (navigator.geolocation) {
// 获取当前位置
navigator.geolocation.getCurrentPosition(
function(position) {
const latitude = position.coords.latitude;
const longitude = position.coords.longitude;
console.log(`纬度: ${latitude}, 经度: ${longitude}`);
},
function(error) {
console.error('获取位置失败:', error.message);
}
);
} else {
console.log('浏览器不支持地理定位');
}
// 监听位置变化
const watchId = navigator.geolocation.watchPosition(
function(position) {
console.log('位置更新:', position.coords.latitude, position.coords.longitude);
},
function(error) {
console.error('位置监听错误:', error.message);
},
{
enableHighAccuracy: true,
timeout: 5000,
maximumAge: 0
}
);
// 停止监听
// navigator.geolocation.clearWatch(watchId);
Canvas API
用于在网页上绘制图形。
html
<canvas id="myCanvas" width="400" height="200"></canvas>
<script>
const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');
// 绘制矩形
ctx.fillStyle = '#FF0000';
ctx.fillRect(10, 10, 100, 80);
// 绘制圆形
ctx.beginPath();
ctx.arc(200, 50, 40, 0, 2 * Math.PI);
ctx.fillStyle = '#00FF00';
ctx.fill();
// 绘制文本
ctx.font = '20px Arial';
ctx.fillStyle = '#0000FF';
ctx.fillText('Hello Canvas', 10, 150);
// 绘制线条
ctx.beginPath();
ctx.moveTo(300, 20);
ctx.lineTo(350, 80);
ctx.strokeStyle = '#FF00FF';
ctx.lineWidth = 2;
ctx.stroke();
</script>
拖放API (Drag and Drop)
实现元素的拖放功能。
html
<div id="draggable" draggable="true" style="width: 100px; height: 100px; background: red;">
拖我
</div>
<div id="dropzone" style="width: 200px; height: 200px; background: lightblue; margin-top: 20px;">
放置区域
</div>
<script>
const draggable = document.getElementById('draggable');
const dropzone = document.getElementById('dropzone');
draggable.addEventListener('dragstart', function(e) {
e.dataTransfer.setData('text/plain', e.target.id);
});
dropzone.addEventListener('dragover', function(e) {
e.preventDefault(); // 必须调用以允许放置
});
dropzone.addEventListener('drop', function(e) {
e.preventDefault();
const data = e.dataTransfer.getData('text/plain');
const element = document.getElementById(data);
dropzone.appendChild(element);
});
</script>
文件API
处理用户选择的文件。
html
<input type="file" id="fileInput" multiple accept="image/*">
<div id="preview"></div>
<script>
const fileInput = document.getElementById('fileInput');
const preview = document.getElementById('preview');
fileInput.addEventListener('change', function(e) {
const files = e.target.files;
for (let i = 0; i < files.length; i++) {
const file = files[i];
// 显示文件信息
console.log('文件名:', file.name);
console.log('大小:', file.size);
console.log('类型:', file.type);
// 使用FileReader读取文件
const reader = new FileReader();
reader.onload = function(e) {
if (file.type.startsWith('image/')) {
const img = document.createElement('img');
img.src = e.target.result;
img.style.maxWidth = '200px';
preview.appendChild(img);
}
};
reader.readAsDataURL(file);
}
});
</script>
Web Workers
在后台线程中运行JavaScript,不阻塞UI。
javascript
// main.js
const worker = new Worker('worker.js');
worker.postMessage('Hello Worker!');
worker.onmessage = function(e) {
console.log('主线程收到:', e.data);
};
// worker.js
self.onmessage = function(e) {
console.log('Worker收到:', e.data);
// 执行耗时任务
let result = 0;
for (let i = 0; i < 1000000000; i++) {
result += i;
}
self.postMessage('计算完成: ' + result);
};
WebSocket API
实现全双工通信。
javascript
// 创建WebSocket连接
const socket = new WebSocket('ws://localhost:8080');
socket.addEventListener('open', function(event) {
console.log('连接已建立');
socket.send('Hello Server!');
});
socket.addEventListener('message', function(event) {
console.log('收到消息:', event.data);
});
socket.addEventListener('error', function(event) {
console.error('WebSocket错误:', event);
});
socket.addEventListener('close', function(event) {
console.log('连接已关闭');
});
历史记录API (History API)
操作浏览器历史记录。
javascript
// 添加历史记录
history.pushState({page: 1}, '标题', '/page1');
// 替换当前历史记录
history.replaceState({page: 2}, '标题', '/page2');
// 监听历史记录变化
window.addEventListener('popstate', function(event) {
console.log('状态变化:', event.state);
});
全屏API (Fullscreen API)
控制元素的全屏显示。
javascript
const element = document.getElementById('myElement');
// 请求全屏
function requestFullscreen() {
if (element.requestFullscreen) {
element.requestFullscreen();
} else if (element.mozRequestFullScreen) { // Firefox
element.mozRequestFullScreen();
} else if (element.webkitRequestFullscreen) { // Chrome, Safari
element.webkitRequestFullscreen();
}
}
// 退出全屏
function exitFullscreen() {
if (document.exitFullscreen) {
document.exitFullscreen();
} else if (document.mozCancelFullScreen) { // Firefox
document.mozCancelFullScreen();
} else if (document.webkitExitFullscreen) { // Chrome, Safari
document.webkitExitFullscreen();
}
}
// 监听全屏变化
document.addEventListener('fullscreenchange', function() {
if (document.fullscreenElement) {
console.log('进入全屏');
} else {
console.log('退出全屏');
}
});
通知API (Notification API)
显示系统通知。
javascript
// 请求通知权限
Notification.requestPermission().then(function(permission) {
if (permission === 'granted') {
// 显示通知
const notification = new Notification('标题', {
body: '通知内容',
icon: 'icon.png'
});
// 监听通知事件
notification.onclick = function() {
console.log('通知被点击');
};
}
});
音频/视频API
控制媒体元素。
html
<video id="myVideo" controls>
<source src="video.mp4" type="video/mp4">
</video>
<script>
const video = document.getElementById('myVideo');
// 播放控制
video.play();
video.pause();
// 监听事件
video.addEventListener('ended', function() {
console.log('视频播放结束');
});
video.addEventListener('timeupdate', function() {
console.log('当前播放时间:', video.currentTime);
});
// 设置播放时间
video.currentTime = 30; // 跳转到30秒
// 音量控制
video.volume = 0.5; // 设置音量为50%
</script>
性能API (Performance API)
测量页面性能。
javascript
// 获取页面加载时间
const perfData = performance.getEntriesByType('navigation')[0];
console.log('页面加载时间:', perfData.loadEventEnd - perfData.loadEventStart);
// 测量特定操作的时间
const start = performance.now();
// 执行某些操作
const end = performance.now();
console.log('操作耗时:', end - start, '毫秒');
// 监听性能条目
const observer = new PerformanceObserver(function(list) {
for (const entry of list.getEntries()) {
console.log(entry.name, entry.duration);
}
});
observer.observe({entryTypes: ['measure', 'navigation']});
使用场景总结
HTML5 API提供了丰富的功能,适用于各种Web应用:
- 本地存储:用户偏好设置、缓存数据
- 地理定位:位置相关服务
- Canvas:图形绘制、游戏开发
- 拖放:文件上传、界面交互
- 文件API:图片预览、文件处理
- Web Workers:计算密集型任务
- WebSocket:实时通信
- 历史记录API:单页应用导航
- 全屏API:媒体播放器、游戏
- 通知API:消息提醒
这些API使Web应用能够提供接近原生应用的体验,极大地扩展了Web平台的能力。