国产成人无码一区二区三区在线_亚洲一区二区三区精品在线_国严精品久久久久久亚洲影视 _国产精品福利在线播放_中文字幕av导航_玉米视频成人免费看_国产v亚洲v天堂无码久久久_一区二区三区资源_免费成人深夜夜行视频_国产在线观看成人_一区二区三区产品免费精品久久75_国产国语videosex另类

站長資訊網
最全最豐富的資訊網站

了解瀏覽器中的不同存儲類型

了解瀏覽器中的不同存儲類型

在后端開發(fā)中,存儲是工作的常見部分。應用程序數(shù)據(jù)存儲在數(shù)據(jù)庫中,文件存儲在對象存儲中,瞬態(tài)數(shù)據(jù)存儲在高速緩存中……似乎存在無限種存儲任何類型數(shù)據(jù)的可能性。但是,數(shù)據(jù)存儲不僅限于后端,前端(瀏覽器)還具有許多存儲數(shù)據(jù)的選項。我們可以通過利用這種存儲方式來提升我們的應用性能,保存用戶的偏好,在多個會話,甚至不同的計算機上保持應用狀態(tài)。

在本文中,我們將通過不同的可能性在瀏覽器中存儲數(shù)據(jù)。我們將涵蓋每種方法的三個用例,以掌握其利弊。最后,你將能夠決定什么存儲是最適合你的用例。

讓我們開始吧!

localStorage API

localStorage 是瀏覽器中最受歡迎的存儲選項之一,也是許多開發(fā)人員的首選。數(shù)據(jù)跨會話存儲,從不與服務器共享,并且可用于同一協(xié)議和域下的所有頁面。存儲空間限制為?5MB。

令人驚訝的是,谷歌Chrome團隊并不建議使用這個選項,因為它屏蔽了主線程,而且web workers和service workers無法訪問。他們推出了一個實驗:KV Storage,作為一個更好的版本,但這只是一個試驗,似乎還沒有任何進展。

localStorage API 可作為 window.localStorage 使用,并且只能保存UTF-16字符串。在將數(shù)據(jù)保存到 localStorage 之前,我們必須確保將其轉換為字符串。主要的三個功能是:

  • setItem('key', 'value')
  • getItem('key')
  • removeItem('key')

它們都是同步的,因此使用起來很簡單,但是它們會阻塞主線程。

值得一提的是,localStorage 有一個稱為 sessionStorage 的雙胞胎。唯一的區(qū)別是,存儲在 sessionStorage 中的數(shù)據(jù)將僅持續(xù)當前會話,但API相同。

這個太簡單了,相信大家都用過。

IndexedDB API

IndexedDB是瀏覽器中的現(xiàn)代存儲解決方案。它可以存儲大量的結構化數(shù)據(jù),甚至文件和Blob。和每一個數(shù)據(jù)庫一樣,IndexedDB對數(shù)據(jù)進行索引,以便高效地運行查詢。使用IndexedDB比較復雜,我們必須創(chuàng)建一個數(shù)據(jù)庫,表,并使用事務。

localStorage 相比,IndexedDB需要更多代碼。在例子中,我使用了原生API與Promise包裝器,但我強烈建議使用第三方庫來幫助你。我推薦的是localForage,因為它使用了同樣的 localStorage API,但實現(xiàn)方式是逐步增強的,也就是說,如果你的瀏覽器支持IndexedDB,就會使用它;如果不支持,就會退回到 localStorage

讓我們來編寫代碼,前往我們的用戶偏好示例吧!

<input type="checkbox" id="darkTheme" name="darkTheme" onclick='onChange(this);'> <label for="darkTheme">Dark theme</label><br>
登錄后復制
let db;  function toggle(on) {   if (on) {     document.documentElement.classList.add('dark');    } else {     document.documentElement.classList.remove('dark');       } }  async function save(on) {   const tx = db.transaction('preferences', 'readwrite');   const store = tx.objectStore('preferences');   store.put({key: 'darkTheme', value: on});   return tx.complete; }  async function load() {   const tx = db.transaction('preferences', 'readonly');   const store = tx.objectStore('preferences');   const data = await store.get('darkTheme');   return data && data.value; }  async function onChange(checkbox) {   const value = checkbox.checked;   toggle(value);   await save(value); }  function openDatabase() {   return idb.openDB('my-db', 1, {     upgrade(db) {       db.createObjectStore('preferences', {keyPath: 'key'});     },   }); }  openDatabase()   .then((_db) => {     db = _db;     return load();   })   .then((initialValue) => {     toggle(initialValue);     document.querySelector('#darkTheme').checked = initialValue;   });
登錄后復制

