精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一文讀懂瀏覽器本地存儲(chǔ):Web Storage

存儲(chǔ) 存儲(chǔ)架構(gòu)
在我們的一些內(nèi)部系統(tǒng)中,用戶信息是每個(gè)頁(yè)面都要用到的,尤其是 userId 字段,會(huì)與每個(gè)獲取數(shù)據(jù)接口掛鉤,但這個(gè)數(shù)據(jù)是不會(huì)變的,一直請(qǐng)求是沒(méi)有意義的,為減少接口的訪問(wèn)次數(shù),可以將主要數(shù)據(jù)緩存在 localStorage 內(nèi),方便其他接口獲取。

一、 簡(jiǎn)介

瀏覽器本地存儲(chǔ)是指瀏覽器提供的一種機(jī)制,允許 Web 應(yīng)用程序在瀏覽器端存儲(chǔ)數(shù)據(jù),以便在用戶下次訪問(wèn)時(shí)可以快速獲取和使用這些數(shù)據(jù)。一共兩種存儲(chǔ)方式:localStorage 和 sessionStorage。下面介紹下兩種緩存的特性和在內(nèi)部平臺(tái)的一些應(yīng)用。

二、localStorage 和 sessionStorage

2.1、區(qū)別

localStorage 和 sessionStorage 的主要區(qū)別是生命周期,具體區(qū)別如下:


localStorage

sessionStorage

生命周期

持久化存儲(chǔ):除非自行刪除或清除緩存,否則一直存在

會(huì)話級(jí)別的存儲(chǔ):瀏覽器標(biāo)簽頁(yè)或窗口關(guān)閉

作用域

相同瀏覽器,同域名,不同標(biāo)簽,不同窗口

相同瀏覽器,同域名,同源窗口

獲取方式

window.localStorage

window.sessionStorage

存儲(chǔ)容量

5M

5M

容量限制的目的是防止濫用本地存儲(chǔ)空間,導(dǎo)致用戶瀏覽器變慢。

2.2、瀏覽器兼容性

1)現(xiàn)在的瀏覽器基本上都是支持這兩種 Storage 特性的。各瀏覽器支持版本如下:


Chrome

Firefox

IE

Opera

Safari

Android

Opera Mobile

Safari Mobile

localStorage

4

3.5

8

10.5

4

2.1

11

iOS 3.2

sessionStorage

5

2

8

10.5

4

2.1

11

iOS 3.2

2)如果使用的是老式瀏覽器,比如Internet Explorer 6、7 或者其他,就需要在使用前檢測(cè)瀏覽器是否支持本地存儲(chǔ)或者是否被禁用。以 localStorage 為例:

if(window.localStorage){
  alert("瀏覽器支持 localStorage");
} else {
  alert("瀏覽器不支持 localStorage");
}

3)某些瀏覽器版本使用過(guò)程中,會(huì)出現(xiàn) Storage 不能正常使用的情況,記得添加 try/catch。以 localStorage 為例:

if(window.localStorage){
  try {
    localStorage.setItem("username", "name");
    alert("瀏覽器支持 localStorage");
  } catch (e) {
    alert("瀏覽器支持 localStorage 后不可使用");
  }
} else {
  alert("瀏覽器不支持 localStorage");
}

三、使用說(shuō)明

3.1、API介紹

localStorage 和 sessionStorage 提供了相同的方法進(jìn)行存儲(chǔ)、檢索和刪除。常用的方法如下:

  1. 設(shè)置數(shù)據(jù):setItem(key, value)

存儲(chǔ)的值可以是字符串、數(shù)字、布爾、數(shù)組和對(duì)象。對(duì)象和數(shù)組必須轉(zhuǎn)換為 string 進(jìn)行存儲(chǔ)。JSON.parse() 和 JSON.stringify() 方法可以將數(shù)組、對(duì)象等值類型轉(zhuǎn)換為字符串類型,從而存儲(chǔ)到 Storage 中;

