IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 前端365(2021-08-28) -> 正文阅读

[网络协议]前端365(2021-08-28)

每天分享看到的知识点!

(1)Web Socket介绍

要创建一个新的 Web Socket, 就要实例化一个WebSocket对象并传入提供连接的URL:

let socket = new WebSocket("ws://www.example.com/server.php")

WebSocket对象没有像xhr一样的readystatechange事件,可以监听状态的变化。而是有与不同状态对应的其他事件。readyState值从0开始

  • WebSocket.OPENING (0): 连接正在建立
  • WebSocket.OPEN (1) : 连接已经建立
  • WebSocket.CLOSING (2) : 连接正在关闭
  • WebSocket.CLOSE (3): 连接已经关闭

socket.close() 可以在任意时间调用,调用close()后,readyState 立即变为 2(连接正在关闭),并在关闭后变为 3 (连接已经关闭)

打开 Web Socket 之后,可以通过连接发送和接受数据。向服务器发送数据,使用 send()方法并传入一个字符串、ArrayBuffer 或 Blob:

let socket = new WebSocket("ws://www.example.com/server.php");

let stringData = "Hello world!";
let arrayBufferData = Unit8Array.from(['f', 'o', '0']);
let blobData = new Blob(['f', '0', '0']);

socket.send(stringData);
socket.send(arrayBufferData.buffer);
socket.send(blobData);

服务器向客户端发消息时,WebSocket会触发message事件

socket.onmessage = function (event) {
	let data = event.data
	// 对数据的一些操作
}

socket的事件监听函数:

  • open: 在连接建立时触发
  • error: 在连接错误时触发。连接无法存续
  • close: 在连接关闭时触发

上面事件中,只有 close 事件的 event对象有额外信息。这个对象有3个额外属性: wasClean、 code、 reason

  • wasClean是一个布尔值,表示连接是否干净的关闭
  • code 是一个来自服务器的数值状态码
  • reason是一个字符串,包含服务器发来的消息

注意: socket 现在还不支持 dom2级事件,所以只能使用dom0 级

(2)Cookie

通常,只要遵守以下大致限制,就不会在浏览器中碰到问题:

  • 不超过300个cookie
  • 每个cookie不超过4096字节
  • 每个域不超过20个cookie
  • 每个域不超过81920字节

每个域能设置的cookie总数也是受限的,但不同浏览器限制不同。例如:

  • 最新版IE 和 Edge限制每个域不超过50 个cookie
  • 最新版 Firefox限制每个域不超过150个cookie
  • 最新版Opera 限制每个域不超过180个cookie
  • Safari和Chrome对每个域的cookie数没有硬性限制

定义cookie管理类:

class CookieUtil {
    static get(name) {
        let cookieName = `${encodeURIComponent(name)}=`,
            cookieStart = document.cookie.indexOf(cookieName),
            cookieValue = null;
            if (cookieStart > -1) {
                let cookieEnd = document.cookie.indexOf(";", cookieStart);
                if (cookieEnd > -1) {
                    cookieEnd = document.cookie.length;
                }
                cookieValue = decodeURIComponent(document.cookie.substring(cookieStart + cookieName.length, cookieEnd))
            }
            return cookieValue
    }
    static set(name, value, expires, path, domain, secure) {
        let cookieText = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`
        if (expires instanceof Date) {
            cookieText += `; expires=${expires.toGMTString()}`;
        }
        if (path) {
            cookieText += `; path=${path}`;
        }
        if (domain) {
            cookieText += `; domain=${domain}`
        }
        if (secure) {
            cookieText += `; secure`
        }
        document.cookie = cookieText
    }
    static unset(name, path, domain, secure) {
        CookieUtil.set(name, '', new Date(0), path, domain, secure)
    }
}

// 设置cookie
CookieUtil.set("name", "zs");
// 读取cookie
CookieUtil.get("name"); // "zs"
// 删除cookie
Cookie.unset("name")

(3) Storage

Storage分sessionStorage 和 localStorage

  • sessionStoragee为会话存储,关闭当前会话则消失
  • localStorage 为本地存储,默认一直在, 需要主动去清除
    这两种存储都有 setItem, getItem, removeItem方法
    也可用对象方式进行赋值
sessionStorage.setitem("name", "zs");
let name = sessionStorage.getItem("name"); // "zs"
// storage 的value值会 默认转字符串
sessionStorage.age = 18
sessionStorage.age  // "18" 

遍历sessionStorage所有值

// 可以用for循环遍历
for (let i = 0, len = sessionStorage.length; i < len; i++) {
	let key = sessionStorage.key(i)
	let value = sessionStorage.getItem(key)
	alert(`${key}=${value}`)
}

// 也可以for...in 遍历
 for (let key in sessionStorage) {
 	// 不要去遍历原型属性
    if (sessionStorage.hasOwnProperty(key)) { 
 		let value = sessionStorage.getItem(key)
 		alert(`${key}=${value}`)
 	}
}

从sessionStorage中删除数据

// 使用 delete 删除值
delete SessionStorage.name
// 使用方法删除值
SessionStorage.removeItem("name")

每当Storage对象发生变化时,都会在文档中触发storage事件

  • 使用属性或 setItem()设置值时
  • 使用delete 或removeItem()删除值时
  • 使用 clear() 时

以上三种都可触发storage事件

  • domain : 存储变化对应的域
  • key: 被设置或删除的键
  • newValue: 键被设置的新值, 被删除为null
  • oldValue: 键变化之前的值

当同源页面的某个页面修改了localStorage,其余的同源页面只要注册了storage事件,就会触发

window.addEventListener('storage', (event) => {
	alert(`Storage changed for ${event.domain}`)
})

对于 sessionStorage 和 localStorage 上的任何更改都会触发 storage 事件,但 storage 事件不会区分这两者

(4) UMD 模块定义

下面是只包含一个依赖的 UMD 模块定义的示例(来源为 GitHub 上的 UMD 仓库):

(function (root, factory) {
    if (typeof define === 'function' && define.amd) {
        // AMD。 注册为匿名模块
        define(['moduleB'], factory);
    } else if (typeof module === 'object' && module.exports) {
        // Node。 不支持严格 CommonJS
        // 但可以在 Node 这样支持 module.exports 的
        // 类 CommonJS 环境下使用
        module.exports = factory(require('moduleB'))
    } else {
        // 浏览器全局上下文 (root 是 window)
        root.returnExports = factory(root.moduleB)
    }
})(this, function(moduleB) {
    // 以某种方式使用 moduleB
    // 将返回值作为模块的导出
    // 这个例子返回了一个对象
    // 但是模块也可以返回函数作为导出值
    return {}
})
  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-08-29 09:42:12  更:2021-08-29 09:42:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 21:25:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码