效果

了解瀏覽器中的不同存儲類型

idb 是我們使用的Promise包裝器,而不是使用基于事件的低級API。首先要注意的是,對數(shù)據(jù)庫的每次訪問都是異步的,這意味著我們不會阻塞主線程,與 localStorage 相比,這是一個主要優(yōu)勢。

我們需要打開與數(shù)據(jù)庫的連接,以便在整個應用程序中都可以使用它進行讀寫。我們給數(shù)據(jù)庫起一個名字 my-db,一個模式版本 1,以及一個更新函數(shù),以在版本之間應用更改,這與數(shù)據(jù)庫遷移非常相似。我們的數(shù)據(jù)庫架構很簡單:只有一個object store preferences。object store 等效于SQL表,要寫入或讀取數(shù)據(jù)庫,必須使用事務,這是使用IndexedDB的乏味部分。看一下演示中新的 saveload 功能。

毫無疑問,IndexedDB具有更多的開銷,并且與 localStorage 相比,學習曲線更陡峭。對于鍵值的情況,使用 localStorage 或第三方庫可能更有意義,它們將幫助我們提高效率。

<p id="loading">loading...</p> <ul id="list"> </ul>
登錄后復制
let db;  async function loadPokemons() {   const res = await fetch('https://pokeapi.co/api/v2/pokemon?limit=10');   const data = await res.json();   return data.results; }  function removeLoading() {   const elem = document.querySelector('#loading');   if (elem) {     elem.parentNode.removeChild(elem);    } }  function appendPokemon(pokemon) {   const node = document.createElement('li');   const textnode = document.createTextNode(pokemon.name);   node.appendChild(textnode);   document.querySelector('#list').appendChild(node); }  function clearList() {   const list = document.querySelector('#list');   while (list.firstChild) {     list.removeChild(list.lastChild);   } }  function saveToCache(pokemons) {   const tx = db.transaction('pokemons', 'readwrite');   const store = tx.objectStore('pokemons');   pokemons.forEach(pokemon => store.put(pokemon));   return tx.complete; }  function loadFromCache() {   const tx = db.transaction('pokemons', 'readonly');   const store = tx.objectStore('pokemons');   return store.getAll(); }  function openDatabase() {   return idb.openDB('my-db2', 1, {     upgrade(db) {       db.createObjectStore('pokemons', {keyPath: 'name'});     },   }); }  openDatabase()   .then((_db) => {     db = _db;     return loadFromCache();   })   .then((cachedPokemons) => {     if (cachedPokemons) {       removeLoading();       cachedPokemons.forEach(appendPokemon);       console.log('loaded from cache!');     }     return loadPokemons();   })   .then((pokemons) => {     removeLoading();     saveToCache(pokemons);     clearList();     pokemons.forEach(appendPokemon);     console.log('loaded from network!');   });
登錄后復制

效果

了解瀏覽器中的不同存儲類型

你可以在此數(shù)據(jù)庫中存儲數(shù)百兆甚至更多。您可以將所有Pokémon存儲在IndexedDB中,并使其脫機甚至建立索引!這絕對是用于存儲應用程序數(shù)據(jù)的一種選擇。

我跳過了第三個示例的實現(xiàn),因為與 localStorage 相比,IndexedDB在這種情況下沒有任何區(qū)別。即使使用 IndexedDB,用戶仍然不會與他人分享所選頁面,也不會將其作為書簽供將來使用。它們都不適合這個用例。

Cookies