localStorage.setItem("username", "name"); // "name"
localStorage.setItem("count", 1); // "1"
localStorage.setItem("isOnline", true); // "true"
sessionStorage.setItem("username", "name");
// user 存儲(chǔ)時(shí),先使用 JSON 序列化,否則保存的是[object Object]
const user = { "username": "name" };
localStorage.setItem("user", JSON.stringify(user));
sessionStorage.setItem("user", JSON.stringify(user));

eg:數(shù)據(jù)沒(méi)有序列化,導(dǎo)致保存的數(shù)據(jù)異常

圖片圖片

  1. 獲取數(shù)據(jù):getItem(key)

如果 key 對(duì)應(yīng)的 value 獲取不到,則返回值是 null;

const usernameLocal = localStorage.getItem("username");
const usernameSession = sessionStorage.getItem("username");
// 獲取到的數(shù)據(jù)為string,使用時(shí)反序列化數(shù)據(jù)
const userLocal = JSON.parse(localStorage.getItem("user"));
const userSession = JSON.parse(sessionStorage.getItem("user"));
  1. 刪除數(shù)據(jù):removeItem(key);
localStorage.removeItem("username");
sessionStorage.removeItem("username");
  1. 清空數(shù)據(jù):clear();
localStorage.clear();
sessionStorage.clear();
  1. 在不確定是否存在 key 的情況下,可以使用 hasOwnProperty() 進(jìn)行檢查;
localStorage.hasOwnProperty("userName"); // true
sessionStorage.hasOwnProperty("userName"); // false
  1. 當(dāng)然,也可以使用 Object.keys() 查看所有存儲(chǔ)數(shù)據(jù)的鍵;
Object.keys(localStorage); // ['username']
Object.keys(sessionStorage);

3.2、瀏覽器查看

本地存儲(chǔ)的內(nèi)容可以在瀏覽器中直接查看,以 Chrome 為例,按住鍵盤(pán) F12 進(jìn)入開(kāi)發(fā)者工具后,選擇 Application,然后就能在左邊 Storage 列表中找到 localStorage 和 sessionStorgae。

圖片圖片

3.3、監(jiān)聽(tīng)

當(dāng)存儲(chǔ)的數(shù)據(jù)發(fā)生變化時(shí),其他頁(yè)面通過(guò)監(jiān)聽(tīng) storage 事件,來(lái)獲取變更前后的值,以及根據(jù)值的變化來(lái)處理頁(yè)面的展示邏輯。

JS 原生監(jiān)聽(tīng)事件,只能夠監(jiān)聽(tīng)同源非同一個(gè)頁(yè)面中的 storage 事件,如果想監(jiān)聽(tīng)同一個(gè)頁(yè)面的,需要改寫(xiě)原生方法,拋出自定義事件來(lái)監(jiān)聽(tīng)。具體如下:

  1. 監(jiān)聽(tīng)同源非同一個(gè)頁(yè)面

直接在其他頁(yè)面添加監(jiān)聽(tīng)事件即可。

eg:同域下的 A、B 兩個(gè)頁(yè)面,A 修改了 localStorage,B 頁(yè)面可以監(jiān)聽(tīng)到 storage 事件。

window.addEventListener("storage", () => {
  // 監(jiān)聽(tīng) username 值變化
  if (e.key === "username") {
    console.log("username 舊值:" + e.oldValue + ",新值:" + e.newValue);
  }
})

注:

  • 當(dāng)兩次 setItem 更新的值一樣時(shí),監(jiān)聽(tīng)方法是不會(huì)觸發(fā)的;
  • storage 事件只能監(jiān)聽(tīng)到 localStorage 的變化。
  1. 監(jiān)聽(tīng)同一個(gè)頁(yè)面

重寫(xiě) Storage 的 setItem 事件,同理,也可以監(jiān)聽(tīng)刪除事件 removeItem 和獲取事件 getItem。

(() => {
  const originalSetItem = localStorage.setItem;
  // 重寫(xiě) setItem 函數(shù)
  localStorage.setItem = function (key, val) {
    let event = new Event("setItemEvent");
    event.key = key;
    event.newValue = val;
    window.dispatchEvent(event);
    originalSetItem.apply(this, arguments);
  };
})();

