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

Web聊天工具的富文本輸入框

開發(fā) 前端
最近折騰 Websocket,打算開發(fā)一個(gè)聊天室應(yīng)用練練手。在應(yīng)用開發(fā)的過(guò)程中發(fā)現(xiàn)可以插入 emoji ,粘貼圖片的富文本輸入框其實(shí)蘊(yùn)含著許多有趣的知識(shí),于是便打算記錄下來(lái)和大家分享。

最近折騰 Websocket,打算開發(fā)一個(gè)聊天室應(yīng)用練練手。在應(yīng)用開發(fā)的過(guò)程中發(fā)現(xiàn)可以插入 emoji ,粘貼圖片的富文本輸入框其實(shí)蘊(yùn)含著許多有趣的知識(shí),于是便打算記錄下來(lái)和大家分享。

輸入框富文本化

傳統(tǒng)的輸入框都是使用 <textarea> 來(lái)制作的,它的優(yōu)勢(shì)是非常簡(jiǎn)單,但***的缺陷卻是無(wú)法展示圖片。為了能夠讓輸入框能夠展示圖片(富文本化),我們可以采用設(shè)置了 contenteditable="true" 屬性的 <div> 來(lái)實(shí)現(xiàn)這里面的功能。

簡(jiǎn)單創(chuàng)建一個(gè) index.html 文件,然后寫入如下內(nèi)容: 

  1. <div class="editor" contenteditable="true">  
  2.   <img src="https://static.easyicon.net/preview/121/1214124.gif" alt="">  
  3. </div> 

打開瀏覽器,就能看到一個(gè)默認(rèn)已經(jīng)帶了一張圖片的輸入框:

光標(biāo)可以在圖片前后移動(dòng),同時(shí)也可以輸入內(nèi)容,甚至通過(guò)退格鍵刪除這張圖片——換句話說(shuō),圖片也是可編輯內(nèi)容的一部分,也意味著輸入框的富文本化已經(jīng)體現(xiàn)出來(lái)了。

接下來(lái)的任務(wù),就是思考如何直接通過(guò) control + v 把圖片粘貼進(jìn)去了。

處理粘貼事件

任何通過(guò)“復(fù)制”或者 control + c 所復(fù)制的內(nèi)容(包括屏幕截圖)都會(huì)儲(chǔ)存在剪貼板,在粘貼的時(shí)候可以在輸入框的 onpaste 事件里面監(jiān)聽到。 

  1. <div class="editor" contenteditable="true">  
  2.   <img src="https://static.easyicon.net/preview/121/1214124.gif" alt="">  
  3. </div> 

而剪貼板的的內(nèi)容則存放在 DataTransferItemList 對(duì)象中,可以通過(guò) e.clipboardData.items 訪問(wèn)到:

細(xì)心的讀者會(huì)發(fā)現(xiàn),如果直接在控制臺(tái)點(diǎn)開 DataTransferItemList 前的小箭頭,會(huì)發(fā)現(xiàn)對(duì)象的 length 屬性為0。說(shuō)好的剪貼板內(nèi)容呢?其實(shí)這是 Chrome 調(diào)試的一個(gè)小坑。在開發(fā)者工具里面,console.log 出來(lái)的對(duì)象是一個(gè)引用,會(huì)隨著原始數(shù)據(jù)的改變而改變。由于剪貼板的數(shù)據(jù)已經(jīng)被“粘貼”進(jìn)輸入框了,所以展開小箭頭以后看到的 DataTransferItemList 就變成空的了。為此,我們可以改用 console.table 來(lái)展示實(shí)時(shí)的結(jié)果。

在明白了剪貼板數(shù)據(jù)的存放位置以后,就可以編寫代碼來(lái)處理它們了。由于我們的富文本輸入框比較簡(jiǎn)單,所以只需要處理兩類數(shù)據(jù)即可,其一是普通的文本類型數(shù)據(jù),包括 emoji 表情;其二則是圖片類型數(shù)據(jù)。

