前端学习笔记专栏区别于官网中全面的知识讲解,主要记录学习技术栈时对于重点内容的提炼,便于对技术栈知识的快速回顾以及使用
<canvas id="myCanvas" width="200" height="100"></canvas>
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
ctx.moveTo(0,0); // 定义开始坐标
ctx.lineTo(200,100); // 定义结束坐标
ctx.stroke(); // 绘制线条
ctx.beginPath();
ctx.arc(95, 50, 40, 0, 2*Math.PI); // (95, 50)为圆心,40为半径,(0,2*Math.PI)对应绘制周长
ctx.stroke();
ctx.fillStyle
ctx.font
ctx.fillRect(x, y, width, height)
ctx.fillText(text, x, y)
ctx.strokeText(text, x, y)
ctx.drawImage(img, x, y);
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));
}
<div id="div1" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<img id="drag1" src="/images/logo.png" draggable="true" ondragstart="drag(event)">
function getLocation(){
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(showPosition,showError);
}
else x.innerHTML="该浏览器不支持定位。";
}
function showPosition(position) {
x.innerHTML="纬度: " + position.coords.latitude +
"
经度: " + 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;
}
}
<video id="video1" width="420">
<source src="mov_bbb.mp4" type="video/mp4">
<source src="mov_bbb.ogg" type="video/ogg">
您的浏览器不支持 HTML5 video 标签。
</video>
<audio controls>
<source src="horse.ogg" type="audio/ogg">
<source src="horse.mp3" type="audio/mpeg">
您的浏览器不支持 audio 元素。
</audio>
// 支持通过js控制DOM元素的play播放、pause方法
function playPause() {
var myVideo = document.getElementById("video1")
if (myVideo.paused) myVideo.play()
else myVideo.pause()
}
:定义文档中的节,比如章节、页眉、页脚或文档中的其他部分
:定义独立的内容
:定义导航链接的部分
:定义页面主区域内容之外的内容(比如侧边栏)
:描述了文档的头部区域,主要用于定义内容的介绍展示区域
:描述了文档的底部区域
:规定独立的流内容(图像、图表、照片、代码等等)
:定义
的标题,应该被置于"figure"的第一个或最后一个子元素的位置将indexedDB封装成第三方库,可以通过类似于localStorage的调用方式使用;内置优雅降级,在不支持indexedDB或web sql时使用localStorage
npm install localforage
import localforage from "localforage";
localforage.config({driver: localforage.INDEXEDDB});
Vue.prototype.$localforage = localforage;
localforage.setItem('key', 'value').then(function)
localforage.setItem('key', 'value', function)
getItem(key, successCallback)
setItem(key, value, successCallback)
removeItem(key, successCallback)
clear(successCallback)
length(successCallback)
key(keyIndex, successCallback)
keys(successCallback)
iterate(iteratorCallback, successCallback)
setDriver(driverName/[driverNames])
localforage.INDEXEDDB
localforage.WEBSQL
localforage.LOCALSTORAGE
config(options)
defineDriver(myCustomDriver)
driver()
ready()
supports(driverName)
createInstance(config)
dropInstance({ name: '', storeName: '' })
使用场景多为需要复杂计算的操作,如大量数据处理等等
// 根据脚本文件创建线程
let worker = new Worker('work.js')
// 向线程传递信息
worker.postMessage('hello')
worker.postMessage({msg: 'hello'})
// Transferable Objects传递二进制数据,仅在单一线程可用
let buffer = new ArrayBuffer(1);
worker.postMessage(buffer, [buffer])
// 接收线程信息
worker.onmessage = function(event) {
console.log(event.data)
worker.postMessage('receive')
}
// 接收线程错误
worker.onerror = function(event) {
console.log(event)
}
// 关闭线程
worker.terminate()
// 加载其他脚本
importScripts('script.js')
// 接收主线程信息
onmessage = function (event) {
let data = e.data
switch (data) {
case 'start':
// 向主线程传递信息
postMessage('worker start')
break
case 'stop':
postMessage('worker stop')
// 内部关闭线程
close()
break;
};
}
// 线程中轮询,判断与缓存是否一致决定是否传递信息
function createWorker(f) {
let blob = new Blob(['(' + f.toString() +')()'])
let url = window.URL.createObjectURL(blob)
let worker = new Worker(url)
return worker
}
let pollingWorker = createWorker(function (e) {
let cache
function compare(new, old) {}
setInterval(function () {
fetch('/my-api-endpoint').then(function (res) {
let data = res.json();
if (!compare(data, cache)) {
cache = data;
self.postMessage(data);
}
})
}, 1000)
})
pollingWorker.onmessage = function () {}
pollingWorker.postMessage('init')
网页自动获取来自服务器的更新,适用于服务器单向高频的数据发送
// 前端开启轮询
const source = new EventSource('/sse');
source.onopen = () => {
console.log('轮询开启');
}
source.onmessage = (res) => {
console.log('获得的数据是:' + res.data );
}
source.onerror = (err) => {
console.log(err);
}
// node.js后端传递信息
const http = require('http')
const fs = require('fs')
const server = http.createServer((req, res) => {
const url = req.url;
if (url === '/') {
const data = fs.readFileSync('./index.html')
res.end(data)
} else if (url === '/sse') {
res.setHeader("Content-type", "text/event-stream")
setInterval(() => {
res.write('data:' + new Date() + '\r\n\r\n')
}, 2000);
}
})
server.listen(3000)
客户端与服务端全双工通信
let ws = new WebSocket("ws://localhost:8080");
// 显示指定收到的二进制数据类型
ws.binaryType = 'blob'
// 判断web socket状态
switch (ws.readyState) {
case WebSocket.CONNECTING:
// do something
break;
case WebSocket.OPEN:
// do something
break;
case WebSocket.CLOSING:
// do something
break;
case WebSocket.CLOSED:
// do something
break;
default:
// this never happens
break;
}
ws.onopen = function(evt) {
let data = new ArrayBuffer(10000000)
// 发送信息
ws.send(data)
if (ws.bufferedAmount === 0) {
// 发送完毕
} else {
// 发送还没结束
}
};
ws.onmessage = function(evt) {
console.log( "Received Message: " + evt.data)
ws.close()
}
wx.onerror = function(evt) {
console.log("Connection error" + evt)
}
ws.onclose = function(evt) {
console.log("Connection closed" + evt)
}