window.addEventListener("setItemEvent", function (e) {
  // 監(jiān)聽(tīng) username 值變化
  if (e.key === "username") {
    const oldValue = localStorage.getItem(e.key);
    console.log("username 舊值:" + oldValue + ",新值:" + e.newValue);
  }
});

四、存儲(chǔ)

瀏覽器默認(rèn)能夠存儲(chǔ) 5M 的數(shù)據(jù),但實(shí)際上,瀏覽器并不會(huì)為其分配特定的存儲(chǔ)空間,而是根據(jù)當(dāng)前瀏覽器的空閑空間來(lái)判斷能夠分配多少存儲(chǔ)空間。

4.1、存儲(chǔ)容量

可以使用 Storage 的 length 屬性,對(duì)存儲(chǔ)容量進(jìn)行測(cè)算,以 localStorage 為例:

let str = "0123456789";
let temp = "";
// 先生成一個(gè) 10KB 的字符串
while (str.length !== 10240) {
  str = str + "0123456789";
}
// 清空
localStorage.clear();
// 計(jì)算總量
const computedTotal = () => {
  return new Promise((resolve) => {
    // 往 localStorage 中累積存儲(chǔ) 10KB
    const timer = setInterval(() => {
      try {
        localStorage.setItem("temp", temp);
      } catch (e) {
        // 報(bào)錯(cuò)說(shuō)明超出最大存儲(chǔ)
        resolve(temp.length / 1024);
        clearInterval(timer);
        // 統(tǒng)計(jì)完記得清空
        localStorage.clear();
      }
      temp += str;
    }, 0);
  });
};
// 計(jì)算使用量
const computedUse = () => {
  let cache = 0;
  for (let key in localStorage) {
    if (localStorage.hasOwnProperty(key)) {
      cache += localStorage.getItem(key).length;
    }
  }
  return (cache / 1024).toFixed(2);
};

(async () => {
  const total = await computedTotal();
  let use = "0123456789";
  for (let i = 0; i < 1000; i++) {
    use += "0123456789";
  }
  localStorage.setItem("use", use);
  const useCache = computedUse();

  console.log(`最大容量${total}KB`);
  console.log(`已用${useCache}KB`);
  console.log(`剩余可用容量${total - useCache}KB`);
})();

可見(jiàn)在 Chrome 瀏覽器下,localStorage 有 5M 容量。

圖片圖片

4.2、存儲(chǔ)性能

在某些特殊場(chǎng)景下,需要存儲(chǔ)大數(shù)據(jù),為了更好的利用 Storage 的存儲(chǔ)空間,可以采取以下解決方案,但不應(yīng)該過(guò)于頻繁地將大量數(shù)據(jù)存儲(chǔ)在 Storage 中,因?yàn)樵趯?xiě)入數(shù)據(jù)時(shí),會(huì)對(duì)整個(gè)頁(yè)面進(jìn)行阻塞(不推薦這種方式)。

  1. 壓縮數(shù)據(jù)

可以使用數(shù)據(jù)壓縮庫(kù)對(duì) Storage 中的數(shù)據(jù)進(jìn)行壓縮,從而減小數(shù)據(jù)占用的存儲(chǔ)空間。

eg:使用 lz-string 庫(kù)的 compress() 函數(shù)將數(shù)據(jù)進(jìn)行壓縮,并將壓縮后的數(shù)據(jù)存儲(chǔ)到 localStorage 中。

const LZString = require("lz-string");
const data = "This is a test message";
// 壓縮
const compressedData = LZString.compress(data);
localStorage.setItem("test", compressedData);
// 解壓
const decompressedData = LZString.decompress(localStorage.getItem("test"));
  1. 分割數(shù)據(jù)

將大的數(shù)據(jù)分割成多個(gè)小的片段存儲(chǔ)到 Storage 中,從而減小單個(gè)數(shù)據(jù)占用的存儲(chǔ)空間。

eg:將用戶數(shù)據(jù)分割為單項(xiàng)存儲(chǔ)到 localStorage 中。

for (const key in userInfo) {
  localStorage.setItem(key, userInfo[key]);
}