新建 paste.js 文件: 

  1. const onPaste = (e) => {  
  2.   // 如果剪貼板沒有數(shù)據(jù)則直接返回  
  3.   if (!(e.clipboardData && e.clipboardData.items)) {  
  4.     return  
  5.   }  
  6.   // 用Promise封裝便于將來(lái)使用  
  7.   return new Promise((resolve, reject) => {  
  8.     // 復(fù)制的內(nèi)容在剪貼板里位置不確定,所以通過(guò)遍歷來(lái)保證數(shù)據(jù)準(zhǔn)確  
  9.     for (let i = 0len = e.clipboardData.items.length; i < len; i++) {  
  10.       const item = e.clipboardData.items[i]  
  11.       // 文本格式內(nèi)容處理  
  12.       if (item.kind === 'string') {  
  13.         item.getAsString((str) => {  
  14.           resolve(str)  
  15.         })  
  16.       // 圖片格式內(nèi)容處理  
  17.       } else if (item.kind === 'file') {  
  18.         const pasteFile = item.getAsFile()  
  19.         // 處理pasteFile  
  20.         // TODO(pasteFile)  
  21.       } else {  
  22.         reject(new Error('Not allow to paste this type!'))  
  23.       }  
  24.     }  
  25.   })  
  26.  
  27. export default onPaste 

然后就可以在 onPaste 事件里面直接使用了: 

  1. document.querySelector('.editor').addEventListener('paste', async (e) => {  
  2.     const result = await onPaste(e)  
  3.     console.log(result)  
  4. }) 

上面的代碼支持文本格式,接下來(lái)就要對(duì)圖片格式進(jìn)行處理了。玩過(guò) <input type="file"> 的同學(xué)會(huì)知道,包括圖片在內(nèi)的所有文件格式內(nèi)容都會(huì)儲(chǔ)存在 File 對(duì)象里面,這在剪貼板里面也是一樣的。于是我們可以編寫一套通用的函數(shù),專門來(lái)讀取 File 對(duì)象里的圖片內(nèi)容,并把它轉(zhuǎn)化成 base64 字符串。

粘貼圖片

為了更好地在輸入框里展示圖片,必須限制圖片的大小,所以這個(gè)圖片處理函數(shù)不僅能夠讀取 File 對(duì)象里面的圖片,還能夠?qū)ζ溥M(jìn)行壓縮。