使用cookies是一種獨特的存儲方式,這是唯一的與服務器共享的存儲方式。Cookies作為每次請求的一部分被發(fā)送。它可以是當用戶瀏覽我們的應用程序中的頁面或當用戶發(fā)送Ajax請求時。這樣我們就可以在客戶端和服務器之間建立一個共享狀態(tài),也可以在不同子域的多個應用程序之間共享狀態(tài)。本文中介紹的其他存儲選項無法實現(xiàn)。需要注意的是:每個請求都會發(fā)送 cookie,這意味著我們必須保持 cookie 較小,以保持適當?shù)恼埱蟠笮 ?/p>

Cookies的最常見用途是身份驗證,這不在本文的討論范圍之內。就像 localStorage 一樣,cookie只能存儲字符串。這些cookie被連接成一個以分號分隔的字符串,并在請求的cookie頭中發(fā)送。你可以為每個cookie設置很多屬性,比如過期、允許的域名、允許的頁面等等。

在例子中,我展示了如何通過客戶端來操作cookie,但也可以在你的服務器端應用程序中改變它們。

<input type="checkbox" id="darkTheme" name="darkTheme" onclick='onChange(this);'> <label for="darkTheme">Dark theme</label>
登錄后復制
登錄后復制
function getCookie(cname) {   const name = cname + '=';   const decoded = decodeURIComponent(document.cookie);   const split = decoded.split(';');   const relevantCookie = split.find((cookie) => cookie.indexOf(`${cname}=`) === 0);   if (relevantCookie) {     return relevantCookie.split('=')[1];   }   return null; }  function toggle(on) {   if (on) {     document.documentElement.classList.add('dark');    } else {     document.documentElement.classList.remove('dark');       } }  function save(on) {   document.cookie = `dark_theme=${on.toString()}; max-age=31536000; SameSite=None; Secure`; }  function load() {   return getCookie('dark_theme') === 'true'; }  function onChange(checkbox) {   const value = checkbox.checked;   toggle(value);   save(value); }  const initialValue = load(); toggle(initialValue); document.querySelector('#darkTheme').checked = initialValue;
登錄后復制

效果還是跟前面一樣

了解瀏覽器中的不同存儲類型

將用戶的喜好保存在cookie中,如果服務器能夠以某種方式利用它,就可以很好地滿足用戶的需求。例如,在主題用例中,服務器可以交付相關的CSS文件,并減少潛在的捆綁大小(在我們進行服務器端渲染的情況下)。另一個用例可能是在沒有數(shù)據(jù)庫的情況下,在多個子域應用之間共享這些偏好。

用JavaScript讀寫cookie并不像您想象的那么簡單。要保存新的cookie,您需要設置 document.cookie ——在上面的示例中查看 save 函數(shù)。我設置了 dark_theme cookie,并給它添加了一個 max-age 屬性,以確保它在關閉標簽時不會過期。另外,我添加 SameSiteSecure 屬性。這些都是必要的,因為CodePen使用iframe來運行這些例子,但在大多數(shù)情況下你并不需要它們。讀取一個cookie需要解析cookie字符串。

Cookie字符串如下所示:

key1=value1;key2=value2;key3=value3
登錄后復制

因此,首先,我們必須用分號分隔字符串。現(xiàn)在,我們有一個形式為 key1=value1 的Cookie數(shù)組,所以我們需要在數(shù)組中找到正確的元素。最后,我們將等號分開并獲得新數(shù)組中的最后一個元素。有點繁瑣,但一旦你實現(xiàn)了 getCookie 函數(shù)(或從我的例子中復制它:P),你就可以忘記它。

將應用程序數(shù)據(jù)保存在cookie中可能是個壞主意!它將大大增加請求的大小,并降低應用程序性能。此外,服務器無法從這些信息中獲益,因為它是數(shù)據(jù)庫中已有信息的陳舊版本。如果你使用cookies,請確保它們很小。

分頁示例也不適合cookie,就像 localStorageIndexedDB 一樣。當前頁面是我們想要與他人共享的臨時狀態(tài),這些方法都無法實現(xiàn)它。

URL storage