圖片圖片

  1. 取消不必要的數(shù)據(jù)存儲(chǔ)

可以在代碼中取消一些不必要的數(shù)據(jù)存儲(chǔ),從而減小占用空間。

eg:只存儲(chǔ)用到的用戶名、公司主體和后端所在環(huán)境字段信息。

for (const key in userInfo) {
  if (["userName", "legalEntityName", "isOnline"].includes(key)) {
    localStorage.setItem(key, userInfo[key]);
  }
}

圖片圖片

  1. 設(shè)置過(guò)期時(shí)間

localStorage 是不支持過(guò)期時(shí)間的,在存儲(chǔ)信息過(guò)多后,會(huì)拖慢瀏覽器速度,也會(huì)因?yàn)闉g覽器存儲(chǔ)容量不夠而報(bào)錯(cuò),可以封裝一層邏輯來(lái)實(shí)現(xiàn)設(shè)置過(guò)期時(shí)間,以達(dá)到清理的目的。

// 設(shè)置
function set(key, value){
  const time = new Date().getTime(); //獲取當(dāng)前時(shí)間
  localStorage.setItem(key, JSON.stringify({value, time})); //轉(zhuǎn)換成json字符串
}
// 獲取
function get(key, exp){
  // exp 過(guò)期時(shí)間
  const value = localStorage.getItem(key); 
  const valueJson = JSON.parse(value); 
  //當(dāng)前時(shí)間 - 存儲(chǔ)的創(chuàng)建時(shí)間 > 過(guò)期時(shí)間
  if(new Date().getTime() - valueJson.time > exp){
    console.log("expires"); //提示過(guò)期
  } else {
    console.log("value:" + valueJson.value);
  }
}

五、應(yīng)用

5.1、使用習(xí)慣記錄

用來(lái)緩存一些篩選項(xiàng)數(shù)據(jù),保存用戶習(xí)慣信息,起到避免多次重復(fù)操作的作用。

eg:在 beetle 工程列表中,展示了自已權(quán)限下所有 beetle 的項(xiàng)目,對(duì)于參與項(xiàng)目多和參與項(xiàng)目少的人,操作習(xí)慣是不同的,由此,記錄收藏功能狀態(tài)解決了這一問(wèn)題,讓篩選項(xiàng)記住用戶選擇,方便下次使用。

圖片圖片

圖片圖片

在開(kāi)發(fā)使用中,直接獲取 localStorage.getItem('isFavor') 作為默認(rèn)值展示,切換后使用 localStorage.setItem() 方法更新保存內(nèi)容。

// 獲取
const isFavor = localStorage.getItem('isFavor');
this.state = {
  isFavor: isFavor !== null ? Number(isFavor) : EngineeringTypeEnum.FAVOR,
};
// 展示默認(rèn)值
<Form.Item name='isFavor' initialValue={this.state.isFavor}>
  <Select
    placeholder='篩選收藏的工程'
    onChange={(e) => this.changeFavor(e)}
    {...searchSmallFormProps}
  >
      {EngineeringTypeEnum.property.map(e => (<Option key={e.id} value={e.id}>{e.name}</Option>))}
  </Select>
</Form.Item>
// 變更
changeFavor = (e) => {
  localStorage.setItem('isFavor', e);
  this.setState({ isFavor: e });
};

5.2、首次打開(kāi)提示

用來(lái)緩存用戶導(dǎo)覽,尤其是只需要出現(xiàn)一次的操作說(shuō)明彈窗等。

eg:當(dāng)?shù)谝淮位蛘咔蹇站彺婧蟮卿洠?yè)面需要出現(xiàn)操作指南和用戶手冊(cè)的彈窗說(shuō)明。

圖片圖片

在開(kāi)發(fā)使用中,注意存儲(chǔ)的數(shù)據(jù)類型為 string,轉(zhuǎn)成布爾值是為了在插件中方便控制彈窗的顯示隱藏。

