js基础-客户端存储(Cookie、Storage、IndexedDB)

最新推荐文章于 2024-10-29 09:56:30 发布
front_end_fan 最新推荐文章于 2024-10-29 09:56:30 发布
阅读量1.2k 收藏
点赞数 1
CC 4.0 BY-SA版权
分类专栏: javascript 文章标签: javascript cookie 数据存储
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.youkuaiyun.com/qq_39198420/article/details/78058932
javascript 同时被 2 个专栏收录
74 篇文章
订阅专栏
canvas
4 篇文章
订阅专栏
本文介绍了Web客户端存储技术,包括cookie的基本使用及属性设置,localStorage和sessionStorage的特点与API使用,以及IndexedDB数据库的创建和操作。

离线应用与客户端存储

Web应用允许使用浏览器提供的API实现将数据存储到用户的电脑上。

1、cookie

cookie是指Web浏览器存储的少量数据,每个Cookie的大小一般不能超过4KB。

Cookie保存以下几方面的信息。

  • Cookie的名字
  • Cookie的值
  • 到期时间
  • 所属域名(默认是当前域名)
  • 生效的路径(默认是当前网址)

我们可以通过特殊的格式的字符串形式来读写Document对象的cookie属性。

document.cookie  //读取当前页面的所有cookie 

我们可以通过检查navigator.cookieEnabled属性来检测当前cookie是否启用。若值为true,表示cookie是启用的。

1.1 cookie属性:有效期和作用域

cookie默认的有效期很短暂,它只能持续在Web浏览器的会话期间,一旦用户关闭浏览器,cookie保存的数据就会丢失。

注意:cookie的有效期和sessionStorage的有效期是有区别的:cookie的作用域并不是局限在浏览器的单个窗口中,它的有效期和整个浏览器进程而不是单个浏览器窗口的有效期一致。

cookie的作用域是通过文档源和文档路径来确定的。

1.2 保存cookie

document.cookie属性是可写的,可以通过它为当前网站添加Cookie。

document.cookie = 'user=TG'; 

Cookie的值必须写成key=value的形式。注意,等号两边不能有空格。另外,写入Cookie的时候,必须对分号、逗号和空格进行转义(它们都不允许作为Cookie的值),这可以用encodeURIComponent方法进行编码,读取时再采用decodeURIComponent方法解码。

但是,document.cookie一次只能写入一个Cookie,而且写入并不是覆盖,而是添加。

document.cookie = 'test1=hello'; 
document.cookie = 'test2=world';
document.cookie
// test1=hello; test2=world

如果要延长cookie的有效期,就需要设置mav-age属性来指定cookie的有效期(单位是秒)

document.cookie = 'user=TG;max-age=606024';  //将有效期设置为一天 

1.3 读取cookie

使用JavaScript表达式来读取cookie属性时,其返回的值是一个字符串,该字符串都是由一系列名/值对组成,不同名/值对之间通过“分号和空格”分开,其内容包含了所有作用在当前文档的cookie。

一般情况下,我们会采用split()方法将cookie值中的名/值对都分离出来。当然,如果之前进行了一系列的编码,就需要先解码再分离。

function getCookie(cname) 
{
var name = cname + "=";
var ca = document.cookie.split(';');
for(var i=0; i<ca.length; i++)
{
var c = ca[i].trim();
if (c.indexOf(name)==0)
{
return c.substring(name.length,c.length);
}
}
return "";
}

1.4 其他属性

除了Cookie本身的内容,还有一些可选的属性也是可以写入的,它们都必须以分号开头。

Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure] 

上面的Set-Cookie字段,用分号分隔多个属性:

(1)value属性

value属性是必需的,它是一个键值对,用于指定Cookie的值。

(2)expires属性

expires属性用于指定Cookie过期时间。它的格式采用Date.toUTCString()的格式。

expires=Thu, 01 Jan 1970 00:00:00 GMT 

如果不设置该属性,或者设为null,Cookie只在当前会话(session)有效,浏览器窗口一旦关闭,当前Session结束,该Cookie就会被删除。