URL本身并不是存儲設備,但它是創(chuàng)建可共享狀態(tài)的好方法。實際上,這意味著將查詢參數(shù)添加到當前URL中,這些參數(shù)可用于重新創(chuàng)建當前狀態(tài)。最好的例子是搜索查詢和過濾器。如果我們在CSS-Tricks上搜索術語flexbox,則URL將更新為https://css-tricks.com/?s=fle…。看看我們使用URL后,分享搜索查詢有多簡單?另一個好處是,你只需點擊刷新按鈕,就可以獲得更新的查詢結果,甚至可以將其收藏。

我們只能在URL中保存字符串,它的最大長度是有限的,所以我們沒有那么多的空間。我們將不得不保持我們的狀態(tài)小,沒有人喜歡又長又嚇人的網址。

同樣,CodePen使用iframe運行示例,因此您看不到URL實際更改。不用擔心,因為所有的碎片都在那里,所以你可以在任何你想要的地方使用它。

<input type="checkbox" id="darkTheme" name="darkTheme" onclick='onChange(this);'> <label for="darkTheme">Dark theme</label>
登錄后復制
登錄后復制
function toggle(on) {   if (on) {     document.documentElement.classList.add('dark');    } else {     document.documentElement.classList.remove('dark');       } }  function save(on) {   const params = new URLSearchParams(window.location.search);   params.set('dark_theme', on.toString());   history.pushState(null, null, `?${params.toString()}`); }  function load() {   const params = new URLSearchParams(window.location.search);   return params.get('dark_theme') === 'true'; }  function onChange(checkbox) {   const value = checkbox.checked;   toggle(value);   save(value); }  const initialValue = load(); toggle(initialValue); document.querySelector('#darkTheme').checked = initialValue;
登錄后復制

效果還是一樣

了解瀏覽器中的不同存儲類型

我們可以通過 window.location.search 訪問查詢字符串,幸運的是,可以使用 URLSearchParams 類對其進行解析,無需再應用任何復雜的字符串解析。當我們想讀取當前值時,可以使用 get 函數(shù),當我們想寫時,可以使用 set。僅設置值是不夠的,我們還需要更新URL。這可以使用 history.pushStatehistory.replaceState 來完成,取決于我們想要完成的行為。

我不建議將用戶的偏好保存在URL中,因為我們必須將這個狀態(tài)添加到用戶訪問的每一個URL中,而且我們無法保證;例如,如果用戶點擊了谷歌搜索的鏈接。

就像Cookie一樣,由于空間太小,我們無法在URL中保存應用程序數(shù)據(jù)。而且即使我們真的設法存儲它,網址也會很長,而且不吸引人點擊。可能看起來像是釣魚攻擊的一種。

<p>Select page:</p> <p id="pages">   <button onclick="updatePage(0)">0</button>   <button onclick="updatePage(1)">1</button>   <button onclick="updatePage(3)">3</button>   <button onclick="updatePage(4)">4</button>   <button onclick="updatePage(5)">5</button> </p> <ul id="list"> </ul>
登錄后復制
async function loadPokemons(page) {   const res = await fetch(`https://pokeapi.co/api/v2/pokemon?limit=10&offset=${page * 10}`);   const data = await res.json();   return data.results; }  function appendPokemon(pokemon) {   const node = document.createElement('li');   const textnode = document.createTextNode(pokemon.name);   node.appendChild(textnode);   document.querySelector('#list').appendChild(node); }  function clearList() {   const list = document.querySelector('#list');   while (list.firstChild) {     list.removeChild(list.lastChild);   } }  function savePage(page) {   const params = new URLSearchParams(window.location.search);   params.set('page', page.toString());   history.pushState(null, null, `?${params.toString()}`); }  function loadPage() {   const params = new URLSearchParams(window.location.search);   if (params.has('page')) {     return parseInt(params.get('page'));   }   return 0; }  async function updatePage(page) {   clearList();   savePage(page);   const pokemons = await loadPokemons(page);   pokemons.forEach(appendPokemon); }  const page = loadPage(); updatePage(page);
登錄后復制

效果

了解瀏覽器中的不同存儲類型

