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

網(wǎng)頁(yè)中文本朗讀功能開(kāi)發(fā)實(shí)現(xiàn)分享

開(kāi)發(fā) 前端
前幾天完成了一個(gè)需求,在網(wǎng)頁(yè)中完成鼠標(biāo)指向哪里,就用語(yǔ)音讀出所指的文本。如果是按鈕、鏈接、文本輸入框,則還還要給出是什么的提醒。同時(shí)針對(duì)大段的文本,不能整段的去讀,要按照標(biāo)點(diǎn)符號(hào)進(jìn)行斷句處理。

[[212817]]

前幾天完成了一個(gè)需求,在網(wǎng)頁(yè)中完成鼠標(biāo)指向哪里,就用語(yǔ)音讀出所指的文本。如果是按鈕、鏈接、文本輸入框,則還還要給出是什么的提醒。同時(shí)針對(duì)大段的文本,不能整段的去讀,要按照標(biāo)點(diǎn)符號(hào)進(jìn)行斷句處理。

重點(diǎn)當(dāng)然就是先獲取到當(dāng)前標(biāo)簽上的文本,再把文本轉(zhuǎn)化成語(yǔ)音即可。

標(biāo)簽朗讀

這個(gè)很簡(jiǎn)單了,只用根據(jù)當(dāng)前是什么標(biāo)簽,給出提示即可。

  1. // 標(biāo)簽朗讀文本 
  2. var tagTextConfig = { 
  3.     'a''鏈接'
  4.     'input[text]''文本輸入框'
  5.     'input[password]''密碼輸入框'
  6.     'button''按鈕'
  7.     'img''圖片' 
  8. }; 

還有需要朗讀的標(biāo)簽,繼續(xù)再添加即可。