浏览器根据本地时间,决定Cookie是否过期,由于本地时间是不精确的,所以没有办法保证Cookie一定会在服务器指定的时间过期。

(3)domain属性

domain属性指定Cookie所在的域名, 比如example.com或.example.com (这种写法将对所有子域名生效)、 subdomain.example.com 。

如果未指定,默认为设定该Cookie的域名。所指定的域名必须是当前发送Cookie的域名的一部分, 比如当前访问的域名是example.com , 就不能将其设为google.com 。只有访问的域名匹配domain属性,Cookie才会发送到服务器。

(4)path属性

path属性用来指定路径,必须是绝对路径(比如/、/mydir),如果未指定,默认为请求该Cookie的网页路径。

只有path属性匹配向服务器发送的路径,Cookie才会发送。这里的匹配不是绝对匹配,而是从根路径开始,只要path属性匹配发送路径的一部分,就可以发送。比如,path属性等于/blog,则发送路径是/blog或者/blogroll,Cookie都会发送。path属性生效的前提是domain属性匹配。

(5)secure

secure属性用来指定Cookie只能在加密协议HTTPS下发送到服务器。

该属性只是一个开关,不需要指定值。如果通信是HTTPS协议,该开关自动打开。

(6)max-age

max-age属性用来指定Cookie有效期,比如60 * 60 * 24 * 365(即一年31536e3秒)。

2.5 cookie的限制

浏览器对Cookie数量的限制,规定不一样。目前,Firefox是每个域名最多设置50个Cookie,而Safari和Chrome没有域名数量的限制。

所有Cookie的累加长度限制为4KB。超过这个长度的Cookie,将被忽略,不会被设置。

由于Cookie可能存在数量限制,有时为了规避限制,可以将cookie设置成下面的形式。

name=a=b&c=d&e=f&g=h 

上面代码实际上是设置了一个Cookie,但是这个Cookie内部使用&符号,设置了多部分的内容。因此,读取这个Cookie的时候,就要自行解析,得到多个键值对。这样就规避了cookie的数量限制。

2、localStorage和sessionStorage

localStorage 和 sessionStorage 这两个属性都代表同一个Storage对象(一个持久化关联数组,数组使用字符串来索引,存储的值都是字符串形式的)。

2.1 存储有效期和作用域

localStorage 和 sessionStorage 的区别在于存储的有效期和作用域的不同。

2.1.1 localStorage

通过 localStorage 存储的数据是永久性的,除非Web应用刻意删除存储的数据或用户通过设置浏览器设置来删除,否则数据将一直保留在用户的电脑里,永不过期。

localStorage 的作用域是限定在文档源(document origin)级别。

同源的文档间共享同样的 localStorage 数据。

2.1.2 sessionStorage

sessionStorage 的作用域同样是限定在文档源中,不过它被限定在窗口中。也就是说,如果同源的文档在不同的浏览器标签页中,那它们互相之间拥有的是各自的 sessionStorage 数据,无法共享。

注意:基于窗口作用域的 sessionStorage 指的窗口只是顶级窗口。如果一个浏览器标签页包含多个 <iframe> 元素,它们包含的文档是同源的,两者之间的sessionStorage是可共享的。

2.2 存储API

我们可以将 localStorage 和 sessionStorage 当做普通的JavaScript对象:通过设置属性来存储字符串值,查询该属性来读取该值。

localStorage.user = 'TG'; 

当然,这两个对象也提供了对应的存储( setItem() )和读取( getItem() )的方法。

localStorage.setItem('user','TG');   //存储一个以“user”的名字存储的数值。

localStorage.getItem('user'); //读取

同样, sessionStorage 也有这两个方法。

sessionStorage.setItem('user','TG'); 
sessiontStorage.getItem('user');

还可以使用 removeItem() 和 clear() 方法来删除。

localStorage.removeItem('user');  //删除名为“user”的数据。 
localStorage.clear(); //删除所有存储的数据

sessionStorage.removeItem('user');
sessionStorage.clear();