新建一個(gè) chooseImg.js 文件: 

  1. /**  
  2.  * 預(yù)覽函數(shù)  
  3.  *  
  4.  * @param {*} dataUrl base64字符串  
  5.  * @param {*} cb 回調(diào)函數(shù)  
  6.  */  
  7. function toPreviewer (dataUrl, cb) {  
  8.   cb && cb(dataUrl)  
  9.  
  10. /**  
  11.  * 圖片壓縮函數(shù)  
  12.  *  
  13.  * @param {*} img 圖片對(duì)象  
  14.  * @param {*} fileType  圖片類型  
  15.  * @param {*} maxWidth 圖片***寬度  
  16.  * @returns base64字符串  
  17.  */  
  18. function compress (img, fileType, maxWidth) {  
  19.   let canvas = document.createElement('canvas')  
  20.   let ctx = canvas.getContext('2d')  
  21.   const proportion = img.width / img.height  
  22.   const width = maxWidth  
  23.   const height = maxWidth / proportion  
  24.   canvas.width = width  
  25.   canvas.height = height  
  26.   ctx.fillStyle = '#fff'  
  27.   ctx.fillRect(0, 0, canvas.width, canvas.height)  
  28.   ctx.drawImage(img, 0, 0, width, height)  
  29.   const base64data = canvas.toDataURL(fileType, 0.75)  
  30.   canvas = ctx = null  
  31.   return base64data  
  32.  
  33. /**  
  34.  * 選擇圖片函數(shù)  
  35.  *  
  36.  * @param {*} e input.onchange事件對(duì)象  
  37.  * @param {*} cb 回調(diào)函數(shù)  
  38.  * @param {number} [maxsize=200 * 1024] 圖片***體積  
  39.  */  
  40. function chooseImg (e, cb, maxsize = 200 * 1024) {  
  41.   const file = e.target.files[0]  
  42.   if (!file || !/\/(?:jpeg|jpg|png)/i.test(file.type)) {  
  43.     return  
  44.   }  
  45.   const reader = new FileReader()  
  46.   reader.onload = function () {  
  47.     const result = this.result  
  48.     let img = new Image()  
  49.     if (result.length <= maxsize) {  
  50.       toPreviewer(result, cb)  
  51.       return  
  52.     }  
  53.     img.onload = function () {  
  54.       const compresscompressedDataUrl = compress(img, file.type, maxsize / 1024)  
  55.       toPreviewer(compressedDataUrl, cb)  
  56.       img = null  
  57.     }   
  58.     img.src = result  
  59.   }  
  60.   reader.readAsDataURL(file)  
  61.  
  62. export default chooseImg 

關(guān)于使用 canvas 壓縮圖片和使用 FileReader 讀取文件的內(nèi)容在這里就不贅述了,感興趣的讀者可以自行查閱。

回到上一步的 paste.js 函數(shù),把其中的 TODO() 改寫成 chooseImg() 即可: 

  1. const imgEvent = {  
  2.   target: {  
  3.     files: [pasteFile]  
  4.   }  
  5.  
  6. chooseImg(imgEvent, (url) => {  
  7.   resolve(url)  
  8. }) 

回到瀏覽器,如果我們復(fù)制一張圖片并在輸入框中執(zhí)行粘貼的動(dòng)作,將可以在控制臺(tái)看到打印出了以 data:image/png;base64 開頭的圖片地址。

輸入框中插入內(nèi)容

經(jīng)過(guò)前面兩個(gè)步驟,我們后已經(jīng)可以讀取剪貼板中的文本內(nèi)容和圖片內(nèi)容了,接下來(lái)就是把它們正確的插入輸入框的光標(biāo)位置當(dāng)中。

對(duì)于插入內(nèi)容,我們可以直接通過(guò) document.execCommand 方法進(jìn)行。關(guān)于這個(gè)方法詳細(xì)用法可以在MDN文檔里面找到,在這里我們只需要使用 insertText 和 insertImage 即可。 

  1. document.querySelector('.editor').addEventListener('paste', async (e) => {  
  2.     const result = await onPaste(e)  
  3.     const imgRegx = /^data:image\/png;base64,/  
  4.     const command = imgRegx.test(result) ? 'insertImage': 'insertText'   
  5.     document.execCommand(command, false, result)  
  6. }) 

但是在某些版本的 Chrome 瀏覽器下,insertImage 方法可能會(huì)失效,這時(shí)候便可以采用另外一種方法,利用 Selection 來(lái)實(shí)現(xiàn)。而之后選擇并插入 emoji 的操作也會(huì)用到它,因此不妨先來(lái)了解一下。

當(dāng)我們?cè)诖a中調(diào)用 window.getSelection() 后會(huì)獲得一個(gè) Selection 對(duì)象。如果在頁(yè)面中選中一些文字,然后在控制臺(tái)執(zhí)行 window.getSelection().toString(),就會(huì)看到輸出是你所選擇的那部分文字。

與這部分區(qū)域文字相對(duì)應(yīng)的,是一個(gè) range 對(duì)象,使用 window.getSelection().getRangeAt(0) 即可以訪問(wèn)它。range 不僅包含了選中區(qū)域文字的內(nèi)容,還包括了區(qū)域的起點(diǎn)位置 startOffset 和終點(diǎn)位置 endOffset。

我們也可以通過(guò) document.createRange() 的辦法手動(dòng)創(chuàng)建一個(gè) range,往它里面寫入內(nèi)容并展示在輸入框中。

對(duì)于插入圖片來(lái)說(shuō),要先從 window.getSelection() 獲取 range ,然后往里面插入圖片。 

  1. document.querySelector('.editor').addEventListener('paste', async (e) => {  
  2.   // 讀取剪貼板的內(nèi)容  
  3.   const result = await onPaste(e)  
  4.   const imgRegx = /^data:image\/png;base64,/  
  5.   // 如果是圖片格式(base64),則通過(guò)構(gòu)造range的辦法把<img>標(biāo)簽插入正確的位置  
  6.   // 如果是文本格式,則通過(guò)document.execCommand('insertText')方法把文本插入  
  7.   if (imgRegx.test(result)) {  
  8.     const sel = window.getSelection()  
  9.     if (sel && sel.rangeCount === 1 && sel.isCollapsed) {  
  10.       const range = sel.getRangeAt(0)  
  11.       const img = new Image()  
  12.       img.src = result  
  13.       range.insertNode(img)  
  14.       range.collapse(false)  
  15.       sel.removeAllRanges()  
  16.       sel.addRange(range)  
  17.     }  
  18.   } else {  
  19.     document.execCommand('insertText', false, result)  
  20.   }  
  21. }) 

這種辦法也能很好地完成粘貼圖片的功能,并且通用性會(huì)更好。接下來(lái)我們還會(huì)利用 Selection,來(lái)完成 emoji 的插入。

插入 emoji

不管是粘貼文本也好,還是圖片也好,我們的輸入框始終是處于聚焦(focus)狀態(tài)。而當(dāng)我們從表情面板里選擇 emoji 表情的時(shí)候,輸入框會(huì)先失焦(blur),然后再重新聚焦。由于 document.execCommand 方法必須在輸入框聚焦?fàn)顟B(tài)下才能觸發(fā),所以對(duì)于處理 emoji 插入來(lái)說(shuō)就無(wú)法使用了。

上一小節(jié)講過(guò),Selection 可以讓我們拿到聚焦?fàn)顟B(tài)下所選文本的起點(diǎn)位置 startOffset 和終點(diǎn)位置 endOffset,如果沒有選擇文本而僅僅處于聚焦?fàn)顟B(tài),那么這兩個(gè)位置的值相等(相當(dāng)于選擇文本為空),也就是光標(biāo)的位置。只要我們能夠在失焦前記錄下這個(gè)位置,那么就能夠通過(guò) range 把 emoji 插入正確的地方了。