// 獲取
const operationVisible = localStorage.getItem('operationVisible');
this.state = {
  operationVisible: operationVisible === null || operationVisible === 'true' ? true : false,
};
// 控制展示
<Modal
  title='操作指南'
  open={this.state.operationVisible}
  onCancel={() => { 
    this.setState({ operationVisible: false }); 
    localStorage.setItem('operationVisible', false); 
  }}
  footer={null}
  destroyOnClose={true}
>
  <Divider orientation='left'>動(dòng)作</Divider>
  <p>接口 》 用例 》 用例集,3級(jí)結(jié)構(gòu)滿足不了后續(xù)的使用,因此增加【動(dòng)作】這一層級(jí),【動(dòng)作】是接口測(cè)試的最小單元,多個(gè)【動(dòng)作】可以組合成一個(gè)用例,多個(gè)用例可以聚合為用例集;</p>
  <Image src={OperationGuidePng} preview={false} />
</Modal>

5.3、減少重復(fù)訪問(wèn)接口

在瀏覽頁(yè)面時(shí),會(huì)遇到一些經(jīng)常訪問(wèn)但返回?cái)?shù)據(jù)不更新的接口,這種特別適合用做頁(yè)面緩存,只在頁(yè)面打開(kāi)的時(shí)候訪問(wèn)一次,其他時(shí)間獲取緩存數(shù)據(jù)即可。

eg:在我們的一些內(nèi)部系統(tǒng)中,用戶信息是每個(gè)頁(yè)面都要用到的,尤其是 userId 字段,會(huì)與每個(gè)獲取數(shù)據(jù)接口掛鉤,但這個(gè)數(shù)據(jù)是不會(huì)變的,一直請(qǐng)求是沒(méi)有意義的,為減少接口的訪問(wèn)次數(shù),可以將主要數(shù)據(jù)緩存在 localStorage 內(nèi),方便其他接口獲取。

六、總結(jié)

希望通過(guò)此篇文章,可以讓大家了解 Web Storage 在瀏覽器數(shù)據(jù)存儲(chǔ)和讀取的相關(guān)操作,以及相關(guān)事件和限制。

它可以用于保存用戶的偏好設(shè)置、表單數(shù)據(jù)等,在開(kāi)發(fā)中使用可以方便的存儲(chǔ)和讀取數(shù)據(jù),提高用戶體驗(yàn)。當(dāng)然,在使用時(shí)需要特別注意它的限制,以及在存儲(chǔ)、讀取和刪除數(shù)據(jù)過(guò)程中的錯(cuò)誤處理。


關(guān)于作者

劉筱雨,轉(zhuǎn)轉(zhuǎn)工程效率組內(nèi)成員,主要負(fù)責(zé)公司內(nèi)部公共系統(tǒng)前端項(xiàng)目。

責(zé)任編輯:武曉燕 來(lái)源: 轉(zhuǎn)轉(zhuǎn)QA
相關(guān)推薦

2020-12-29 09:56:29

瀏覽器緩存HTTP

2023-11-27 17:35:48

ComponentWeb外層

2019-12-17 14:45:17

瀏覽器事件循環(huán)前端

2021-05-07 14:03:36

大數(shù)據(jù)存儲(chǔ)接口CSI

2022-09-21 09:04:07

Python裝飾器

2021-08-04 16:06:45

DataOps智領(lǐng)云

2023-12-22 19:59:15

2025-02-11 09:29:07

2022-09-22 09:00:46

CSS單位

2025-04-03 10:56:47

2018-09-28 14:06:25

前端緩存后端

2022-11-06 21:14:02

數(shù)據(jù)驅(qū)動(dòng)架構(gòu)數(shù)據(jù)

2024-09-03 08:40:31

2021-08-11 10:10:26

Linux定時(shí)器數(shù)組

2019-11-05 10:47:16

Python框架服務(wù)器

2024-06-04 12:59:41

2018-11-16 10:04:14

云存儲(chǔ)磁帶存儲(chǔ)RAID

2023-05-20 17:58:31

低代碼軟件

2022-10-20 08:01:23

2022-07-05 06:30:54

云網(wǎng)絡(luò)網(wǎng)絡(luò)云原生
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