然后根據(jù)標(biāo)簽,返回前綴文本即可。

  1. /** 
  2. * 獲取標(biāo)簽朗讀文本 
  3. * @param {HTMLElement} el 要處理的HTMLElement 
  4. * @returns {String}   朗讀文本 
  5. */ 
  6. function getTagText(el) { 
  7.     if (!el) return ''
  8.  
  9.     var tagName = el.tagName.toLowerCase(); 
  10.  
  11.     // 處理input等多屬性元素 
  12.     switch (tagName) { 
  13.         case 'input'
  14.             tagName += '[' + el.type + ']'
  15.             break; 
  16.         default
  17.             break; 
  18.     } 
  19.  
  20.     // 標(biāo)簽的功能提醒和作用應(yīng)該有間隔,因此在***加入一個(gè)空格 
  21.     return (tagTextConfig[tagName] || '') + ' '

獲取完整的朗讀文本就更簡(jiǎn)單了,先取標(biāo)簽的功能提醒,再取標(biāo)簽的文本即可。

文本內(nèi)容優(yōu)先取 title 其次 alt *** innerText

  1. /** 
  2. * 獲取完整朗讀文本 
  3. * @param {HTMLElement} el 要處理的HTMLElement 
  4. * @returns {String}   朗讀文本 
  5. */ 
  6. function getText(el) { 
  7.     if (!el) return ''
  8.  
  9.     return getTagText(el) + (el.title || el.alt || el.innerText || ''); 

這樣就可以獲取到一個(gè)標(biāo)簽的功能提醒和內(nèi)容的全部帶朗讀文本了。

正文分隔

接下來(lái)要處理的就是正文分隔了,在這個(gè)過(guò)程中,踩了不少坑,走了不少?gòu)澛?,好好記錄一下?/p>

首先準(zhǔn)備了正文分隔的配置:

  1. // 正文拆分配置 
  2. var splitConfig = { 
  3.     // 內(nèi)容分段標(biāo)簽名稱(chēng) 
  4.     unitTag: 'p'
  5.     // 正文中分隔正則表達(dá)式 
  6.     splitReg: /[,;,;。]/g, 
  7.     // 包裹標(biāo)簽名 
  8.     wrapTag: 'label'
  9.     // 包裹標(biāo)簽類(lèi)名 
  10.     wrapCls: 'speak-lable'
  11.     // 高亮樣式名和樣式 
  12.     hightlightCls: 'speak-help-hightlight'
  13.     hightStyle: 'background: #000!important; color: #fff!important' 
  14. }; 

最開(kāi)始想的就是直接按照正文中的分隔標(biāo)點(diǎn)符號(hào)進(jìn)行分隔就好了呀。

想法如下:

  1. 獲取段落全部文本

  2. 使用 split(分隔正則表達(dá)式) 方法將正文按照標(biāo)點(diǎn)符號(hào)分隔成小段

  3. 每個(gè)小段用標(biāo)簽包裹放回去即可

然而理想很豐滿(mǎn),現(xiàn)實(shí)很骨感。

兩個(gè)大坑如下:

  1. split 方法進(jìn)行分隔,分隔后分隔字符就丟了,也就是說(shuō)把原文的一些標(biāo)點(diǎn)符號(hào)給弄丟了。

  2. 如果段落內(nèi)還存在其他標(biāo)簽,而這個(gè)標(biāo)簽內(nèi)部也正好存在待分隔的標(biāo)點(diǎn)符號(hào),那包裹分段標(biāo)簽時(shí)直接破換了原標(biāo)簽的完整性。

關(guān)于***個(gè)問(wèn)題,丟失標(biāo)點(diǎn)的符號(hào),考慮過(guò)逐個(gè)標(biāo)點(diǎn)來(lái)進(jìn)行和替換 split 分隔方法為逐個(gè)字符循環(huán)來(lái)做。

前者問(wèn)題是原本一次完成的工作分成了多次,效率太低。第二種感覺(jué)效率更低了,分隔本來(lái)是很稀疏的,但是卻要變成逐個(gè)字符出判斷處理,更關(guān)鍵的是,分隔標(biāo)點(diǎn)的位置要插入包裹標(biāo)簽,會(huì)導(dǎo)致字符串長(zhǎng)度變化,還要處理下標(biāo)索引。代碼是機(jī)器跑的,或許不會(huì)覺(jué)得煩,但是我真的覺(jué)得好煩。如果這么干,或許以后哪個(gè)AI或者同事看到這樣的代碼,說(shuō)不定會(huì)說(shuō)“這真是個(gè)傻xxxx”。

第二個(gè)問(wèn)題想過(guò)很多辦法來(lái)補(bǔ)救,如先使用正則匹配捕獲內(nèi)容中成對(duì)的標(biāo)簽,對(duì)標(biāo)簽內(nèi)部的分隔先處理一遍,然后再處理整個(gè)的。

想不明白問(wèn)題二的,可參考一下待分隔的段落:

<p>這是一段測(cè)試文本,這里有個(gè)鏈接。<a>您好,可以點(diǎn)擊此處進(jìn)行跳轉(zhuǎn)</a>還有其他內(nèi)容其他內(nèi)容容其他內(nèi)容容其他內(nèi)容,容其他內(nèi)容。</p>

如先使用/<((\w+?)>)(.+?)<\/\2(?=>)/g 正則,依次捕獲段落內(nèi)被標(biāo)簽包裹的內(nèi)容,對(duì)標(biāo)簽內(nèi)部的內(nèi)容先處理。

但是問(wèn)題又來(lái)了,這么處理的都是字符串,在js中都是基本類(lèi)型,這些操作進(jìn)行的時(shí)候都是在復(fù)制的基礎(chǔ)上進(jìn)行的,要修改到原字符串里去,還得記錄下原本的開(kāi)始結(jié)束位置,再將新的插進(jìn)去。繁,還是繁,但是已經(jīng)比之前逐個(gè)字符去遍歷的好,正則捕獲中本來(lái)就有了匹配的索引,直接用即可,還能接受。

但是這只是處理了段落內(nèi)部標(biāo)簽的問(wèn)題,段落內(nèi)肯定還有很多文本是沒(méi)有處理呢,怎么辦?

正則匹配到了只是段落內(nèi)標(biāo)簽的結(jié)果啊,外面的沒(méi)有啊。哦,對(duì),有匹配到的索引,上次匹配到的位置加上上次處理的長(zhǎng)度,就是一段直接文本的開(kāi)始。下一次匹配到的索引-1就是這段直接文本的結(jié)束。這只是匹配過(guò)程中的,還有首尾要單獨(dú)處理。又回到煩的老路上去了。。。

這么煩,一個(gè)段落分隔能這么繁瑣,我不信!

突然想到了,有文本節(jié)點(diǎn)這么個(gè)東西,刪繁就簡(jiǎn)嘛,正則先到邊上去,直接處理段落的所有節(jié)點(diǎn)不就行了。

文本節(jié)點(diǎn)則分隔直接包裹,標(biāo)簽節(jié)點(diǎn)則對(duì)內(nèi)容進(jìn)行包裹,這種情況下處理的直接是dom,更省事。

文本節(jié)點(diǎn)里放標(biāo)簽?這是在開(kāi)玩笑么,是也不是。文本節(jié)點(diǎn)里確實(shí)只能放文本,但是我把標(biāo)簽直接放進(jìn)去,它會(huì)自動(dòng)轉(zhuǎn)義,那***再替換出來(lái)不就行了。

好了,方案終于有了,而且這個(gè)方案邏輯多簡(jiǎn)單,代碼邏輯自然也不會(huì)煩。

 

  1. /** 
  2. * 正文內(nèi)容分段處理 
  3. * @param {jQueryObject/HTMLElement/String}  $content 要處理的正文jQ對(duì)象或HTMLElement或其對(duì)應(yīng)選擇器 
  4. */ 
  5. function splitConent($content) { 
  6.     $content = $($content); 
  7.  
  8.     $content.find(splitConfig.unitTag).each(function (index, item) { 
  9.         var $item = $(item), 
  10.             text = $.trim($item.text()); 
  11.         if (!text) return
  12.  
  13.         var nodes = $item[0].childNodes; 
  14.  
  15.         $.each(nodes, function (i, node) { 
  16.             switch (node.nodeType) { 
  17.                 case 3: 
  18.                     // text 節(jié)點(diǎn) 
  19.                     // 由于是文本節(jié)點(diǎn),標(biāo)簽被轉(zhuǎn)義了,后續(xù)再轉(zhuǎn)回來(lái) 
  20.                     node.data = '<' + splitConfig.wrapTag + '>' + 
  21.                         node.data.replace(splitConfig.splitReg, '</' + splitConfig.wrapTag + '>$&<' + splitConfig.wrapTag + '>') + 
  22.                         '</' + splitConfig.wrapTag + '>'
  23.                     break; 
  24.                 case 1: 
  25.                     // 元素節(jié)點(diǎn) 
  26.                     var innerHtml = node.innerHTML, 
  27.                         start = ''
  28.                         end = ''
  29.                     // 如果內(nèi)部還有直接標(biāo)簽,先去掉 
  30.                     var startResult = /^<\w+?>/.exec(innerHtml); 
  31.                     if (startResult) { 
  32.                         start = startResult[0]; 
  33.                         innerHtml = innerHtml.substr(start.length); 
  34.                     } 
  35.                     var endResult = /<\/\w+?>$/.exec(innerHtml); 
  36.                     if (endResult) { 
  37.                         end = endResult[0]; 
  38.                         innerHtml = innerHtml.substring(0, endResult.index); 
  39.                     } 
  40.                     // 更新內(nèi)部?jī)?nèi)容 
  41.                     node.innerHTML = start + 
  42.                         '<' + splitConfig.wrapTag + '>' + 
  43.                         innerHtml.replace(splitConfig.splitReg, '</' + splitConfig.wrapTag + '>$&<' + splitConfig.wrapTag + '>') + 
  44.                         '</' + splitConfig.wrapTag + '>' + 
  45.                         end
  46.                     break; 
  47.                 default
  48.                     break; 
  49.             } 
  50.         }); 
  51.  
  52.         // 處理文本節(jié)點(diǎn)中被轉(zhuǎn)義的html標(biāo)簽 
  53.         $item[0].innerHTML = $item[0].innerHTML 
  54.             .replace(new RegExp('&lt;' + splitConfig.wrapTag + '&gt;''g'), '<' + splitConfig.wrapTag + '>'
  55.             .replace(new RegExp('&lt;/' + splitConfig.wrapTag + '&gt;''g'), '</' + splitConfig.wrapTag + '>'); 
  56.         $item.find(splitConfig.wrapTag).addClass(splitConfig.wrapCls); 
  57.     }); 

上面代碼中***對(duì)文本節(jié)點(diǎn)中被轉(zhuǎn)義的包裹標(biāo)簽替換似乎有點(diǎn)麻煩,但是沒(méi)辦法,ES5之前JavaScript并不支持正則的后行斷言(也就是正則表達(dá)式中“后顧”)。所以沒(méi)辦法對(duì)包裹標(biāo)簽前后的 &lt;&gt; 進(jìn)行精準(zhǔn)替換,只能連同標(biāo)簽名一起替換。

事件處理

在上面完成了文本獲取和段落分隔,下面要做的就是鼠標(biāo)移動(dòng)上去時(shí)獲取文本觸發(fā)朗讀即可,移開(kāi)時(shí)停止朗讀即可。

鼠標(biāo)移動(dòng),只讀一次,基于這兩點(diǎn)原因,使用 mouseentermouseleave 事件來(lái)完成。

原因:

  1. 不冒泡,不會(huì)觸發(fā)父元素的再次朗讀

  2. 不重復(fù)觸發(fā),一個(gè)元素內(nèi)移動(dòng)時(shí)不會(huì)重復(fù)觸發(fā)。

  1. /** 
  2. * 在頁(yè)面上寫(xiě)入高亮樣式 
  3. */ 
  4. function createStyle() { 
  5.     if (document.getElementById('speak-light-style')) return
  6.  
  7.     var style = document.createElement('style'); 
  8.     style.id = 'speak-light-style'
  9.     style.innerText = '.' + splitConfig.hightlightCls + '{' + splitConfig.hightStyle + '}'
  10.     document.getElementsByTagName('head')[0].appendChild(style); 
  11. // 非正文需要朗讀的標(biāo)簽 逗號(hào)分隔 
  12. var speakTags = 'a, p, span, h1, h2, h3, h4, h5, h6, img, input, button'
  13.  
  14. $(document).on('mouseenter.speak-help', speakTags, function (e) { 
  15.     var $target = $(e.target); 
  16.  
  17.     // 排除段落內(nèi)的 
  18.     if ($target.parents('.' + splitConfig.wrapCls).length || $target.find('.' + splitConfig.wrapCls).length) { 
  19.         return
  20.     } 
  21.  
  22.     // 圖片樣式單獨(dú)處理 其他樣式統(tǒng)一處理 
  23.     if (e.target.nodeName.toLowerCase() === 'img') { 
  24.         $target.css({ 
  25.             border: '2px solid #000' 
  26.         }); 
  27.     } else { 
  28.         $target.addClass(splitConfig.hightlightCls); 
  29.     } 
  30.  
  31.     // 開(kāi)始朗讀 
  32.     speakText(getText(e.target)); 
  33.  
  34. }).on('mouseleave.speak-help', speakTags, function (e) { 
  35.     var $target = $(e.target); 
  36.     if ($target.find('.' + splitConfig.wrapCls).length) { 
  37.         return
  38.     } 
  39.  
  40.     // 圖片樣式 
  41.     if (e.target.nodeName.toLowerCase() === 'img') { 
  42.         $target.css({ 
  43.             border: 'none' 
  44.         }); 
  45.     } else { 
  46.         $target.removeClass(splitConfig.hightlightCls); 
  47.     } 
  48.  
  49.     // 停止語(yǔ)音 
  50.     stopSpeak(); 
  51. }); 
  52.  
  53. // 段落內(nèi)文本朗讀 
  54. $(document).on('mouseenter.speak-help''.' + splitConfig.wrapCls, function (e) { 
  55.     $(this).addClass(splitConfig.hightlightCls); 
  56.  
  57.     // 開(kāi)始朗讀 
  58.     speakText(getText(this)); 
  59. }).on('mouseleave.speak-help''.' + splitConfig.wrapCls, function (e) { 
  60.     $(this).removeClass(splitConfig.hightlightCls); 
  61.  
  62.     // 停止語(yǔ)音 
  63.     stopSpeak(); 
  64. }); 

注意要把針對(duì)段落的語(yǔ)音處理和其他地方的分開(kāi)。為什么? 因?yàn)槎温涫莻€(gè)塊級(jí)元素,鼠標(biāo)移入段落中的空白時(shí),如:段落前后空白、首行縮進(jìn)、末行剩余空白等,是不應(yīng)該觸發(fā)朗讀的,如果不阻止掉,進(jìn)行這些區(qū)域?qū)⒅苯佑|發(fā)整段文字的朗讀,失去了我們對(duì)段落文本內(nèi)分隔的意義,而且,無(wú)論什么方式轉(zhuǎn)化語(yǔ)音都是要時(shí)間的,大段內(nèi)容可能需要較長(zhǎng)時(shí)間,影響語(yǔ)音輸出的體驗(yàn)。

文本合成語(yǔ)音

上面我們是直接使用了 speakText(text)stopSpeak() 兩個(gè)方法來(lái)觸發(fā)語(yǔ)音的朗讀和停止。

我們來(lái)看下如何實(shí)現(xiàn)這個(gè)兩個(gè)功能。

其實(shí)現(xiàn)代瀏覽器默認(rèn)已經(jīng)提供了上面功能:

  1. var speechSU = new window.SpeechSynthesisUtterance(); 
  2. speechSU.text = '你好,世界!'
  3. window.speechSynthesis.speak(speechSU); 

復(fù)制到瀏覽器控制臺(tái)看看能不能聽(tīng)到聲音呢?(需要Chrome 33+、Firefox 49+ 或 IE-Edge)

利用一下兩個(gè)API即可:

  • SpeechSynthesisUtterance 用于語(yǔ)音合成

    • lang : 語(yǔ)言 Gets and sets the language of the utterance.

    • pitch : 音高 Gets and sets the pitch at which the utterance will be spoken at.

    • rate : 語(yǔ)速 Gets and sets the speed at which the utterance will be spoken at.

    • text : 文本 Gets and sets the text that will be synthesised when the utterance is spoken.

    • voice : 聲音 Gets and sets the voice that will be used to speak the utterance.

    • volume : 音量 Gets and sets the volume that the utterance will be spoken at.

    • onboundary : 單詞或句子邊界觸發(fā),即分隔處觸發(fā) Fired when the spoken utterance reaches a word or sentence boundary.

    • onend : 結(jié)束時(shí)觸發(fā) Fired when the utterance has finished being spoken.

    • onerror : 錯(cuò)誤時(shí)觸發(fā) Fired when an error occurs that prevents the utterance from being succesfully spoken.

    • onmark : Fired when the spoken utterance reaches a named SSML "mark" tag.

    • onpause : 暫停時(shí)觸發(fā) Fired when the utterance is paused part way through.

    • onresume : 重新播放時(shí)觸發(fā) Fired when a paused utterance is resumed.

    • onstart : 開(kāi)始時(shí)觸發(fā) Fired when the utterance has begun to be spoken.

  • SpeechSynthesis : 用于朗讀

    • paused : Read only 是否暫停 A Boolean that returns true if the SpeechSynthesis object is in a paused state.

    • pending : Read only 是否處理中 A Boolean that returns true if the utterance queue contains as-yet-unspoken utterances.

    • speaking : Read only 是否朗讀中 A Boolean that returns true if an utterance is currently in the process of being spoken — even if SpeechSynthesis is in a paused state.

    • onvoiceschanged : 聲音變化時(shí)觸發(fā)

    • cancel() : 情況待朗讀隊(duì)列 Removes all utterances from the utterance queue.

    • getVoices() : 獲取瀏覽器支持的語(yǔ)音包列表 Returns a list of SpeechSynthesisVoice objects representing all the available voices on the current device.

    • pause() : 暫停 Puts the SpeechSynthesis object into a paused state.

    • resume() : 重新開(kāi)始 Puts the SpeechSynthesis object into a non-paused state: resumes it if it was already paused.

    • speak() : 讀合成的語(yǔ)音,參數(shù)必須為SpeechSynthesisUtterance的實(shí)例 Adds an utterance to the utterance queue; it will be spoken when any other utterances queued before it have been spoken.

詳細(xì)api和說(shuō)明可參考:

那么上面的兩個(gè)方法可以寫(xiě)為:

 

  1. var speaker = new window.SpeechSynthesisUtterance(); 
  2. var speakTimer, 
  3.     stopTimer; 
  4.  
  5. // 開(kāi)始朗讀 
  6. function speakText(text) { 
  7.     clearTimeout(speakTimer); 
  8.     window.speechSynthesis.cancel(); 
  9.     speakTimer = setTimeout(function () { 
  10.         speaker.text = text; 
  11.         window.speechSynthesis.speak(speaker); 
  12.     }, 200); 
  13.  
  14. // 停止朗讀 
  15. function stopSpeak() { 
  16.     clearTimeout(stopTimer); 
  17.     clearTimeout(speakTimer); 
  18.     stopTimer = setTimeout(function () { 
  19.         window.speechSynthesis.cancel(); 
  20.     }, 20); 

因?yàn)檎Z(yǔ)音合成本來(lái)是個(gè)異步的操作,因此在過(guò)程中進(jìn)行以上處理。

現(xiàn)代瀏覽器已經(jīng)內(nèi)置了這個(gè)功能,兩個(gè)API接口兼容性如下:

Feature

Chrome

Edge

Firefox (Gecko)

Internet Explorer

Opera

Safari

(WebKit) Basic

support 33

(Yes)

49 (49)

No support

?

7

如果要兼容其他瀏覽器或者需要一種***兼容的解決方案,可能就需要服務(wù)端完成了,根據(jù)給定文本,返回相應(yīng)語(yǔ)音即可,百度語(yǔ)音 http://yuyin.baidu.com/docs就提供這樣的服務(wù)。

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

2012-03-07 14:37:03

JavaJavaMail

2012-11-05 10:36:40

IBMdw

2023-04-26 09:37:25

智駕開(kāi)發(fā)

2021-11-02 10:10:49

鴻蒙HarmonyOS應(yīng)用

2024-08-05 09:51:00

2024-08-08 08:31:32

SpringNeo4j優(yōu)化

2023-02-28 15:49:09

鴻蒙應(yīng)用開(kāi)發(fā)

2022-08-09 16:01:24

應(yīng)用開(kāi)發(fā)鴻蒙

2010-02-05 18:09:28

C++ Doxygen

2024-07-26 10:50:51

SpringScrew數(shù)據(jù)庫(kù)

2022-12-01 17:46:53

網(wǎng)頁(yè)變灰功能前端

2012-02-08 17:01:36

2016-08-11 08:24:39

AndroidIntentShareTestDe

2010-01-27 18:06:03

Android短信發(fā)送

2012-03-08 21:51:45

Siri

2010-06-10 17:47:48

Zabbix中文

2010-08-30 14:03:59

CSS

2020-12-30 09:35:20

EuiAdmin后端vue框架

2021-12-09 11:58:35

Edge操作系統(tǒng)微軟

2022-01-23 08:26:57

微信暫停語(yǔ)音朗讀文字
點(diǎn)贊
收藏

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

在线成人av观看| 黄色三级网站在线观看| 日韩美女一区二区三区在线观看| 欧美日韩国产美| 超碰10000| 午夜av免费观看| 免费成人在线观看| 欧美国产激情18| 亚洲国产天堂av| 日韩一二三区在线观看| 欧美性高潮在线| 手机在线视频你懂的| 香港一级纯黄大片| 国产一区二区在线电影| 欧美有码在线观看视频| 亚洲人做受高潮| 欧美性生活一级片| 欧美一区二区三区在线看| 777久久久精品一区二区三区| 中文字幕在线视频区| 成人免费看视频| 国产啪精品视频| 五月天综合激情| 欧美国产91| 中文字幕日韩欧美| 国产精品密蕾丝袜| 都市激情久久| 91精品婷婷国产综合久久竹菊| 亚洲熟妇av一区二区三区| 美足av综合网| 亚洲日本在线天堂| 亚洲精品成人三区| 国产一级片在线| 99久久精品久久久久久清纯| 91久久偷偷做嫩草影院| 97超碰人人草| 久久精品国产亚洲a| 国产91九色视频| 欧美精品二区三区| 在线日韩av| 色综合男人天堂| 欧美成人精品欧美一级私黄| 99九九热只有国产精品| 亚洲图片在线综合| 30一40一50老女人毛片| 欧美一性一交| 亚洲国产精品久久久久秋霞不卡| 色播五月激情五月| 国产91亚洲精品久久久| 欧美中文字幕一区二区三区 | 午夜激情小视频| 国产福利不卡视频| 99电影网电视剧在线观看| 国产精品女人久久久| 蜜臀久久99精品久久久久宅男| 日韩美女视频在线观看| 无码人妻久久一区二区三区| 国产精品永久| 国产999精品视频| 精品一区二区无码| 免费在线观看精品| 国产欧美精品va在线观看| 最近中文字幕在线免费观看| 蜜臀av性久久久久av蜜臀妖精| 国产精品入口免费视频一| 欧美激情一区二区三区免费观看 | 国产精品18久久久久久麻辣| 天堂网视频在线| 麻豆精品蜜桃视频网站| 成人美女av在线直播| 国产伦一区二区| 国产成人自拍高清视频在线免费播放| 国产伦精品一区二区三区视频黑人| 刘亦菲毛片一区二区三区| 9久草视频在线视频精品| 欧美黑人xxxxx| 午夜视频在线观看网站| 一区二区三区日韩在线观看| 无码中文字幕色专区| 周于希免费高清在线观看| 欧美性欧美巨大黑白大战| 男生操女生视频在线观看| 亚洲视频三区| 亚洲欧美国产精品久久久久久久| 91视频免费看片| 欧美成人中文| 国产成人精品优优av| 亚洲中文字幕一区二区| 国产成人亚洲综合色影视| 精品久久久久久一区二区里番| 色就是色亚洲色图| 国产精品久久二区二区| 欧美亚洲日本一区二区三区| 成人午夜亚洲| 日韩av在线播放资源| 懂色av蜜桃av| 亚洲经典在线| 国产专区欧美专区| 欧洲一区av| 亚洲精品一二三| aaaaaa亚洲| 精品三级久久久| 亚洲人成毛片在线播放| 天堂网avav| 日韩在线a电影| 999久久久| 亚洲天天影视| 高跟丝袜一区二区三区| 91免费视频污| 精品成人影院| 国内偷自视频区视频综合| 亚洲系列第一页| 久久亚区不卡日本| 免费在线黄网站| 色999韩欧美国产综合俺来也| 亚洲另类xxxx| 国产一级理论片| 国产一区二区导航在线播放| 欧美一区二区三区四区夜夜大片 | 超碰caoprom| 日韩在线精品| 国产第一区电影| 亚欧洲精品视频| 亚洲亚洲人成综合网络| 亚洲第一色av| 青青草国产免费一区二区下载| 91av视频导航| 人妻少妇一区二区三区| 亚洲人成精品久久久久久| www.激情小说.com| 国产一区二区三区四区| 热久久这里只有精品| 午夜视频免费在线| 亚洲午夜精品网| 国产sm在线观看| 午夜久久一区| 亚洲一区二区免费| 日本高清视频在线观看| 欧美三区免费完整视频在线观看| 亚洲综合色一区| 欧美亚洲一区| 欧美不卡在线一区二区三区| 欧美私密网站| 亚洲精品丝袜日韩| 永久免费无码av网站在线观看| 99久久免费视频.com| 黄色www网站| 欧美一区二区三区久久| 欧美中文字幕在线播放| 日本a一级在线免费播放| 精品久久久久久国产| 在线观看国产免费视频| 国产美女诱惑一区二区| 欧美在线视频二区| 国产黄色精品| 欧美www在线| 精品乱子伦一区二区| 亚洲国产精品视频| 中出视频在线观看| 日日骚欧美日韩| 亚洲欧美综合一区| 成人污版视频| 久久久久成人网| 三级视频在线| 欧美色视频一区| av激情在线观看| 成人激情校园春色| 国产精品动漫网站| 色综合天天爱| 老司机精品久久| 国产三级精品网站| 国产剧情在线| 亚洲福利视频专区| 免费视频久久久| 中文字幕亚洲一区二区va在线| 国产探花在线观看视频| 国内精品美女在线观看| 久久99国产精品| 澳门av一区二区三区| 日韩亚洲成人av在线| 精品人妻一区二区三区日产乱码| 亚洲国产欧美在线人成| 97人妻精品一区二区免费| 精品中文av资源站在线观看| 青草网在线观看| 精品一区免费| 96成人在线视频| 另类专区亚洲| 欧美多人乱p欧美4p久久| 日漫免费在线观看网站| 欧美丰满一区二区免费视频| av资源吧首页| 国产精品美日韩| 99re久久精品国产| 国精产品一区一区三区mba桃花 | 国产区一区二区| 欧美日韩尤物久久| 欧美激情一区二区三区高清视频| 黄色av网址在线免费观看| 欧美一区二区三区在线看| 国产婷婷色一区二区在线观看| 亚洲视频在线一区| 国产人妻一区二区| 国产91精品一区二区麻豆网站 | 日韩大陆av| 欧美亚洲成人xxx| 99自拍视频在线观看| 亚洲天堂网站在线观看视频| 亚洲成人黄色片| 欧美精选一区二区| 日韩一级片中文字幕| 亚洲成人免费在线观看| 午夜成人亚洲理伦片在线观看| 久久蜜臀中文字幕| 亚洲一级av无码毛片精品| 激情亚洲综合在线| 亚洲色精品三区二区一区| 亚洲三级色网| 日韩av免费在线| 男女做爰猛烈刺激| 秋霞午夜av一区二区三区| 日本www在线播放| 欧美阿v一级看视频| 亚洲欧美成人一区| 国产一区二区三区电影在线观看| 精品国产乱码久久久久久蜜柚| 国产中文欧美日韩在线| 国产精品亚洲аv天堂网| 男人皇宫亚洲男人2020| 97在线视频一区| 麻豆福利在线观看| 久久99国产精品久久久久久久久| 黄网页免费在线观看| 中文字幕日韩av电影| av一本在线| 伊人精品在线观看| 国产免费a∨片在线观看不卡| 精品亚洲男同gayvideo网站| 手机看片1024国产| 亚洲精品一区二区三区四区高清| 国产不卡精品视频| 欧美一区二区三区不卡| 国产成人麻豆精品午夜在线| 91麻豆精品国产91久久久久久| 国产精品久久久午夜夜伦鲁鲁| 欧美日本高清视频在线观看| 怡春院在线视频| 欧美群妇大交群的观看方式| 亚洲熟女乱色一区二区三区久久久| 欧美午夜精品久久久| 亚洲 小说区 图片区| 欧美日韩五月天| 国产一区二区波多野结衣 | 69影院欧美专区视频| √8天堂资源地址中文在线| 97视频网站入口| 超碰aⅴ人人做人人爽欧美| 国产91免费观看| 日韩在线激情| 999久久久| 欧美尿孔扩张虐视频| 欧美亚洲爱爱另类综合| 成人免费av| 一二三四中文字幕| 亚洲少妇自拍| 最新中文字幕2018| 国产又粗又猛又爽又黄91精品| 性一交一黄一片| av欧美精品.com| 阿v天堂2014| 亚洲精品免费播放| 亚洲欧美在线观看视频| 欧美中文字幕不卡| va视频在线观看| 日韩精品黄色网| sese在线视频| 欧美激情一区二区三区高清视频| 欧美天堂视频| 91免费精品国偷自产在线| 国产欧美自拍一区| 亚洲欧洲一区二区在线观看| 欧美色图麻豆| 黄色一级免费大片| 国产精品一区二区你懂的| 国产精品第七页| 国产精品久久久久婷婷| 久久综合激情网| 欧美亚洲动漫精品| 亚洲奶汁xxxx哺乳期| 亚洲午夜av电影| 欧美xxxx黑人又粗又长| 国产成人精品在线播放| 99久热这里只有精品视频免费观看| 欧美日韩一区二区三| 欧美成人中文| 最新中文字幕免费视频| caoporn国产一区二区| 久久噜噜色综合一区二区| 粉嫩av一区二区三区免费野| 99热这里只有精品66| 国产亚洲精品美女| 精品日韩av| 成人h视频在线观看播放| 久久av超碰| 国产无限制自拍| 国产在线看一区| 一级片视频免费看| 亚洲va欧美va人人爽| 国产精品无码天天爽视频| 亚洲国产成人一区| 91在线中文| 国产中文日韩欧美| 欧美一区二区性| 亚洲乱码中文字幕久久孕妇黑人| 国产精品亚洲专一区二区三区 | 国产成人精品视频| 欧美天堂影院| 亚洲国产成人精品无码区99| 国产一区二区日韩精品| 欧日韩不卡视频| 色播五月激情综合网| 天堂av在线免费观看| 欧美激情啊啊啊| 日本少妇精品亚洲第一区| 一区二区视频在线播放| 久久午夜影视| 大又大又粗又硬又爽少妇毛片| 亚洲高清中文字幕| 国内老熟妇对白xxxxhd| 久久精品视频亚洲| 日本在线一区二区| 亚洲精品自在在线观看| 视频在线在亚洲| 真实乱视频国产免费观看| 黄色成人在线播放| 性感美女福利视频| 欧美一级淫片videoshd| 秋霞影院一区二区三区| 欧美激情视频免费看| 成人美女视频在线观看18| 久久机热这里只有精品| 精品久久人人做人人爽| 日本小视频在线免费观看| 91九色蝌蚪成人| 亚洲香蕉网站| 免费看黄色片的网站| 亚洲成年人网站在线观看| 黑人精品一区二区| 97免费中文视频在线观看| 日韩精品亚洲aⅴ在线影院| 日韩a在线播放| 久久精品一区二区三区不卡 | 欧美不卡一二三| 久久不射影院| 国内一区二区三区在线视频| 国产精品色网| 亚洲综合网在线观看| 91精品1区2区| 国产鲁鲁视频在线观看特色| 99久久国产免费免费| 国产一区二区精品| 一色道久久88加勒比一| 欧美欧美午夜aⅴ在线观看| 国产区在线观看| 国产在线视频欧美一区二区三区| 一区二区精品| 欧美激情视频二区| 欧美一级在线免费| 国模精品视频| 五月天国产一区| 国产精品主播直播| 影音先锋亚洲天堂| 中文字幕日韩av| 国产精品一线| 91蝌蚪视频在线观看| 亚洲视频小说图片| 无码国产伦一区二区三区视频 | 国产精品久久中文字幕| 久久女同互慰一区二区三区| 中文字幕你懂的| 久久久久国色av免费观看性色| 亚洲人成精品久久久 | 26uuu久久天堂性欧美| 在线观看毛片网站| 欧美精品18videos性欧美| 一区二区三区日本久久久| 在线不卡一区二区三区| 亚洲va韩国va欧美va精品| 国产一区二区三区福利| 99久久伊人精品影院| 久久精品麻豆| 欧美日韩大片在线观看| 夜夜嗨av色一区二区不卡| 午夜视频在线观看精品中文| 欧美污视频网站| 亚洲精品综合在线| a√资源在线| 精品欧美一区二区在线观看视频| 久久aⅴ国产欧美74aaa| 国产精品男女视频|