首先編寫兩個(gè)工具方法。新建一個(gè) cursorPosition.js 文件: 

  1. /**  
  2.  * 獲取光標(biāo)位置  
  3.  * @param {DOMElement} element 輸入框的dom節(jié)點(diǎn)  
  4.  * @return {Number} 光標(biāo)位置  
  5.  */  
  6. export const getCursorPosition = (element) => {  
  7.   let caretOffset = 0  
  8.   const doc = element.ownerDocument || element.document  
  9.   const win = doc.defaultView || doc.parentWindow  
  10.   const sel = win.getSelection()  
  11.   if (sel.rangeCount > 0) {  
  12.     const range = win.getSelection().getRangeAt(0)  
  13.     const preCaretRange = range.cloneRange()  
  14.     preCaretRange.selectNodeContents(element)  
  15.     preCaretRange.setEnd(range.endContainer, range.endOffset)  
  16.     caretOffset = preCaretRange.toString().length  
  17.   }  
  18.   return caretOffset  
  19.  
  20. /**  
  21.  * 設(shè)置光標(biāo)位置  
  22.  * @param {DOMElement} element 輸入框的dom節(jié)點(diǎn)  
  23.  * @param {Number} cursorPosition 光標(biāo)位置的值  
  24.  */  
  25. export const setCursorPosition = (element, cursorPosition) => {  
  26.   const range = document.createRange()  
  27.   range.setStart(element.firstChild, cursorPosition)  
  28.   range.setEnd(element.firstChild, cursorPosition)  
  29.   const sel = window.getSelection()  
  30.   sel.removeAllRanges()  
  31.   sel.addRange(range)  

有了這兩個(gè)方法以后,就可以放入 editor 節(jié)點(diǎn)里面使用了。首先在節(jié)點(diǎn)的 keyup 和 click 事件里記錄光標(biāo)位置: 

  1. let cursorPosition = 0  
  2. const editor = document.querySelector('.editor')  
  3. editor.addEventListener('click', async (e) => {  
  4.   cursorPosition = getCursorPosition(editor)  
  5. })  
  6. editor.addEventListener('keyup', async (e) => {  
  7.   cursorPosition = getCursorPosition(editor)  
  8. }) 

記錄下光標(biāo)位置后,便可通過(guò)調(diào)用 insertEmoji() 方法插入 emoji 字符了。 

  1. insertEmoji (emoji) {  
  2.   const text = editor.innerHTML  
  3.   // 插入 emoji  
  4.   editor.innerHTML = text.slice(0, cursorPosition) + emoji + text.slice(cursorPosition, text.length)  
  5.   // 光標(biāo)位置后挪一位,以保證在剛插入的 emoji 后面  
  6.   setCursorPosition(editor, this.cursorPosition + 1)  
  7.   // 更新本地保存的光標(biāo)位置變量(注意 emoji 占兩個(gè)字節(jié)大小,所以要加1)  
  8.   cursorPosition = getCursorPosition(editor) + 1 //  emoji 占兩位  

尾聲

文章涉及的代碼已經(jīng)上傳到倉(cāng)庫(kù),為了簡(jiǎn)便起見采用 VueJS 處理了一下,不影響閱讀。***想說(shuō)的是,這個(gè) Demo 僅僅完成了輸入框最基礎(chǔ)的部分,關(guān)于復(fù)制粘貼還有很多細(xì)節(jié)要處理(比如把別處的行內(nèi)樣式也復(fù)制了進(jìn)來(lái)等等),在這里就不一一展開了,感興趣的讀者可以自行研究,更歡迎和我留言交流~ 

責(zé)任編輯:龐桂玉 來(lái)源: segmentfault
相關(guān)推薦

2010-07-08 14:35:32

UDP協(xié)議

2010-07-13 08:19:10

Linux聊天工具

2011-11-30 10:48:21

2022-02-12 12:18:59

Delta Chat聊天應(yīng)用開源

2011-12-21 17:39:03

imo即時(shí)通訊

2011-06-27 10:58:31

Qt 局域網(wǎng) 聊天

2017-05-10 11:10:15

LinuxUbuntuDiscord

2014-09-01 10:33:34

2015-04-27 14:29:53

C#UDP實(shí)現(xiàn)P2P語(yǔ)音聊天工具

2012-02-20 09:57:12

2011-12-15 10:30:51

即時(shí)通訊imo

2021-09-27 14:44:48

鴻蒙HarmonyOS應(yīng)用

2022-02-12 10:39:59

FBI網(wǎng)絡(luò)犯罪加密

2016-04-29 17:41:53

北信源/企業(yè)IM

2020-09-24 14:06:19

Vue

2011-03-30 20:44:46

上網(wǎng)行為管理管理策略網(wǎng)康科技

2020-12-23 11:45:27

鴻蒙HarmonyOSTextField組件

2010-10-26 14:41:18

2009-04-17 09:30:33

Firefox插件瀏覽器

2023-02-15 14:07:03

點(diǎn)贊
收藏

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

91精品观看| 欧美在线一级| 欧美国产日产图区| 444亚洲人体| 99久在线精品99re8热| 日韩电影不卡一区| 欧美日韩国产bt| 久久久成人精品| 欧美xxxxx少妇| 91伊人久久| 亚洲成人久久影院| 亚洲欧洲一区二区| 天天干天天色天天| 久久er99热精品一区二区| 国外成人在线播放| 又嫩又硬又黄又爽的视频| 成人黄色av网址| 色老汉一区二区三区| 一级性生活视频| 国产高清视频在线播放| 欧美日韩一视频区二区| 亚洲美女在线看| 特黄特黄一级片| 成人精品三级| 福利微拍一区二区| 欧美久久久久久久久久久久久久| 国产在线观看免费网站| 成人av资源在线观看| 国产欧美精品xxxx另类| 亚洲天堂av片| 亚洲二区免费| 欧美精品在线极品| 国产又粗又猛大又黄又爽| 国产综合色区在线观看| 亚洲线精品一区二区三区八戒| 午夜精品一区二区在线观看 | 午夜一区二区三区不卡视频| 日韩午夜在线观看| 国产色视频在线播放| 竹内纱里奈兽皇系列在线观看| 一区二区三区精品视频在线| 亚洲一区二区三区精品在线观看| 国产最新视频在线| 久久久精品日韩欧美| 久久99精品久久久久久久久久| 性一交一乱一透一a级| 国内精品伊人久久久久影院对白| 国产精品欧美日韩一区二区| 久久久精品毛片| 久久久www| 日本人成精品视频在线| 天堂网一区二区三区| 欧美一级视频| 国产91精品高潮白浆喷水| 天海翼一区二区| 亚洲精品黄色| 亚洲人成网站色ww在线| 人妻精品久久久久中文字幕| 国产福利一区二区精品秒拍| 亚洲成人777| 国产aaa免费视频| 丝袜美腿av在线| 国产亚洲一二三区| 欧美不卡在线一区二区三区| 久草福利在线| 国产精品久久久久影视| 成人蜜桃视频| 色噜噜在线播放| youjizz国产精品| 久久久久欧美| av基地在线| 亚洲欧美日韩小说| 国产无限制自拍| 欧美美女日韩| 欧美午夜免费电影| 国模大尺度视频| 国产传媒在线观看| 日韩欧美亚洲成人| 欧美成年人视频在线观看| 99精品国产九九国产精品| 欧美大胆人体bbbb| aa片在线观看视频在线播放| 精品国产乱码| 欧美成人午夜剧场免费观看| 日本视频免费在线| 免费精品视频在线| julia一区二区中文久久94| 日本熟女毛茸茸| 精品影视av免费| 国严精品久久久久久亚洲影视| 国产又黄又粗又硬| 国产黄色91视频| 免费在线观看一区二区| 午夜精品一区| 精品国产91久久久| 中文字幕在线视频精品| 色天下一区二区三区| 久久黄色av网站| 国产又爽又黄的视频| 九九九久久久精品| 九色一区二区| caoporn97在线视频| 色综合色综合色综合色综合色综合 | 伊人久久国产精品| 成人动漫在线一区| 亚洲欧洲一区二区| 成人香蕉视频| 欧美成人三级在线| 久久久久亚洲AV成人无在| 亚洲国产日韩欧美一区二区三区| 国产精品久久一区| 日本福利午夜视频在线| 亚洲理论在线观看| 蜜臀av免费观看| 免费高清视频在线一区| 精品国产一区二区三区不卡| 极品尤物一区二区| 亚洲伊人网站| 国产在线精品一区二区三区》 | 国产精品国产| 久久亚洲国产成人| 国产精品51麻豆cm传媒| 日精品一区二区三区| 日本久久久久久久久| 亚洲AV无码乱码国产精品牛牛| 欧美经典一区二区三区| 亚洲自偷自拍熟女另类| 国产精伦一区二区三区| 久久91超碰青草是什么| 91黄色在线视频| 欧美国产欧美亚州国产日韩mv天天看完整| 水蜜桃色314在线观看| 亚洲精品黑牛一区二区三区| 中文字幕自拍vr一区二区三区| 亚洲AV无码成人精品区东京热| 成人免费视频网站在线观看| 丰满女人性猛交| 激情久久一区二区| 丝袜亚洲另类欧美重口| 日韩国产成人在线| 国产欧美日本一区视频| 国产日韩一区二区在线观看| 四虎影视精品| 欧美有码在线观看| 男同在线观看| 色香蕉成人二区免费| 少妇毛片一区二区三区| 性伦欧美刺激片在线观看| 久久亚洲综合网| 波多视频一区| 亚洲男人天堂古典| 无码人妻精品一区二区三区不卡 | 久久精品国产99国产| 亚洲高清视频一区二区| 日本午夜精品久久久久| 鲁大师成人一区二区三区| 欧美性xxxx在线播放| 久久久久亚洲av成人网人人软件| 欧美黄色一区| 国产欧美丝袜| 少妇淫片在线影院| 亚洲欧美国产精品va在线观看| 一级片视频在线观看| 久久精品在线免费观看| 男人舔女人下面高潮视频| 国产毛片一区二区三区| 在线成人激情视频| 中文字幕第99页| 亚洲三级在线看| 波多野结衣办公室双飞| 亚洲理伦在线| 日韩av图片| 国产精品成人**免费视频| 欧美福利视频网站| 十九岁完整版在线观看好看云免费| 精品国产精品自拍| 欧美性受xxxx黑人| 国产福利91精品一区| 日本福利视频在线| 国产欧美一区二区三区精品观看| 国产精品一区电影| 欧美aaaaaaa| 欧美三级三级三级| 农村黄色一级片| aaa国产一区| 少妇黄色一级片| 国产精品hd| 日韩色妇久久av| 中文字幕一区二区三区中文字幕| 欧美中在线观看| 黄色免费在线网站| 亚洲激情小视频| 一级片aaaa| 午夜欧美2019年伦理| 日本r级电影在线观看| 亚洲一级一区| 伊人久久大香线蕉av一区| 久久综合社区| 成人激情免费在线| 在线看黄色av| 欧美va亚洲va在线观看蝴蝶网| 特级西西444www大精品视频免费看| 国产精品久久久久aaaa樱花 | 青青在线视频| 在线看欧美日韩| 日本黄色三级视频| 欧美巨大另类极品videosbest | 美女色狠狠久久| 欧美激情va永久在线播放| 91网页在线观看| 亚洲精品中文字幕av| 免费观看一区二区三区毛片| 1000部国产精品成人观看| 好吊视频在线观看| 成人精品电影在线观看| 特级西西444www| 免费看欧美女人艹b| 青青草原av在线播放| 亚洲五月婷婷| 日韩精品一区二区三区电影| 欧美精选视频在线观看| 久久精品中文字幕一区二区三区| 欧美午夜在线播放| 国产亚洲日本欧美韩国| 欧美 日韩 国产 成人 在线| 91精品欧美久久久久久动漫| 天堂网av手机版| 亚洲国产一二三| 青青青在线视频| **欧美大码日韩| 少妇的滋味中文字幕bd| 亚洲国产成人自拍| 一区二区三区伦理片| 日本伊人午夜精品| 丰满少妇被猛烈进入高清播放| 激情偷拍久久| 中文字幕人妻熟女人妻洋洋| 在线精品国产| 精品日韩在线播放| 国产精品久久久久久| 亚洲最大免费| 99久久夜色精品国产亚洲狼 | 欧美日韩亚洲一区三区| 国产精品无码电影在线观看| 91精品国产福利在线观看麻豆| 亚洲高清视频一区二区| 久久视频国产| av磁力番号网| 欧美激情日韩| 免费拍拍拍网站| 亚洲伦理一区| 97国产精东麻豆人妻电影 | 日韩永久免费视频| 亚洲国产精品人人爽夜夜爽| 亚洲aaa在线观看| 亚洲欧美制服综合另类| 成人午夜在线观看视频| 中文字幕精品—区二区| 日日夜夜精品一区| 久久精品亚洲94久久精品| a天堂中文在线官网在线| 精品自在线视频| 国产免费观看av| 欧美激情在线一区二区| 亚洲国产精品一区二区久久hs| 日韩一区欧美小说| 欧美色图一区二区| 黄色成人在线免费| 老熟妇一区二区三区啪啪| 欧美视频一二三区| 国产欧美综合视频| 五月激情综合色| 国产精品免费精品一区| 欧美视频日韩视频在线观看| 一级做a爱片性色毛片| 欧美一级免费大片| 人妻与黑人一区二区三区| 亚洲欧美日韩中文视频| 麻豆网站视频在线观看| 久久久视频在线| 大胆人体一区| 成人在线免费观看视视频| 免费一级欧美在线观看视频| 亚洲tv在线观看| 伊人久久大香线蕉| 亚洲精品影院| 亚洲第一在线| 韩国视频一区二区三区| 国产成人精品三级| 丝袜美腿中文字幕| 一区二区在线免费| xxxx.国产| 91精品欧美久久久久久动漫| 欧美一级性视频| 一区二区三区国产视频| 久久免费电影| 国产精品无av码在线观看| 日韩三级精品| 日本福利一区二区三区| 欧美二区视频| 日韩在线视频在线观看| 国产精品综合一区二区| 91成年人网站| 亚洲高清不卡在线| 国产精品丝袜黑色高跟鞋| 国产偷国产偷亚洲清高网站| 国产黄色在线观看| 国产成人精品综合| 国产乱论精品| 成年人三级视频| 日韩精品1区2区3区| av天堂一区二区| 中文字幕中文在线不卡住| youjizz在线视频| 日韩欧美色综合| 亚洲成a人v欧美综合天堂麻豆| 51久久精品夜色国产麻豆| 久久久久亚洲精品中文字幕| 欧美在线视频二区| 亚洲激情婷婷| 九九热视频免费| 国产精品久久久久一区二区三区 | 国产高清一区二区三区视频| 国产999精品久久久影片官网| 国产精品传媒| 18黄暴禁片在线观看| 国产一区二区三区国产| eeuss中文字幕| 在线观看欧美精品| 欧美美女搞黄| 97成人超碰免| www.成人网| 9191国产视频| 国产成人一区在线| 婷婷社区五月天| 欧美伦理视频网站| 免费a级在线播放| 国产精品欧美一区二区三区奶水| 精品国产a一区二区三区v免费| 97国产精东麻豆人妻电影| 91在线精品一区二区| 久久综合久久鬼| 香蕉成人啪国产精品视频综合网| 国产绳艺sm调教室论坛| 久久久国产精彩视频美女艺术照福利| 成人午夜亚洲| 亚洲成人第一| 蜜臂av日日欢夜夜爽一区| 少妇av片在线观看| 在线亚洲人成电影网站色www| 九色网友自拍视频手机在线| 日产精品99久久久久久| 国产精品日韩精品中文字幕| 国产裸体免费无遮挡| 久久97超碰国产精品超碰| 久久综合久久久久| proumb性欧美在线观看| 国产精品国产三级国产专区52| 亚洲男人7777| 国产亚洲精品精品国产亚洲综合| 亚洲综合首页| 国产成a人无v码亚洲福利| 国产亚洲精久久久久久无码77777| 欧美tickling网站挠脚心| 99色在线观看| 欧美三日本三级少妇三99| 秋霞午夜鲁丝一区二区老狼| av在线播放中文字幕| 日韩一区二区三区在线| 国产777精品精品热热热一区二区| 久久久久久久免费| 美国av一区二区| 国产精品视频一区二区三 | 免费看黄色aaaaaa 片| 在线观看日韩精品| 高h视频在线观看| 国产精品一区二区免费看| 99视频精品免费观看| a级片在线观看| 色先锋资源久久综合| 国产最新在线| 国产亚洲自拍偷拍| 日韩精品视频网站| 特级片在线观看| 精品无人国产偷自产在线| 伊人亚洲精品| 久久久999视频| 中文字幕在线观看不卡| 欧美性受xxxx狂喷水| 国产精品嫩草影院久久久| 欧美成人一区二免费视频软件| 特大黑人巨人吊xxxx| 色94色欧美sute亚洲线路二| 黄色免费在线看| 久久99精品久久久水蜜桃| 久久成人免费网| 国产女同在线观看| 久久精品国产亚洲精品2020| 欧美大胆视频| 黄色aaaaaa|