老司机av网站| 老司机午夜网站| 丁香六月婷婷综合| 欧洲杯足球赛直播| 在线成人午夜影院| 欧美国产日韩激情| 国产在线电影| 国产精品小仙女| 91高潮精品免费porn| 亚洲一级黄色录像| www.国产精品一区| 在线精品国精品国产尤物884a| 中文有码久久| 亚洲欧美日韩免费| 狠狠色伊人亚洲综合成人| 久久人人爽人人| 五月天综合视频| 日本伊人久久| 欧美中文字幕亚洲一区二区va在线| 中文字幕一区二区三区最新| 免费激情视频网站| 青青草97国产精品免费观看| 精品中文字幕在线2019| 中文字幕国产综合| 亚洲一区二区三区日本久久九| 欧美日韩在线影院| 男女裸体影院高潮| caoporn国产精品免费视频| 国产精品88av| 国产精品手机播放| 天天干天天干天天| 国内在线观看一区二区三区| 国产一区二区黑人欧美xxxx| 台湾佬美性中文| 精品久久毛片| 欧美色欧美亚洲高清在线视频| 久久久天堂国产精品| 国内精品在线视频| 99精品欧美一区二区三区综合在线| 国产一区二区色| 日本一区二区免费电影| 欧美日韩午夜| 麻豆乱码国产一区二区三区 | 欧美一区二区啪啪| 亚洲成人福利在线观看| 激情国产在线| 亚洲网友自拍偷拍| 福利在线小视频| 三区四区电影在线观看| 久久女同互慰一区二区三区| 国产精品视频一区二区三区经| 国产又黄又粗又猛又爽| 青青国产91久久久久久| 日韩av成人在线| 亚洲天堂一区在线观看| 日韩一级大片| 97超级碰碰碰久久久| 九九视频免费看| 亚洲精品一二三区区别| 日韩网站免费观看| 成人18视频免费69| 久久人体视频| 北条麻妃99精品青青久久| 五月婷婷欧美激情| 成人综合一区| 永久免费精品影视网站| 久久亚洲AV无码专区成人国产| 香蕉一区二区| 亚洲精选一区二区| 亚洲专区区免费| 综合综合综合综合综合网| 亚洲男人天堂九九视频| 国产免费看av| av伊人久久| 色小说视频一区| 性欧美疯狂猛交69hd| 亚洲国产一成人久久精品| 久久综合免费视频影院| 免费人成在线观看| 日韩亚洲精品在线| 国产成人欧美在线观看| 这里只有精品免费视频| 蜜臀av一区二区在线免费观看 | 免费成人进口网站| av网站免费在线观看| 亚洲最新在线观看| 久草热视频在线观看| 欧美三级网址| 在线电影院国产精品| 日本美女久久久| 白嫩白嫩国产精品| 亚洲精品有码在线| 亚洲女人久久久| 精品福利av| 国产精品第七影院| 国产欧美日韩成人| 91日韩在线专区| 亚洲国产成人不卡| 伊人电影在线观看| 欧美性精品220| 在线观看国产中文字幕| 伊人久久大香线蕉av超碰| 亚洲国产精品女人久久久| 性猛交ⅹxxx富婆video | 不卡一区二区三区四区| 欧美动漫一区二区| 久久久久久国产精品免费无遮挡| 亚洲一区二区三区四区中文字幕| 午夜精品久久久久久久无码| 欧美午夜三级| 精品99999| 国产综合精品久久久久成人av| 欧美国产日本| 国产精品久久久久久久av电影 | 亚洲精品电影久久久| 国产又粗又硬视频| 亚洲久色影视| 成人a在线视频| 性感美女福利视频| 亚洲欧洲日韩在线| 色婷婷综合久久久久中文字幕| 在线视频成人| 国产亚洲精品久久久久久牛牛| 免费在线观看国产精品| 日av在线不卡| 欧美激情导航| 青草在线视频| 678五月天丁香亚洲综合网| 在线免费观看黄色小视频| 欧美 日韩 国产一区二区在线视频 | wwwww在线观看| 久久国产小视频| 欧美在线一级视频| 亚洲欧美激情另类| 综合久久综合久久| 亚洲一级片网站| 欧美女优在线视频| 国产91精品黑色丝袜高跟鞋| 亚洲国产999| 成人免费小视频| 亚洲成人福利在线观看| 亚洲理论电影片| 久久人人爽人人| 亚洲AV午夜精品| 亚洲品质自拍视频网站| 中文字幕国产免费| 国产影视一区| 国产精品白嫩美女在线观看| 免费在线一级视频| 精品国产乱码久久久久酒店 | 亚洲人成自拍网站| 亚洲高清毛片一区二区| av亚洲精华国产精华精| 人妻少妇精品无码专区二区| 99亚洲乱人伦aⅴ精品| 色综合久综合久久综合久鬼88| 国产露脸91国语对白| 国产精品国产三级国产aⅴ入口 | 成人一级福利| 欧美videos大乳护士334| 天天看天天摸天天操| 久久91精品久久久久久秒播 | 影院欧美亚洲| 国产精品乱子乱xxxx| 欧美另类tv| 亚洲精品www久久久| 欧美三级一区二区三区| 99国产麻豆精品| 男人揉女人奶房视频60分 | 成年人二级毛片| 国产精品一二一区| 国产视频在线观看网站| 99re91这里只有精品| 高清在线视频日韩欧美| 四虎影院在线播放| 日本久久电影网| 永久免费观看片现看| 国产在线一区观看| 国产成人一区二区三区别| 风间由美一区二区av101| 久久青草精品视频免费观看| 色播色播色播色播色播在线| 色成人在线视频| 大地资源高清在线视频观看| 国产乱码精品一品二品| 国产69精品久久久久久久| 蜜桃一区二区三区| 成人黄色大片在线免费观看| 欧美人与牲禽动交com| 亚洲美女视频网| 一本久道久久综合无码中文| 亚洲大片一区二区三区| 国产特黄级aaaaa片免| 麻豆成人av在线| 日韩视频 中文字幕| 免费看久久久| 国产免费成人av| 高清在线视频不卡| 亚洲系列中文字幕| 精品久久久无码中文字幕| 五月婷婷色综合| 国产又粗又长又黄的视频| 成人午夜视频网站| 日本爱爱免费视频| 红桃视频亚洲| 亚洲精品第一区二区三区| 国产精品久一| 91福利视频网| 羞羞视频在线观看免费| 亚洲性日韩精品一区二区| 成人激情四射网| 在线观看日产精品| 亚州国产精品视频| 亚洲丝袜美腿综合| 一区二区黄色片| 成人免费视频视频| 最新av免费在线观看| 亚洲伊人观看| 日韩国产小视频| 日本不卡电影| 蜜桃久久精品乱码一区二区| 亚洲国产aⅴ精品一区二区| 国产精品久久久久久久一区探花| 另类视频在线| 久久精品国亚洲| 国产二区在线播放| 亚洲精品成人久久久| www.国产免费| 欧美一区二区在线视频| 亚洲精品国产欧美在线观看| 亚洲成a天堂v人片| 麻豆91精品91久久久| 亚洲国产精品99久久久久久久久| 亚洲专区区免费| av高清不卡在线| 免费黄视频在线观看| 国产一区二区在线视频| jizz18女人| 美国三级日本三级久久99| 日韩在线第三页| 国产精品社区| 黄色免费福利视频| 在线日韩中文| 日本香蕉视频在线观看| 午夜久久tv| 免费极品av一视觉盛宴| 亚洲mv大片欧洲mv大片| 一区精品在线| 三区四区不卡| 亚洲午夜精品一区二区 | 午夜探花在线观看| 久久人体视频| 综合国产精品久久久| 四虎成人精品永久免费av九九| 亚洲激情图片| 久久视频国产| 一区二区三区视频| 久久精品免费一区二区三区| 一区精品在线| 亚洲激情中文| 日本天堂免费a| 狠狠色综合网| 久久久亚洲精品无码| 国产精品呻吟| www黄色在线| 美女在线一区二区| 日韩精品视频一二三| 久久91精品国产91久久小草| 中文字幕avav| 波多野结衣中文一区| www.免费av| 亚洲国产精品成人久久综合一区| 国产精品视频看看| 亚洲精品国产无天堂网2021| 九九热精品在线观看| 精品久久久一区| 欧美brazzers| 3d成人动漫网站| 韩国av免费在线| 日韩成人av网址| jizz在线免费观看| 久久中文久久字幕| 国产后进白嫩翘臀在线观看视频| 欧美在线一区二区三区四| 高清电影一区| 亚洲自拍欧美色图| 久久悠悠精品综合网| 欧美色图亚洲自拍| 888久久久| 国产男女免费视频| 奇米影视一区二区三区| 青娱乐精品在线| 26uuu久久天堂性欧美| 免费一级suv好看的国产网站| 一区二区三区四区在线播放| 草久久免费视频| 欧美日韩二区三区| 四虎永久在线观看| 日韩在线视频观看正片免费网站| 久草在线视频网站| 国产精品国产三级国产aⅴ浪潮| 国产精品一区二区三区四区在线观看| 国产综合 伊人色| 日韩成人a**站| 国产成人无码a区在线观看视频| 另类的小说在线视频另类成人小视频在线| www.偷拍.com| 国产视频视频一区| 久久成人国产精品入口| 欧美在线啊v一区| 熟妇人妻一区二区三区四区| 久久九九有精品国产23| 老司机2019福利精品视频导航| 91久久大香伊蕉在人线| blacked蜜桃精品一区| 大西瓜av在线| 精品一区二区三区av| v8888av| 亚洲午夜影视影院在线观看| 在线免费看91| 亚洲欧美激情视频| 51精品在线| 亚洲bt欧美bt日本bt| 精品国产一区二区三区av片| 成人黄色大片网站| 国产一区999| 久久精品—区二区三区舞蹈| 黄色成人在线播放| 亚洲成人黄色片| 日韩少妇与小伙激情| 欧美一级大片| 精品日产一区2区三区黄免费| 一区二区三区网站| 日日干夜夜操s8| 国产欧美久久久精品影院| 精品成人av一区二区在线播放| 精品免费国产二区三区| 成年视频在线观看| 91天堂在线视频| 欧美gvvideo网站| xx欧美撒尿嘘撒尿xx| 91老师片黄在线观看| www.av麻豆| 亚洲国产三级网| 国产三级伦理在线| 99理论电影网| 欧美精选在线| 国产高潮失禁喷水爽到抽搐 | 亚洲GV成人无码久久精品| 亚洲大胆人体在线| 久久电影网站| 精品国产乱码久久久久久108| 亚洲国产一区二区三区a毛片| 国产ts在线观看| 亚洲一级二级三级在线免费观看| 国产aⅴ一区二区三区| 欧美成人精品在线视频| 国产视频网站一区二区三区| 久久国产精品免费观看| 国产精品一卡二| 国产精品16p| 亚洲精品二三区| xxx欧美xxx| 四虎永久国产精品| 美女爽到高潮91| 一区二区视频免费看| 欧美成人aa大片| 国产社区精品视频| 欧美日韩喷水| 蜜桃视频第一区免费观看| 在线视频这里只有精品| 欧美一区二区三区视频在线观看| 一色桃子av在线| 极品校花啪啪激情久久| 性欧美长视频| 黄色片在线观看免费| 3d动漫精品啪啪一区二区竹菊| 蜜桃成人365av| 免费观看成人高| 久久国产夜色精品鲁鲁99| 欧美一区免费观看| 精品av久久707| 日韩大片欧美大片| 久久免费视频2| 成人黄色在线看| 欧美超碰在线观看| 久久久av亚洲男天堂| 国产精品午夜av| 亚洲xxxx2d动漫1| 亚洲欧美日韩中文字幕一区二区三区| 欧美亚洲精品在线观看| 国产精品福利网站| 中文视频一区| 天天躁日日躁aaaxxⅹ| 91精选在线观看| 色资源二区在线视频| 中文字幕一区二区三区四区五区六区| 成人app下载| 伊人久久国产精品| 午夜精品www|