就像我們的分頁例子一樣,臨時應用狀態(tài)是最適合URL查詢字符串的。同樣,你無法看到URL的變化,但每次點擊一個頁面時,URL都會以 ?page=x 查詢參數(shù)更新。當網頁加載時,它會查找這個查詢參數(shù),并相應地獲取正確的頁面。現(xiàn)在,我們可以把這個網址分享給我們的朋友,讓他們可以享受我們最喜歡的神奇寶貝。

Cache API

Cache API是網絡級的存儲,它用于緩存網絡請求及其響應。Cache API非常適合service worker,service worker可以攔截每一個網絡請求,使用 Cache API 它可以輕松地緩存這兩個請求。service worker也可以將現(xiàn)有的緩存項作為網絡響應返回,而不是從服務器上獲取。這樣,您可以減少網絡負載時間,并使你的應用程序即使處于脫機狀態(tài)也能正常工作。最初,它是為service worker創(chuàng)建的,但在現(xiàn)代瀏覽器中,Cache API也可以在窗口、iframe和worker上下文中使用。這是一個非常強大的API,可以極大地改善應用的用戶體驗。

就像IndexedDB一樣,Cache API的存儲不受限制,您可以存儲數(shù)百兆字節(jié),如果需要甚至可以存儲更多。API是異步的,所以它不會阻塞你的主線程,而且它可以通過全局屬性 caches 來訪問。

Browser extension

如果你建立一個瀏覽器擴展,你有另一個選擇來存儲你的數(shù)據(jù),我在進行擴展程序daily.dev時發(fā)現(xiàn)了它。如果你使用Mozilla的polyfill,它可以通過 chrome.storagebrowser.storage 獲得。確保在你的清單中申請一個存儲權限以獲得訪問權。

有兩種類型的存儲選項:local和sync。local存儲是不言而喻的,它的意思是不共享,保存在本地。sync存儲是作為谷歌賬戶的一部分同步的,你在任何地方用同一個賬戶安裝擴展,這個存儲都會被同步。兩者都有相同的API,所以如果需要的話,來回切換超級容易。它是異步存儲,因此不會像 localStorage 這樣阻塞主線程。不幸的是,我不能為這個存儲選項創(chuàng)建一個演示,因為它需要一個瀏覽器擴展,但它的使用非常簡單,幾乎和 localStorage 一樣。有關確切實現(xiàn)的更多信息,請參閱Chrome文檔。

結束

瀏覽器有許多選項可用于存儲數(shù)據(jù)。根據(jù)Chrome團隊的建議,我們的首選存儲應該是IndexedDB,它是異步存儲,有足夠的空間來存儲我們想要的任何東西。不鼓勵使用 localStorage,但它比 IndexedDB 更易于使用。Cookies是與服務器共享客戶端狀態(tài)的一種好方法,但通常用于身份驗證。

如果你想創(chuàng)建具有可共享狀態(tài)的頁面,如搜索頁面,請使用URL的查詢字符串來存儲這些信息。最后,如果你建立一個擴展,一定要閱讀關于 chrome.storage