遍历存储数据。

for(var i=0; i < localStorage.length; i++){ 
var name = localStorage.key(i); //获取第i对的名字
console.log(localStorage.getItem(name); //获取该对的值
}

其中的 key 方法,根据位置(从0开始)获得键值。

localStorage.key(1); 

2.3 storage事件

当储存的数据发生变化时,会触发storage事件。我们可以指定这个事件的回调函数。

window.addEventListener("storage",onStorageChange); 

回调函数接受一个event对象作为参数。这个event对象的key属性,保存发生变化的键名。

function onStorageChange(e) { 
console.log(e.key);
}

除了key属性,event对象的属性还有三个:

  • oldValue:更新前的值。如果该键为新增加,则这个属性为null。
  • newValue:更新后的值。如果该键被删除,则这个属性为null。
  • url:原始触发storage事件的那个网页的网址。

值得特别注意的是,该事件不在导致数据变化的当前页面触发。如果浏览器同时打开一个域名下面的多个页面,当其中的一个页面改变sessionStorage或localStorage的数据时,其他所有页面的storage事件会被触发,而原始页面并不触发storage事件。可以通过这种机制,实现多个窗口之间的通信。所有浏览器之中,只有IE浏览器除外,它会在所有页面触发storage事件。

3、客户端数据库(IndexedDB)

IndexedDB(对象数据库)可以说是浏览器端数据库,可以被网页脚本程序创建和操作。它允许储存大量数据,提供查找接口,还能建立索引。

在IndexedDB API中,一个数据库就是一个命名对象仓库(object store)的集合,对象存储区存储的是对象。

IndexedDB特点:

  • 键值对存储:在对象仓库中,数据以“键值对”的形式保存,每一个数据都有对应的键名,键名是独一无二的,不能有重复,否则会抛出一个错误。
  • 同域限制:IndexedDB数据库的作用域是限制在包含它们的文档源中,每一个数据库对应创建该数据库的域名,两个同源的Web页面互相之间可以访问对方的数据,但非同源的页面就不行。
  • 支持事务:IndexedDB支持事务,这就是说对数据库的查询和更新都是包含在一个事务(transaction)中,以此来确保这些操作要么是一起成功,要么是一起失败,并且永远不会让数据库出现更新到一半的情况。
  • 异步:IndexedDB的操作不会阻塞浏览器的UI主线程。
  • 储存空间大:IE的储存上限是250MB,Chrome和Opera是剩余空间的某个百分比,Firefox则没有上限。

3.1 检测浏览器是否支持IndexedDB API

if('indexedDB' in window){ 
//支持
}else{
//不支持
}

3.2 访问数据库

要异步访问数据库,就要调用 window 对象 indexedDB 属性的 open() 方法

var request = indexedDB.open(name[,version]) 

indexedDB.open方法可传输人两个参数:name是数据库名称,必填;version是数据库版本,是一个大于0的正整数(0将报错)。

open方法返回一个 IDBRequest 对象 (IDBOpenDBRequest),

注意:如果数据库存在,将打开数据库,否则,则会新建该数据库。如果省略第二个参数,则会自动创建版本为1的该数据库。

当打开数据时,有可能触发4种事件:

success:打开成功。

error:打开失败。

upgradeneeded:第一次打开该数据库,或者数据库版本发生变化。

blocked:上一次的数据库连接还未关闭。

第一次打开数据库时,会先触发upgradeneeded事件,然后触发success事件。

request.onupgradeneeded = function(e){}

request.onsuccess = function(e){
db = e.target.result;
}

回调函数接受一个事件对象event作为参数,它的target.result属性就指向打开的IndexedDB数据库。

3.3 IndexedDB实例对象的方法

3.3.1 createObjectStore()方法

createObjectStore()方法用于创建存放数据的“对象仓库”(object store)。

db.createObjectStore(name[,options]); 

参数说明:

参数name是对象仓库的名字;options是可选参数,用来设置对象仓库的属性,可配置两个属性:keyPath和autoIncrement,分别表示每条记录的键名和是否使用自动递增的整数作为键名,默认为false。

db.createObjectStore('db1', {keyPath: 'user'}); 
db.createObjectStore('db2', {autoIncrement: true});

由于对象仓库的名字具有唯一性(当创建已存在的数据库时,会报错),所以在创建对象仓库时,我们有必要检测对象仓库是否已存在:

db.objectStoreNames.contains(name)

objectStoreNames属性返回一个DOMStringList对象,里面包含了当前数据库所有“对象仓库”的名称。可以使用DOMStringList对象的contains方法,检查数据库是否包含某个“对象仓库”。

3.3.2 transaction方法

创建了数据库,当然要使用它,不过数据库的更新、读取和删除是建立在事务的基础上的,所以我们首先要创建一个事务:

var t = db.transaction(array,type) 

transcation()方法接受两个参数:参数array是一个数组,包含了所要使用的对象仓库,通常是一个;参数type是一个表示操作类型的字符串,目前只有两种类型:readonly(只读)和readwrite(读写)。

t = db.transaction(['db1','readwrite'); 

transaction()方法返回一个事务对象,该对象的objectStore()方法用于获取指定的对象仓库:

var store = t.objectStore('db1'); 

事务对象有三个监听事件:

abort:事务中断。

complete:事务完成。

error:事务出错。

假如事务完成时:

t.oncomplete =function(e){} 

3.3.3 数据操作

下面的方法都是在事件对象上。

(1)add()方法

add()方法用来添加数据

var add = store.add(data,key) 

参数说明:参数data是所要添加的数据;参数key是这条数据对应的键名(key)。

add()方法是异步的,有success和error事件:

add.onsuccess = funciton(e){} 
add.onerror = function(e){}

(2)get()方法

get()方法用来读取数据,它的参数是键名

store.get(key) 

get方法也是异步的,也有success和error事件。

(3)put()方法

put()方法用来更新数据,与add()方法类似:

var update = store.put(data,key) 

(4)delete()方法

delete()方法用来删除数据,它的参数是键名:

var delete = store.delete(key) 

delete方法也是异步的,也有success和error事件。

(5)openCursor()方法

openCursor()方法用来遍历数据:

var cursor = store.openCursor() 

openCursor方法也是异步的,也有success和error事件。

cursor.onsuccess = function(e){ 
var res = e.target.result;
console.log('key',res.key);
console.log('data',res.value);
res.continue()
}

e.target.result属性指向当前数据对象。当前数据对象的key和value分别返回键名和键值(即实际存入的数据)。continue方法将光标移到下一个数据对象,如果当前数据对象已经是最后一个数据了,则光标指向null。

openCursor方法还可以接受第二个参数,表示遍历方向,默认值为next,其他可能的值为prev、nextunique和prevunique。后两个值表示如果遇到重复值,会自动跳过。

3.3.4 createIndex()方法

createIndex()方法用来创建索引:

createIndex(index,name,options) 

createIndex方法接受三个参数,第一个是索引名称,第二个是建立索引的属性名,第三个是参数对象,用来设置索引特性。unique表示索引所在的属性是否有唯一值.

3.3.5 index方法

index()方法用于从对象仓库返回指定的索引。

var index = store.index(index); 
var data = index.get(name)

注意:get方法有可能取回多个数据对象,因为name属性没有唯一值。

4、同源策略

浏览器的同源政策规定,两个网址只要域名相同和端口相同,就可以共享Cookie。

注意:这里不要求协议相同。也就是说, http://example.com设置的Cookie,可以被https://example.com读取 。

确定要放弃本次机会?
福利倒计时
: :

立减 ¥

普通VIP年卡可用
立即使用
front_end_fan
关注 关注
  • 1
    点赞
  • 踩
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
  • 分享
    复制链接
    分享到 QQ
    分享到新浪微博
    扫一扫
  • 举报
    举报
专栏目录
JavaScript IndexedDB 完整指南
p1967914901的博客
09-30 1589
本文将通过一个小教程向你介绍 ,并将 与其他可用选项进行比较。 用于在浏览器中存储数据,对于需要离线工作的 web 应用程序(如大多数进步的 web 应用程序)尤其重要。首先,让我们介绍一下为什么需要将数据存储在 web 浏览器中。数据在 web 应用程序中无处不在——用户交互创建数据、查找数据、更新数据和删除数据。如果没有存储这些数据的方法,就不可能允许用户交互跨多个 web 应用程序的使用保持状态。你通常会使用 MySQL、Postgres、MongoDB、Neo4j、ArangoDB 等数据库来处理
Vue.js结合IndexedDB实现前端数据存储方案
最新发布
weixin_43188912的博客
06-25 660
本文介绍了在Vue.js项目中集成IndexedDB实现前端数据存储的方案。IndexedDB作为浏览器内置的NoSQL数据库,具有大容量存储(≥250MB)、异步操作、事务支持等特点,比localStorage更适合存储结构化数据。文章详细展示了如何封装IndexedDB工具类,包括数据库打开、CRUD操作等核心功能,并通过Promise实现异步调用。同时提供了在Vue组件中使用的具体示例,演示了数据添加、查询等操作流程。该方案为需要离线存储或缓存大量数据的Web应用提供了可行的技术实现。
1 条评论 您还未登录,请先 登录 后发表或查看评论
javascript基础学习系列六百四十八:IndexedDB
m0_68635815的博客
03-31 379
使用IndexedDB 数据库的第一步是调用indexedDB.open()方法,并给它传入一个要打开的数据。不存在,open()操作会创建一个新数据库,然后触发upgradeneeded 事件。IndexedDB 的设计几乎完全是异步的。为此,大多数操作以请求的形式执行,这些请求会异步执行,开数据库期间发生错误,event.target.errorCode 中就会存储表示问题的错误码。如果给定名称的数据库已存在,则会发送一个打开它的请求;如果数据库存在,而你指定了一个升级版的版本号,则会立。
前端数据库indexedDB入门
前端小记
06-29 2万+
indexDB是HTML5的新概念,indexedDB是一个用于在浏览器中存储较大数据结构的Web API,并且提供了索引功能以实现高性能查找。
js之客户端存储
qq_31403519的博客
07-01 535
客户端存储是指将数据存储在客户端,可以设置存储的有效期。 客户端存储遵循“同源策略”。 主要有以下几种方式: web存储(localStorage/sessionStorage)、cookie、离线web应用、web数据库 1、localStorage/sessionStorage 存储有效期和作用域: localStorage存储的数据是永久性的,除非web应用刻意删除存储的数据,或用...
原生js--客户端存储的种类
weixin_33957648的博客
03-05 109
客户端存储遵循同源策略,不同的站点页面之间不可以相互读取对方的数据,但同一站点的不同页面之间可以共享存储的数据 客户端存储的种类: 1、web存储   localStorage、sessionStorage 2、cookie 3、userData(IE) 4、web数据库(尚未标准化)   索引数据库API(indexed Database API) 5、文件系统API   用于...
IndexedDB增删改查插件,分别对增删改查进行了封装,调用对应的函数即可
06-05
官网上的这句话也很简单明了,意思就是IndexedDB主要用来客户端存储大量数据而生的,我们都知道cookie、localstorage等存储方式都有存储大小限制。如果数据量很大,且都需要客户端存储时,那么就可以使用IndexedDB...
【前端面试】一篇讲透客户端存储——IndexedDB、Cookie……
hhhh
08-20 1487
IndexedDB 是一种在用户浏览器中运行的客户端存储技术,它允许网页应用程序存储大量结构化数据。IndexedDB 存储空间的底层实际上是使用用户的本地文件系统来存储数据的。:IndexedDB 数据存储在用户的文件系统中,但具体位置对于用户来说是抽象的,并且由浏览器管理。:浏览器为每个域(或称为源)创建和管理一个或多个数据库文件。这些文件通常位于用户的个人文件夹中,例如在 Linux 上,或者在 Windows 上的AppData目录下。
awesome-web-storage:您需要了解的有关客户端存储的所有信息
02-02
"awesome-web-storage"项目集成了关于客户端存储的各种资源,帮助开发者深入理解并有效利用这些技术。以下是关于cookies、localStorage、sessionStorage以及相关的AwesomeLists的一些详细知识点: 1. **Cookies**:...
客户端存储 — IndexedDB 实现分页查询
weixin_43822185的博客
10-29 1338
客户端存储 — IndexedDB 实现分页查询
前端本地存储方式-IndexedDB
fengchenguo的博客
02-24 1641
indexedDB是什么?怎么用?在哪里用?目前最像数据库的前端本地储存
simple-indexdb-js:使用JavaScript Promise的简单IndexDB的包装器
05-19
SimpleIndexedDB.js 使用ES6的简单IndexedDB的包装器(JavaScript Promise,let,箭头功能)。
cookie localstorage sessionstorage indexDB
热门推荐
海贼懒懒
10-31 16万+
cookie:key/value 单个cookie保存的数据不能超过4kb,每次访问都要传送cookie给服务器,可以设置过期时间,和域名绑定 localstorage:key/value  一直存储于本地硬盘(浏览器中可以删除),一般数据最大5MB(各个浏览器不一样),和域名绑定 sessionStorage:key/value 关闭页面或浏览器后被清除,最大5MB,和域名绑定 index...
JavaScript的indexedDB
qq_43505774的博客
06-27 548
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <script type="text/javascript"> var idb; function db(){ var req=indexedDB.open('indexed','2020627') //设置indexedDB的数据库名字与版本
cookie,localStorage,sessionStorage,indexDB区别
zhaoyahui的博客
09-20 864
特性 cookie localStorage sessionStorage indexDB 数据生命周期 一般由服务器生成,可以设置过期时间 除非被清理,否则一直存在 页面关闭就清理 除非被清理,否则一直存在 数据存储大小 4K 5M 5M 无限 与服务端通信 每次都会携带在 header 中,对于请求...
【JavaScript】IndexedDB
好久不见的流星
02-18 2665
IndexedDB 是一种在浏览器中存储和检索大量结构化数据的强大工具。通过异步操作、事务、索引等特性,它提供了高性能的数据存储和检索方式。IndexedDB 适用于需要大容量、高性能存储的应用场景,如离线应用、大型数据管理等。希望通过本篇博客,你对IndexedDB的概念、基本用法以及适用场景有了更深入的了解。
Js| IndexDb Test
GC怪兽的Blog
08-08 248
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-...
javascript基础学习系列六百零八:IndexedDB
m0_68635815的博客
03-29 471
使用IndexedDB 数据库的第一步是调用indexedDB.open()方法,并给它传入一个要打开的数据。不存在,open()操作会创建一个新数据库,然后触发upgradeneeded 事件。IndexedDB 的设计几乎完全是异步的。为此,大多数操作以请求的形式执行,这些请求会异步执行,开数据库期间发生错误,event.target.errorCode 中就会存储表示问题的错误码。如果给定名称的数据库已存在,则会发送一个打开它的请求;如果数据库存在,而你指定了一个升级版的版本号,则会立。
javascript基础学习系列九百零八:IndexedDB
m0_68635815的博客
04-18 318
使用IndexedDB 数据库的第一步是调用indexedDB.open()方法,并给它传入一个要打开的数据。不存在,open()操作会创建一个新数据库,然后触发upgradeneeded 事件。IndexedDB 的设计几乎完全是异步的。为此,大多数操作以请求的形式执行,这些请求会异步执行,开数据库期间发生错误,event.target.errorCode 中就会存储表示问题的错误码。如果给定名称的数据库已存在,则会发送一个打开它的请求;如果数据库存在,而你指定了一个升级版的版本号,则会立。
tough-cookie-web-storage-store:打造Web存储的硬cookie解决方案
这个库使得开发者可以在不依赖于服务器端会话的情况下,在客户端存储cookies。它通过实现一个符合tough-cookie库规范的CookieJar接口,提供了对cookie的存储、获取和管理的简便方法。该库在设计上利用了Web Storage ...
front_end_fan

博客等级

码龄8年
238
原创
371
点赞
597
收藏
153
粉丝
关注
私信

热门文章

  • js css+html实现简单的日历 33375
  • js监听手机端的touch滑动事件 21524
  • 设置title的样式 18193
  • html5实现贪吃蛇小游戏 17230
  • javascript——touch事件介绍与实例演示 16600

分类专栏

  • ajax
    6篇
  • html5
    17篇
  • CSS3
    16篇
  • javascript
    74篇
  • css
    34篇
  • 纯CSS
    15篇
  • jquery
    35篇
  • vue
    12篇
  • 前端面试题
    4篇
  • 布局
    4篇
  • bootstrap
    6篇
  • 特殊样式
    5篇
  • app
    4篇
  • 日历
    5篇
  • 插件
    13篇
  • 移动端
    13篇
  • 正则表达式
    3篇
  • jquery源码
    14篇
  • 其他
    14篇
  • ES6
    4篇
  • SQL
  • svn
    1篇
  • IOS
    2篇
  • 兼容性
    5篇
  • 分页
  • markdown编辑器
    1篇
  • 图片上传
    1篇
  • 导出
    1篇
  • 导出excel
    1篇
  • 模板引擎
    2篇
  • 计算机基础
  • webpack
    3篇
  • amd/cmd
    1篇
  • promise
    1篇
  • Git
    1篇

展开全部 收起

上一篇:
js基础-canvas
下一篇:
js基础-File API ★★★

最新评论

  • js基础-富文本编辑器

    SixWeChat: 引用「index」 啥意思?

  • 原生js分页效果

    m0_51704076: 如果一页显示5条怎么改?

  • CSS特殊样式(七)CSS3下的纸张效果实现展示

    不考n2不换头像: 太好看了

  • css段落文字(中英文混杂)实现两端对齐

    清川先生: 英文单词是不允许词内换行的

  • js实现前端数据分页

    啦啦啦1326: 详情怎沫查看

大家在看

  • 基于Java的五金建材销售智慧管理系统的设计与实现全方位解析:附毕设论文+源代码 902
  • 对Ollama的探讨和学习 280
  • 开学必读|带孩子玩转 AI 与编程思维的趣味指南+精选科技书单 | 从兴趣到实战 2242
  • OSPF邻居关系建立的几种状态(简单明了)
  • F1 Score|F1指标

最新文章

  • vue-cli webpack全局引入jquery、elment-ui
  • 学习webpack
  • 学习git和github
2018年18篇
2017年289篇

目录

展开全部

收起

目录

展开全部

收起

上一篇:
js基础-canvas
下一篇:
js基础-File API ★★★

分类专栏

  • ajax
    6篇
  • html5
    17篇
  • CSS3
    16篇
  • javascript
    74篇
  • css
    34篇
  • 纯CSS
    15篇
  • jquery
    35篇
  • vue
    12篇
  • 前端面试题
    4篇
  • 布局
    4篇
  • bootstrap
    6篇
  • 特殊样式
    5篇
  • app
    4篇
  • 日历
    5篇
  • 插件
    13篇
  • 移动端
    13篇
  • 正则表达式
    3篇
  • jquery源码
    14篇
  • 其他
    14篇
  • ES6
    4篇
  • SQL
  • svn
    1篇
  • IOS
    2篇
  • 兼容性
    5篇
  • 分页
  • markdown编辑器
    1篇
  • 图片上传
    1篇
  • 导出
    1篇
  • 导出excel
    1篇
  • 模板引擎
    2篇
  • 计算机基础
  • webpack
    3篇
  • amd/cmd
    1篇
  • promise
    1篇
  • Git
    1篇

展开全部 收起

目录

评论 1
被折叠的  条评论 为什么被折叠? 到【灌水乐园】发言
查看更多评论
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值