更多編程相關知識,請訪問:編程視頻!!

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
午夜肉伦伦影院| 日韩亚洲成人av在线| 亚洲精品日韩丝袜精品| 欧美激情一二三| 一区二区精品在线| 黄色在线观看免费| 26uuu国产日韩综合| 亚洲全黄一级网站| 国内视频一区| 91动漫免费网站| 久久久久国产成人精品亚洲午夜| 欧美精品少妇一区二区三区| 欧美成人video| 亚洲午夜av久久乱码| 色偷偷av一区二区三区乱| 欧美极品少妇全裸体| 国产在线98福利播放视频| av蓝导航精品导航| jizzjizz国产精品喷水| 欧美爱爱视频免费看| 中文字幕第六页| 人妖欧美一区二区| 日韩久久一区二区| 欧美视频在线播放| 欧美人与物videos| 97视频中文字幕| 手机在线视频你懂的| 网站一区二区三区| 国产精品久久久久久久久毛片| 日本午夜一本久久久综合| 2024国产精品视频| 亚洲一区二区三区四区五区黄| 欧美日韩一区二区三区四区| 亚洲成人a级网| 成人黄色免费看| 国产激情在线观看视频| 欧美性生交大片| 亚洲美女性生活| 精品一二三四在线| 一区二区三区国产精品| 精品粉嫩超白一线天av| 久久一区二区精品| 国产91沈先生在线播放| 可以在线看的黄色网址| 国产精品扒开腿做爽爽爽a片唱戏| 91av在线免费视频| 国产片一区二区三区| 亚洲精品一区二区三区蜜桃下载 | 国产3p露脸普通话对白| 国内不卡的二区三区中文字幕| 国产在线精品成人一区二区三区| 亚洲精品一区二区二区| 精品中文字幕在线观看| 日韩人妻精品中文字幕| 国产午夜精品久久久| 污污视频网站在线免费观看| 777欧美精品| 91人人澡人人爽| 在线中文字幕一区| 亚洲免费999| 亚洲国产综合视频在线观看| 亚洲国产欧美日韩在线| 欧美一区二区精品久久911| 中文字幕剧情在线观看| 国产美女av一区二区三区| 亚洲性线免费观看视频成熟| 男人日女人视频网站| 久久久国产精华液| 亚洲免费成人av电影| 最新中文字幕免费视频| 蜜臀久久久久久久| 久久久999精品视频| www.久久91| 成人性生交大片免费看视频在线| 久久午夜a级毛片| 精品国产一区在线| 欧美色videos| 日本在线成人一区二区| 色狠狠色狠狠综合| 亚洲a v网站| 亚洲精品综合久久中文字幕| 成人欧美一区二区三区黑人一| 色综合久久中文字幕综合网| 亚洲色图自拍| www.66久久| 91视频成人免费| 精品无人码麻豆乱码1区2区| 国产日韩亚洲精品| 日韩中文字幕免费观看| 国产日韩欧美日韩| 人妻精品无码一区二区| 97国产一区二区精品久久呦 | 国产精品视频一二区| 欧美成人午夜剧场免费观看| 狠狠色丁香久久婷婷综| 国内免费精品永久在线视频| 免费黄色激情视频| 久久免费观看视频| 亚洲日本香蕉视频| 国产偷久久久精品专区| 成人av在线播放网址| 麻豆视频成人| 蜜桃视频在线一区| 久久精品日产第一区二区三区精品版| 国产又黄又大久久| 91插插插插插插插插| 欧美精品在线看| 国产99久久久久久免费看农村| 亚洲人成人无码网www国产 | aaa在线视频| 91久久国产精品91久久性色| www激情久久| 在线日韩国产网站| 国产奶头好大揉着好爽视频| 一区二区欧美在线| 国产欧美一区二区三区鸳鸯浴| 91成人福利视频| 这里只有精品66| 欧美性视频在线| 久久精品一二区| avove在线观看| 欧美人在线观看| 精品国产乱码久久久久久天美| 中文字幕有码视频| 黄色在线视频网| 高清日韩一区| 国产亚洲视频在线观看| 欧美日韩国产精品专区| 日韩在线播放一区二区| 亚洲第一黄色网址| 一本二本三本亚洲码| 久久久伊人日本| 日韩成人免费视频| 香蕉久久一区二区不卡无毒影院| 丰满少妇被猛烈进入| 六月婷婷激情网| 在线综合+亚洲+欧美中文字幕| 日本一区二区免费视频| av成人观看| 在线精品视频小说1| 久久9999久久免费精品国产| 国产激情视频一区| 日本一区二区视频在线| 国产精品亚洲一区二区无码| 国产精品久久久久9999| 国产精品对白交换视频| 老妇女50岁三级| 久久国产精品久久| 91精品在线免费| 日日摸夜夜添夜夜添国产精品| 人妖粗暴刺激videos呻吟| 成人做爽爽免费视频| 91精品一区二区三区久久久久久 | 国产精品久久久久久中文字| 亚洲色图欧美在线| 日韩综合在线观看| 亚洲一区亚洲二区亚洲三区| 欧美性色aⅴ视频一区日韩精品| 日韩在线a电影| 丁香六月激情综合| 8x8x成人免费视频| 久久av免费一区| 中文字幕日韩免费视频| 国产精品久久久久影院色老大| 翔田千里88av中文字幕| 精品人妻一区二区三区香蕉| 日韩激情视频一区二区| 日韩av有码在线| 欧美视频在线观看免费| 99精品视频在线播放观看| 亚洲视频在线观看免费视频| 少妇熟女视频一区二区三区| 精品在线观看一区二区| 久久久国产一区二区三区| 一区二区三区在线播| 五月婷婷六月丁香| 岛国大片在线免费观看| 国产 欧美 日本| 国产美女被下药99| 日韩国产高清污视频在线观看| 国产精品麻豆一区二区| 日本视频一区二区三区| 国产一区二区波多野结衣| 国产对白videos麻豆高潮| 黄色免费看视频| 国产aⅴ精品一区二区三区黄| 亚洲大型综合色站| 午夜视频一区二区三区| 国产精品影视在线| 超碰在线观看91| 国产乱淫av片| 手机精品视频在线| 中国免费黄色片| 亚洲午夜久久久久久久久| 国内外成人激情视频| 女同性恋一区二区三区| 国产内射老熟女aaaa| 熟女视频一区二区三区| 成人情趣片在线观看免费| 日本人妻伦在线中文字幕| 久久国产成人精品国产成人亚洲| 一区二区在线中文字幕电影视频| 国产亚洲福利社区| 国产二区视频在线| 久久久久久久久久网| 国内精品国产三级国产aⅴ久| 99草草国产熟女视频在线| 国产成人综合在线视频| 99久久精品久久亚洲精品| 91精品又粗又猛又爽| 国产黄色片免费看| 国模私拍视频在线| 91蜜桃网址入口| 在线观看一区二区三区四区| 99久久久无码国产精品性色戒| 国产极品在线视频| 夜夜春亚洲嫩草影视日日摸夜夜添夜| 黄色一级视频播放| 午夜激情影院在线观看| 国产av精国产传媒| 亚洲精品一区二区三区四区| 色网综合在线观看| 精品视频资源站| 欧美色视频日本版| 精品视频1区2区3区| 亚洲精品mp4| 喜爱夜蒲2在线| 天堂8在线天堂资源bt| 国产高潮视频在线观看| 亚洲自拍第二页| 日韩va亚洲va欧美va久久| 一区二区三区四区亚洲| 五月综合激情婷婷六月色窝| 亚洲女人天堂网| 26uuu久久噜噜噜噜| 国产欧美123| 亚洲码无人客一区二区三区| 国产日韩精品一区二区| 国偷自产av一区二区三区小尤奈| 涩涩网站在线看| 精品无码一区二区三区的天堂| 午夜精品久久久久久久爽 | 国产成人精品片| 午夜视频在线观看一区二区三区 | 国产精品女上位| 亚洲一区二区精品| 国产精品女人网站| av在线播放亚洲| 日本aⅴ在线观看| 国产99精品国产| 欧美精品一区二区三区高清aⅴ| 国产精品久久中文| 日本人69视频| 国产成人精品一区二区三区网站观看| 97精品在线播放| jvid福利写真一区二区三区| 国产精品视频1区| 国产精品第七页| 精品黑人一区二区三区| 国产精品美女视频| 2019中文字幕在线观看| 国产又粗又猛又爽又黄| 91在线精品秘密一区二区| 一区二区在线视频播放| 免费成人深夜夜行视频| 国产绿帽刺激高潮对白| 欧美日韩国产高清一区二区三区| 91久久久一线二线三线品牌| 久久免费小视频| 亚洲人一二三区| 欧美久久精品一级黑人c片| 激情综合网婷婷| 9久久婷婷国产综合精品性色| 精品人妻一区二区三区麻豆91 | 亚洲日本在线天堂| 国产成人艳妇aa视频在线 | 日韩中文字幕精品视频| 国产成人av无码精品| 中文字幕中文字幕在线一区 | 精品久久久久久一区| 丝袜美腿成人在线| 国产精品黄视频| 国产又粗又黄又爽的视频| 精品国产免费人成在线观看| 丰满人妻一区二区三区免费视频棣| 一本久道久久综合中文字幕 | 欧美成人三级在线视频| 亚洲亚洲精品在线观看| 国产精品一色哟哟| 99在线视频精品| 亚洲视频在线a| 欧美日韩一二区| 91精品国产乱码在线观看| 精品国免费一区二区三区| av污在线观看| 久久久久久久久久久久久久久99| 88av.com| 欧美v国产在线一区二区三区| 毛葺葺老太做受视频| 91久久久免费一区二区| 日本网站免费观看| …久久精品99久久香蕉国产| 欧美日韩综合一区二区| 精品国产乱子伦一区| 天堂精品中文字幕在线| 成人久久一区二区| 欧美二区在线视频| 国产精品一区在线观看乱码| 99伊人久久| 国产成人精品影院| 久久久久成人网| 久久亚洲精华国产精华液| 师生出轨h灌满了1v1| 亚洲色图激情小说| 欧美特黄一级视频| 日本精品免费在线观看| 精品国偷自产在线视频| 久久久美女视频| 国内精品久久久久影院优| 国产精品爽爽久久久久久| 91麻豆桃色免费看| 久久色在线观看| 一个人看的视频www| 欧美疯狂做受xxxx富婆| 成人片黄网站色大片免费毛片| 欧美在线视频你懂得| 免看一级a毛片一片成人不卡| 日本免费在线精品| 国产老肥熟一区二区三区| 337p粉嫩大胆噜噜噜鲁| 日本道在线观看一区二区| 国产精品综合激情| 国产精品日韩av| 99久久久国产精品| 国产野外作爱视频播放| 欧美性大战xxxxx久久久| 欧美亚洲另类小说| 国产精品欧美在线| 日韩一区二区不卡| 国产又粗又猛又黄又爽无遮挡| 亚洲精品日韩一| 人妻一区二区视频| 欧美精品videofree1080p| 不卡的看片网站| 亚洲少妇中文字幕| 777av视频| 国产欧美日本在线| 久久在线精品视频| 精品免费99久久| 伊人色综合久久天天人手人婷| 久久99国产乱子伦精品免费| 登山的目的在线| 日本xxxxxxxxxx75| 久久久99免费视频| 国产精品欧美久久久久一区二区| 久久精品一区二区三区四区五区| 欧美一区三区二区在线观看| 亚洲大片在线观看| 超碰中文字幕在线观看| 亚洲欧美成人一区| 中文字幕在线日韩| 久久天堂av综合合色蜜桃网| jizzjizz日本少妇| 国产xxx在线观看| 欧美日韩在线精品| 亚洲精品一区在线观看| 夫妻免费无码v看片| 视频一区三区| 视频一区二区精品| 国产精品久久中文| 久久久999精品视频| 日韩经典第一页| 在线不卡中文字幕播放| 亚洲自拍与偷拍| 久久久高清一区二区三区| 激情成人综合网| 天堂网2014av| 天天操夜夜操视频| 三级av免费看| 久久午夜夜伦鲁鲁一区二区| 一区精品在线| 五月天综合婷婷| 香蕉久久夜色| 欧美精品一区二区三区在线看午夜| 欧美理论片在线观看| 精品视频1区2区3区| 欧美日韩另类在线| 7777精品伊人久久久大香线蕉的 | 亚洲精品国产成人久久av盗摄| 91tv国产成人福利| 香蕉在线观看视频| 日韩精品在在线一区二区中文 | 欧美性猛交 xxxx| 懂色av一区二区三区蜜臀| 亚洲欧美日韩中文字幕一区二区三区| 亚洲视频一区二区免费在线观看| 一区二区成人在线| 免费一级片91| 日本亚洲视频在线| 久久影院亚洲| 国产亚洲欧洲997久久综合| 欧美性猛交xxxx黑人| 狠狠躁天天躁日日躁欧美| 一区二区三区成人在线视频| 国产毛片久久久久| 国产午夜性春猛交ⅹxxx| 黄色aaa视频| 无码人妻精品一区二区三应用大全| 一本久道综合色婷婷五月| 亚洲精品在线网址|