日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满av-国产精品中文字幕免费观看-亚洲成人久久一区二区三区-国内少妇偷人精品视频无缓冲-一区二区国产精品日本一区二区三区在线网

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

自定義虛擬鍵盤(pán)開(kāi)發(fā)實(shí)戰(zhàn):焦點(diǎn)管理、事件綁定與觸摸屏適配全指南

自定義虛擬鍵盤(pán)開(kāi)發(fā)實(shí)戰(zhàn):焦點(diǎn)管理、事件綁定與觸摸屏適配全指南 做自定義虛擬鍵盤(pán)這個(gè)需求聽(tīng)起來(lái)特別直接屏幕上擺幾個(gè)按鍵點(diǎn)擊就往輸入框里懟字符完事。但我最早在觸摸屏一體機(jī)上試水的時(shí)候光焦點(diǎn)這一個(gè)問(wèn)題就折騰了一周——每點(diǎn)一下鍵盤(pán)輸入框就失焦用戶(hù)辛辛苦苦輸?shù)揭话氲膬?nèi)容直接斷在中間。后來(lái)才明白虛擬鍵盤(pán)真正的難度根本不在畫(huà)按鍵而在于它要把自己偽裝成一套完整的輸入系統(tǒng)去對(duì)接頁(yè)面原有的輸入邏輯還不能喧賓奪主。這篇文章是我?guī)状螌?shí)操下來(lái)的一次完整復(fù)盤(pán)內(nèi)容包括技術(shù)方案選型、事件綁定鏈路、觸摸屏適配、數(shù)據(jù)驅(qū)動(dòng)布局還有那些文檔里不會(huì)寫(xiě)的坑。不管你是要在普通Web頁(yè)面里做一個(gè)可定制按鍵的軟鍵盤(pán)還是在工業(yè)觸摸屏、自助終端上做一套專(zhuān)屬輸入組件這份指南都能當(dāng)做一個(gè)還算靠譜的起點(diǎn)。1. 虛擬鍵盤(pán)不是改個(gè)系統(tǒng)鍵盤(pán)皮膚這么簡(jiǎn)單1.1 先劃清楚邊界系統(tǒng)鍵盤(pán)和自定義鍵盤(pán)各自管什么移動(dòng)端瀏覽器里一個(gè)input聚焦之后系統(tǒng)鍵盤(pán)自動(dòng)彈出來(lái)這是操作系統(tǒng)給出的默認(rèn)輸入方案。它體驗(yàn)好、兼容強(qiáng)但你幾乎沒(méi)法控制它按鍵長(zhǎng)什么樣、允許輸入什么字符、按下之后額外觸發(fā)什么業(yè)務(wù)邏輯全部黑盒。自定義虛擬鍵盤(pán)恰恰相反——它拿回的是輸入過(guò)程的控制權(quán)。你可以決定鍵盤(pán)上只出現(xiàn)數(shù)字和大寫(xiě)字母可以讓某個(gè)按鍵按下后不僅輸入字符還聯(lián)動(dòng)查詢(xún)可以為了讓戴手套的工人也能準(zhǔn)確點(diǎn)按而把按鍵做到60px高。但代價(jià)是系統(tǒng)原本替你處理的焦點(diǎn)管理、光標(biāo)移動(dòng)、輸入法組合、撤銷(xiāo)棧全部要自己接一遍。這里要特別提醒一下如果不是因?yàn)榭刂茩?quán)的需求只是覺(jué)得系統(tǒng)鍵盤(pán)丑想換個(gè)皮膚那大概率不該自己開(kāi)發(fā)。改造現(xiàn)有開(kāi)源庫(kù)或者用現(xiàn)成組件改樣式成本低得多。1.2 我拆解過(guò)的三類(lèi)真實(shí)需求場(chǎng)景A工業(yè)觸摸屏人機(jī)界面。某設(shè)備廠商的10寸工控屏沒(méi)有物理鍵盤(pán)操作工人需要輸入批次號(hào)、物料編碼和工號(hào)。系統(tǒng)自帶的軟鍵盤(pán)字體小、按鍵密在車(chē)間光照下幾乎看不清而且彈出來(lái)之后經(jīng)常遮住正在查看的字段。這類(lèi)需求的核心不是輸入效率而是大按鍵、高對(duì)比度、穩(wěn)定可靠按鍵布局要能按客戶(hù)要求定制比如把數(shù)字和字母分區(qū)排列。場(chǎng)景B自助終端。掛號(hào)機(jī)、排隊(duì)叫號(hào)機(jī)、信息查詢(xún)機(jī)這類(lèi)設(shè)備輸入范圍非常收斂通常只有數(shù)字、身份證號(hào)、手機(jī)號(hào)。業(yè)務(wù)上要求不能輸字母和特殊符號(hào)界面風(fēng)格要和整機(jī)統(tǒng)一。這類(lèi)需求最重要的是輸入限制和防誤觸一個(gè)按鍵只能觸發(fā)一個(gè)明確的結(jié)果。場(chǎng)景CWeb收銀/點(diǎn)單頁(yè)面。營(yíng)業(yè)員在觸摸屏一體機(jī)上快速錄入會(huì)員手機(jī)號(hào)、折扣碼或者調(diào)用常用短語(yǔ)。這類(lèi)頁(yè)面通常還需要輸完手機(jī)號(hào)自動(dòng)查詢(xún)會(huì)員這種聯(lián)動(dòng)動(dòng)作。此時(shí)自定義鍵盤(pán)的價(jià)值不只是好看而是能把業(yè)務(wù)動(dòng)作直接綁定到按鍵上縮短操作路徑。1.3 什么情況別硬上自定義鍵盤(pán)反過(guò)來(lái)也說(shuō)說(shuō)。如果需求只是手機(jī)網(wǎng)頁(yè)里想換一套自定義鍵盤(pán)我一般會(huì)勸退。原因很簡(jiǎn)單在瀏覽器里只要input聚焦系統(tǒng)鍵盤(pán)就有機(jī)會(huì)彈出來(lái)你沒(méi)有可靠手段完全阻止它——所謂的readonly方案、inputmode方案都只是在減少?gòu)棾龅母怕首霾坏?00%屏蔽。強(qiáng)行把輸入框設(shè)成只讀再靠虛擬鍵盤(pán)往里填內(nèi)容又會(huì)引入光標(biāo)模擬、選區(qū)管理、中文輸入法沖突一堆新問(wèn)題。所以我的判斷原則是鍵盤(pán)需要和系統(tǒng)輸入法長(zhǎng)期共存尤其是手機(jī)瀏覽器場(chǎng)景就別自己做鍵盤(pán)是設(shè)備上的唯一輸入入口比如工控屏、一體機(jī)、封閉Webview才值得徹底自研。2. 技術(shù)方案選型不是所有網(wǎng)頁(yè)鍵盤(pán)都長(zhǎng)一個(gè)樣2.1 四種主流落地方式對(duì)比我整理了一下自己接觸過(guò)的虛擬鍵盤(pán)實(shí)現(xiàn)路徑方案適用場(chǎng)景優(yōu)點(diǎn)缺點(diǎn)DOM CSS 渲染按鍵常規(guī)Web、觸摸屏H5、一體機(jī)Webview開(kāi)發(fā)快、樣式定制靈活、天然支持無(wú)障礙語(yǔ)義動(dòng)畫(huà)和特效能力有限性能瓶頸在DOM量級(jí)Canvas / WebGL 繪制對(duì)動(dòng)效、按鍵特效要求極高的展示型界面渲染自由度最大可以實(shí)現(xiàn)非常復(fù)雜的視覺(jué)命中測(cè)試、文字排版、焦點(diǎn)管理都要自己造維護(hù)成本高桌面端方案Electron / Python Qt等桌面應(yīng)用里的模擬鍵盤(pán)能直接和原生窗口、硬件交互可做全局熱鍵跨平臺(tái)打包體積大更新節(jié)奏受框架限制系統(tǒng)級(jí)自定義鍵盤(pán)如移動(dòng)端輸入法擴(kuò)展需要全局鍵盤(pán)替代系統(tǒng)輸入法體驗(yàn)最接近原生開(kāi)發(fā)成本高、審核門(mén)檻高、只覆蓋特定平臺(tái)2.2 為什么我的項(xiàng)目最后都回歸DOM方案我做過(guò)好幾個(gè)版本的虛擬鍵盤(pán)最早也試過(guò)Canvas方案因?yàn)橄胫凑總€(gè)按鍵都是自己畫(huà)的Canvas自由度更高。結(jié)果發(fā)現(xiàn)Canvas方案里最難處理的不是畫(huà)按鍵而是點(diǎn)按命中你需要自己維護(hù)每個(gè)按鍵的矩形坐標(biāo)處理像素比適配點(diǎn)擊后還要判斷點(diǎn)到哪個(gè)鍵。最痛苦的其實(shí)是無(wú)障礙——Canvas里的每個(gè)鍵對(duì)屏幕閱讀器來(lái)說(shuō)都是一張無(wú)聲的圖片。DOM方案完全沒(méi)有這些煩惱。每個(gè)按鍵就是一個(gè)真實(shí)的DOM節(jié)點(diǎn)天然支持:active偽類(lèi)、click事件、aria-label、鍵盤(pán)事件模擬。對(duì)虛擬鍵盤(pán)這種結(jié)構(gòu)固定、交互相對(duì)簡(jiǎn)單的組件來(lái)說(shuō)DOM的性能完全夠用——我在幾百毫秒的渲染周期內(nèi)渲染幾十個(gè)按鍵沒(méi)有任何壓力。2.3 依賴(lài)與框架層面的取舍不要一上來(lái)就引入一個(gè)重型UI框架。虛擬鍵盤(pán)本質(zhì)上是一個(gè)組件如果項(xiàng)目里已經(jīng)在用某個(gè)框架那就把它做成對(duì)應(yīng)框架的組件如果是一個(gè)原生頁(yè)面原生JS加少量模板邏輯就夠了。比較推薦的做法是鍵盤(pán)核心邏輯輸入映射、焦點(diǎn)管理、布局配置保持與框架無(wú)關(guān)用純函數(shù)和普通對(duì)象實(shí)現(xiàn)UI層只做薄薄一層的綁定。這樣以后從原生遷到Vue或者從Vue遷到React底層完全不用動(dòng)只改渲染層。這個(gè)設(shè)計(jì)我吃過(guò)甜頭——有個(gè)項(xiàng)目最早是原生寫(xiě)的后來(lái)要嵌入到一個(gè)React應(yīng)用里因?yàn)楹诵倪壿嫑](méi)和DOM寫(xiě)在一起遷移只花了一天。3. 事件綁定與輸入映射虛擬鍵盤(pán)的核心鏈路3.1 把字符送進(jìn)輸入框的三種思路你要敲一個(gè)字符到input里說(shuō)白了就三件事定位光標(biāo)、插入文本、讓框架感知到值變化。查了下我踩過(guò)的三條路直接改input.value。最簡(jiǎn)單把舊值和字符拼起來(lái)再賦回去。但這樣會(huì)破壞瀏覽器的原生撤銷(xiāo)棧輸入框的光標(biāo)位置會(huì)跳到末尾而且如果輸入框是有maxlength校驗(yàn)的直接賦值可能導(dǎo)致字符被截?cái)?。不推薦作為主方案。使用document.execCommand(insertText)。老一代方案里比較靠譜的它走的是瀏覽器的編輯命令通道能保留撤銷(xiāo)棧。但這東西官方明確標(biāo)記過(guò)廢棄狀態(tài)在部分Webview里行為不一致新項(xiàng)目我不會(huì)再用。使用selectionStart/selectionEnd setRangeText?,F(xiàn)代瀏覽器里最接近原生輸入的做法。先拿到光標(biāo)位置再用setRangeText把文本插進(jìn)去最后手動(dòng)派發(fā)一個(gè)input事件通知框架。我現(xiàn)在的推薦寫(xiě)法是function insertTextAtCursor(input, text) { const start input.selectionStart; const end input.selectionEnd; input.focus(); input.setRangeText(text, start, end, end); // 給 Vue / React 等框架一個(gè)信號(hào)值變了 input.dispatchEvent(new Event(input, { bubbles: true })); }setRangeText的第四個(gè)參數(shù)傳end意思是插入后光標(biāo)定位在插入文本的后面非常順手不用自己管光標(biāo)回收。3.2 焦點(diǎn)鎖定鍵盤(pán)不能搶走輸入框的焦點(diǎn)這一點(diǎn)是很多第一次做虛擬鍵盤(pán)的人翻車(chē)的地方。點(diǎn)擊鍵盤(pán)按鍵默認(rèn)行為是會(huì)觸發(fā)一次焦點(diǎn)轉(zhuǎn)移——如果鍵盤(pán)容器可以被聚焦輸入框就失焦了下一次insertTextAtCursor就找不到目標(biāo)。解法有兩個(gè)層面第一讓鍵盤(pán)容器本身不可聚焦避免焦點(diǎn)進(jìn)來(lái)。比如給它設(shè)置tabindex-1并且不要主動(dòng)調(diào)用它的focus()。第二對(duì)pointerdown事件調(diào)用preventDefault()阻止默認(rèn)的焦點(diǎn)改變行為。注意pointerdown上阻止默認(rèn)行為會(huì)連帶阻止后續(xù)兼容性的mouse事件和click事件所以按鍵的點(diǎn)擊邏輯不能依賴(lài)click要把邏輯放到pointerup或者自己處理。keyboardElement.addEventListener(pointerdown, (e) { // 阻止焦點(diǎn)從輸入框轉(zhuǎn)移到鍵盤(pán)上 e.preventDefault(); });這個(gè)寫(xiě)法的副作用是鍵盤(pán)組件本身無(wú)法通過(guò)鼠標(biāo)觸發(fā)click所以如果你同時(shí)在開(kāi)發(fā)PC端需要額外在keydown里補(bǔ)一份對(duì)回車(chē)鍵和空格鍵的支持保證只用鍵盤(pán)也能操作虛擬鍵盤(pán)。3.3 功能鍵與狀態(tài)鍵Shift、CapsLock、Backspace 的完整處理真正的虛擬鍵盤(pán)不可能只有字母和數(shù)字功能鍵的處理才是布局是否好用的關(guān)鍵。最典型的是Shift鍵。它不是一個(gè)輸入字符而是一個(gè)狀態(tài)切換器。我的做法是維護(hù)一個(gè)布局映射關(guān)系按下Shift時(shí)把當(dāng)前布局切換到上層字符同時(shí)給Shift鍵本身加一個(gè)active視覺(jué)狀態(tài)再次按下或者輸入一個(gè)字母后自動(dòng)回到小寫(xiě)布局。CapsLock則是一個(gè)鎖定狀態(tài)只切換大小寫(xiě)不切換按鍵位置。const LAYOUT { lower: [ [1,2,3,4,5,6,7,8,9,0], [q,w,e,r,t,y,u,i,o,p], [shift,a,s,d,f,g,h,j,k,l,backspace], [alt,z,x,c,v,b,n,m,enter], [space] ], upper: [ [!,,#,$,%,^,,*,(,)], [Q,W,E,R,T,Y,U,I,O,P], [shift,A,S,D,F,G,H,J,K,L,backspace], [alt,Z,X,C,V,B,N,M,enter], [space] ] };Backspace刪除字符這里有講究。多數(shù)人第一反應(yīng)是把value減一個(gè)字符但遇到中文、Emoji這些由多個(gè)UTF-16編碼單元組成的字符時(shí)直接按編碼單元?jiǎng)h除會(huì)把字符劈成兩半。用Array.from轉(zhuǎn)成真正的字符數(shù)組再算好邊界刪除function deletePrevChar(input) { const start input.selectionStart; const end input.selectionEnd; if (start ! end) { // 存在選區(qū)直接刪選區(qū) input.setRangeText(, start, end, end); } else if (start 0) { // 按碼點(diǎn)取最后一個(gè)字符避免拆散表情或組合字符 const codePoints Array.from(input.value.slice(0, start)); const lastChar codePoints[codePoints.length - 1]; input.setRangeText(, start - lastChar.length, start, end); } input.dispatchEvent(new Event(input, { bubbles: true })); }Enter鍵的邏輯要按場(chǎng)景區(qū)分如果鍵盤(pán)使用在表單里應(yīng)該觸發(fā)表單提交如果用在聊天窗口則應(yīng)該是換行或發(fā)送。我習(xí)慣在按鍵分發(fā)層把動(dòng)作類(lèi)型定義成action不在UI層寫(xiě)死。3.4 和輸入法合成事件的沖突這里要單拎出來(lái)說(shuō)因?yàn)樗娴睦_了我很久。當(dāng)用戶(hù)在真實(shí)中文輸入法狀態(tài)下點(diǎn)擊你的虛擬鍵盤(pán)時(shí)輸入法可能正處于拼音候選的合成過(guò)程中。典型癥狀是明明按的是字母鍵結(jié)果輸入法把字母組合成拼音直接蹦出繁體字或者亂碼。標(biāo)準(zhǔn)做法是監(jiān)聽(tīng)compositionstart和compositionendlet isComposing false; input.addEventListener(compositionstart, () { isComposing true; }); input.addEventListener(compositionend, () { isComposing false; }); // 在插入邏輯入口判斷 if (isComposing) { // 合成期間放棄直接插入或者把按鍵內(nèi)容保存到暫存區(qū) return; }再深入一層自定義虛擬鍵盤(pán)在設(shè)計(jì)之初就要想清楚你打算支持中文輸入嗎如果支持工作量翻倍不止——需要拼音映射、候選詞面板、多音字處理。如果不支持只是面向數(shù)字、字母、符號(hào)的錄入那就在鍵盤(pán)外層明確屏蔽中文輸入法的干擾這通常更符合工控和自助終端的實(shí)際場(chǎng)景。4. 鍵盤(pán)布局與UI細(xì)節(jié)決定好用和能用的那20%4.1 用二維數(shù)組驅(qū)動(dòng)布局渲染而不是手寫(xiě)一堆按鈕我見(jiàn)過(guò)不少項(xiàng)目里鍵盤(pán)的每個(gè)按鍵都是手寫(xiě)的一個(gè)button幾十個(gè)按鈕在HTML里排成一大片。一旦客戶(hù)說(shuō)把刪除鍵從第四行挪到第一行整個(gè)布局就崩了。更合理的做法是把布局抽象成數(shù)據(jù)const keyboardData [ { type: key, value: 1, label: 1 }, { type: key, value: q, label: q }, { type: function, action: backspace, label: 刪除 }, { type: function, action: shift, label: Shift } ];再寫(xiě)一個(gè)純粹的渲染函數(shù)把數(shù)組變成DOM按type分發(fā)不同的樣式和行為??蛻?hù)要改布局只需要改數(shù)據(jù)不需要碰代碼。這個(gè)設(shè)計(jì)對(duì)自定義虛擬鍵盤(pán)里的自定義三個(gè)字是決定性支撐——沒(méi)有數(shù)據(jù)驅(qū)動(dòng)你永遠(yuǎn)只能做一款固定的鍵盤(pán)。4.2 按鍵尺寸、間距與視覺(jué)密度尺寸這件事用數(shù)據(jù)說(shuō)話(huà)。手指觸摸的目標(biāo)最小建議是44px這是移動(dòng)端普遍接受的一個(gè)下限但在工業(yè)觸摸屏上操作者可能戴手套、車(chē)間環(huán)境有震動(dòng)我實(shí)際項(xiàng)目里都會(huì)做到至少48px甚至60px。有一個(gè)10寸屏項(xiàng)目客戶(hù)堅(jiān)持要把字體做到28px以上、按鍵間距4px實(shí)測(cè)下來(lái)誤觸率明顯下降。間距也不能太緊但也不需要太松。按鍵之間留4到8px的間隙視覺(jué)上既不會(huì)粘連又不會(huì)顯得松散。另外要考慮鍵盤(pán)總高度底部固定式鍵盤(pán)高度建議控制在屏幕的40%以?xún)?nèi)否則會(huì)擠壓內(nèi)容區(qū)。4.3 按壓反饋虛擬鍵盤(pán)體驗(yàn)的靈魂沒(méi)有反饋的虛擬鍵盤(pán)會(huì)讓人感覺(jué)按鍵沒(méi)按下去。物理鍵盤(pán)有鍵程、有聲音觸摸屏上必須自己造出這些反饋。輕量級(jí)方案是CSS解決.key { transition: transform 0.05s ease, background-color 0.1s ease; } .key:active { transform: translateY(2px); background-color: #e8e8e8; }進(jìn)階一點(diǎn)按下去的時(shí)候用JavaScript給按鍵添加一個(gè)active類(lèi)在pointerup/pointerleave時(shí)移除這樣即使手指滑出按鍵區(qū)域也不會(huì)有粘住的問(wèn)題。如果設(shè)備自帶震動(dòng)馬達(dá)還可以在pointerdown時(shí)調(diào)用navigator.vibrate(10)一個(gè)10毫秒的短震手感立刻不一樣。4.4 功能鍵的視覺(jué)狀態(tài)管理Shift按下、CapsLock開(kāi)啟按鍵本身必須給出可見(jiàn)的狀態(tài)變化。我習(xí)慣用數(shù)據(jù)傳輸狀態(tài)而不是靠臨時(shí)改樣式const keyboardState { shift: false, caps: false }; function getCurrentLayout() { const upper keyboardState.shift ! keyboardState.caps ? upper : lower; return LAYOUT[upper]; }這里有個(gè)細(xì)節(jié)Shift CapsLock組合時(shí)大小寫(xiě)應(yīng)該是取反的關(guān)系。如果CapsLock是大寫(xiě)鎖定再按Shift會(huì)臨時(shí)切換成小寫(xiě)——和物理鍵盤(pán)行為保持一致用戶(hù)才不會(huì)有認(rèn)知錯(cuò)亂。5. 觸摸屏與移動(dòng)端從鼠標(biāo)點(diǎn)按到手指操作的距離5.1 為什么推薦用 Pointer Events 而不是 click在PC網(wǎng)頁(yè)里click事件很可靠。但在觸摸屏和移動(dòng)端click存在兩三百毫秒的延遲窗口用戶(hù)會(huì)明顯感覺(jué)到按下去沒(méi)反應(yīng)等了一下才觸發(fā)。舊時(shí)代我們靠touchstart處理但touchstart和mouse事件并存時(shí)又會(huì)觸發(fā)多次點(diǎn)擊。統(tǒng)一方案是pointerdown/pointerup。Pointer Events 把鼠標(biāo)、觸摸、筆統(tǒng)一成一種抽象pointerdown在手指觸摸時(shí)立刻觸發(fā)沒(méi)有延遲而且可以用pointerType區(qū)分是手指還是鼠標(biāo)方便做差異邏輯。實(shí)際項(xiàng)目里我把虛擬鍵盤(pán)的所有按鍵邏輯都掛在pointerup上pointerdown只負(fù)責(zé)視覺(jué)反饋和焦點(diǎn)鎖定。5.2 防止觸摸引發(fā)的頁(yè)面滾動(dòng)和縮放觸摸屏上點(diǎn)鍵盤(pán)時(shí)手指稍微一滑頁(yè)面就跟著滾動(dòng)了這個(gè)體驗(yàn)很糟糕。兩個(gè)層面的處理第一給鍵盤(pán)容器設(shè)置touch-action樣式。touch-action: manipulation表示允許平移和縮放但禁止雙擊縮放如果想徹底禁用容器內(nèi)的手勢(shì)可以用touch-action: none。第二在pointermove時(shí)判斷是否發(fā)生了明顯滑動(dòng)如果滑動(dòng)距離超過(guò)一定閾值就視為取消本次點(diǎn)擊防止用戶(hù)在按住一個(gè)鍵想滑到另一個(gè)鍵的過(guò)程中誤觸發(fā)。這是一個(gè)很細(xì)節(jié)但很實(shí)用的手感調(diào)優(yōu)點(diǎn)。5.3 系統(tǒng)鍵盤(pán)干擾移動(dòng)端最大的頭痛問(wèn)題在手機(jī)瀏覽器里做自定義虛擬鍵盤(pán)最尷尬的事情是你自己的鍵盤(pán)彈出來(lái)了系統(tǒng)鍵盤(pán)也跟著彈出來(lái)。前面說(shuō)過(guò)這塊沒(méi)有完美的方案但我實(shí)際摸索出一個(gè)折中策略在封閉Webview或一體機(jī)設(shè)備上系統(tǒng)鍵盤(pán)本來(lái)就不會(huì)出現(xiàn)直接用真實(shí)input加自定義鍵盤(pán)體驗(yàn)最好。在手機(jī)瀏覽器上如果一定要隱藏系統(tǒng)鍵盤(pán)可以把輸入框設(shè)為只讀由虛擬鍵盤(pán)直接操縱它的值。壞處是無(wú)法用selectionStart精準(zhǔn)控制光標(biāo)也無(wú)法支持輸入法合成。實(shí)測(cè)下來(lái)如果要支持光標(biāo)位置精確操作 中文輸入法 選區(qū)操作這三件事只讀方案完全扛不住如果只是數(shù)字加字母的簡(jiǎn)單輸入只讀方案勉強(qiáng)可用。所以這個(gè)難題的根本解法還是移動(dòng)端瀏覽器頁(yè)面盡量別做自定義鍵盤(pán)如果要做就接受不能完全屏蔽系統(tǒng)鍵盤(pán)的現(xiàn)實(shí)。5.4 鍵盤(pán)定位與頁(yè)面resize底部固定式鍵盤(pán)最常見(jiàn)的實(shí)現(xiàn)是position: fixed; bottom: 0。但在移動(dòng)端當(dāng)系統(tǒng)鍵盤(pán)彈出時(shí)visualViewport高度會(huì)變化鍵盤(pán)和輸入框的相對(duì)位置需要?jiǎng)討B(tài)調(diào)整。可以監(jiān)聽(tīng)visualViewport的 resize 事件實(shí)時(shí)計(jì)算鍵盤(pán)的top值把鍵盤(pán)推高到系統(tǒng)鍵盤(pán)上方如果是自己彈出的鍵盤(pán)則保持固定在底部即可。6. 焦點(diǎn)丟失、輸入重復(fù)與光標(biāo)漂移實(shí)測(cè)最常遇見(jiàn)的三個(gè)坑6.1 焦點(diǎn)丟失點(diǎn)擊一次輸入框就失焦一次在某個(gè)自助終端項(xiàng)目里用戶(hù)每點(diǎn)一個(gè)數(shù)字輸入框的光標(biāo)就消失一次。排查過(guò)程很有意思一開(kāi)始以為是我的鍵盤(pán)焦點(diǎn)問(wèn)題后來(lái)發(fā)現(xiàn)在輸入框的全局blur監(jiān)聽(tīng)里有一段來(lái)自外層框架的邏輯任何失焦都會(huì)觸發(fā)一個(gè)隱藏操作把輸入框隱藏了。要復(fù)現(xiàn)這個(gè)問(wèn)題的排查鏈路要點(diǎn)是在輸入框的blur事件里打日志確認(rèn)失焦發(fā)生的時(shí)間點(diǎn)在鍵盤(pán)pointerdown里打日志確認(rèn)事件觸發(fā)的先后順序檢查是否有全局的focus/blur代理邏輯在干擾。真正的解法還是前面說(shuō)過(guò)的鍵盤(pán)pointerdown阻止默認(rèn)行為 鍵盤(pán)容器不可聚焦。如果失焦是外層框架造成的則需要在外層框架的失焦回調(diào)里做一個(gè)焦點(diǎn)即將轉(zhuǎn)移給鍵盤(pán)的豁免判斷。6.2 輸入重復(fù)一次按鍵觸發(fā)了兩次插入這個(gè)坑主要出在手動(dòng)派發(fā)input事件 框架自己的v-model同時(shí)生效的配置里。比如Vue的v-model本身就監(jiān)聽(tīng)input事件去更新數(shù)據(jù)你又手動(dòng)派發(fā)了一次input數(shù)據(jù)更新邏輯跑了兩次屏幕上就出現(xiàn)了字符重復(fù)。解法是在派發(fā)input事件前先對(duì)值做一次比對(duì)function updateInputValue(input, newValue) { if (input.value newValue) return; // React 需要走原生 setterVue 直接賦值即可 input.value newValue; input.dispatchEvent(new Event(input, { bubbles: true })); }React 還有一個(gè)額外問(wèn)題它內(nèi)部會(huì)用一個(gè)值跟蹤器記錄輸入框當(dāng)前值直接修改input.value后派發(fā)事件React 可能認(rèn)為值沒(méi)有變化。標(biāo)準(zhǔn)技巧是const valueSetter Object.getOwnPropertyDescriptor( window.HTMLInputElement.prototype, value ).set; valueSetter.call(input, newValue); input.dispatchEvent(new Event(input, { bubbles: true }));6.3 光標(biāo)漂移輸入一個(gè)字符后光標(biāo)跳到了末尾setRangeText在多數(shù)情況下能保持光標(biāo)位置但如果你在插入之后又隨手做了一次input.value input.value text這種操作光標(biāo)必然跳到末尾。另外一個(gè)隱蔽場(chǎng)景是輸入框有maxlength限制setRangeText插入后觸發(fā)了瀏覽器的截?cái)喙鈽?biāo)位置就不在預(yù)期位置了。處理思路是每次插入之前把selectionStart/selectionEnd保存到變量里插入之后如果框架發(fā)生了重渲染再手動(dòng)恢復(fù)一次光標(biāo)位置。這個(gè)方法笨但可靠尤其在遠(yuǎn)程調(diào)試一些老Webview時(shí)特別管用。6.4 隱藏鍵盤(pán)的觸發(fā)策略虛擬鍵盤(pán)在自助終端上通常常駐但在共享屏幕上用完后要及時(shí)隱藏。我常用的觸發(fā)策略是點(diǎn)擊鍵盤(pán)之外的空白區(qū)域隱藏鍵盤(pán)輸入框blur且焦點(diǎn)沒(méi)有轉(zhuǎn)移到鍵盤(pán)本身隱藏鍵盤(pán)按Enter確認(rèn)后如果業(yè)務(wù)允許隱藏鍵盤(pán)。注意點(diǎn)擊空白區(qū)域要用pointerdown監(jiān)聽(tīng)并且要排除掉鍵盤(pán)容器本身否則每次點(diǎn)擊按鍵都會(huì)先觸發(fā)隱藏邏輯再觸發(fā)插入邏輯出現(xiàn)一種鍵盤(pán)閃一下的糟糕體驗(yàn)。7. 值得提前做好的工程化設(shè)計(jì)7.1 按鍵事件統(tǒng)一走分發(fā)器而不是散落在各個(gè)按鈕上虛擬鍵盤(pán)的按鍵種類(lèi)再多歸納起來(lái)無(wú)非三類(lèi)字符鍵、功能鍵、狀態(tài)鍵。我習(xí)慣把它們統(tǒng)一抽象成一個(gè)動(dòng)作分發(fā)器function dispatchKeyAction(type, payload) { switch (type) { case input: insertTextAtCursor(activeInput, payload); break; case delete: deletePrevChar(activeInput); break; case shift: keyboardState.shift !keyboardState.shift; renderLayout(); break; case enter: handleEnter(); break; default: break; } }所有按鍵在HTML層面只負(fù)責(zé)一個(gè)職責(zé)告訴分發(fā)器我是什么類(lèi)型的按鍵。業(yè)務(wù)邏輯不散落在幾十個(gè)按鈕的監(jiān)聽(tīng)器里排查問(wèn)題就只需要看這一個(gè)函數(shù)。7.2 布局和按鍵行為配置化自定義虛擬鍵盤(pán)如果只是代碼層面改數(shù)組還不算真正的自定義。我后期的實(shí)現(xiàn)里布局通常是一個(gè)JSON配置業(yè)務(wù)人員可以直接改配置文件重新生成鍵盤(pán)。{ rows: [ [{label: Q, value: q, type: input}], [{label: 刪除, type: function, action: backspace}] ] }比如有的客戶(hù)要放一個(gè)快捷錄入上次訂單的按鍵只需要在配置里增加一個(gè){ type: function, action: repeatLastOrder }核心代碼只需要注冊(cè)一下這個(gè)動(dòng)作。把擴(kuò)展成本從改代碼降到改配置虛擬鍵盤(pán)才真正配得上自定義三個(gè)字。7.3 中文輸入的冷思考最后必須潑一盆冷水。如果你以為虛擬鍵盤(pán)只是把英文字母做成可以點(diǎn)擊的按鈕然后要求它支持中文輸入那工程量會(huì)瞬間爆炸拼音到漢字的映射庫(kù)、多音字處理、候選詞排序、詞庫(kù)加載隨便一個(gè)都是獨(dú)立項(xiàng)目的規(guī)模。我現(xiàn)在的判斷標(biāo)準(zhǔn)很清楚支持中文輸入的自定義鍵盤(pán)優(yōu)先考慮現(xiàn)有中文輸入法SDK或者系統(tǒng)輸入法自定義鍵盤(pán)默認(rèn)定位是受限字符集輸入工具也就是數(shù)字、拉丁字母、常用符號(hào)。這個(gè)定位能讓交付質(zhì)量和工期都保持在可控范圍。如果確實(shí)必須中文抱著一整塊工程量去做規(guī)劃和報(bào)價(jià)千萬(wàn)不要在開(kāi)發(fā)中后期臨時(shí)加需求。我的個(gè)人體會(huì)是虛擬鍵盤(pán)項(xiàng)目的成敗一半在立項(xiàng)之前的邊界劃分一半在事件鏈路的細(xì)節(jié)處理。前者決定了你是不是在做一個(gè)不可能完成的需求后者決定了做出來(lái)能不能被用戶(hù)接受。技術(shù)上高深的部分不多但每一個(gè)看起來(lái)沒(méi)什么的細(xì)節(jié)——焦點(diǎn)、光標(biāo)、事件派發(fā)、觸摸反饋——都足夠讓一個(gè)沒(méi)有經(jīng)驗(yàn)的人卡上兩三天。其實(shí)這也是我寫(xiě)下這份指南的原因希望有更多人能少踩我當(dāng)年踩過(guò)的那些坑直接把精力放到真正有價(jià)值的功能設(shè)計(jì)上去。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
99re在线视频国产| 飘花国产午夜精品不卡| 国产精品婬乱一级毛片彝族| 国产精品乱人伊人网| 91亚洲不卡一区| 国产有码一区| 欧美大香蕉专区网| 伊人久久亚洲中文字幕| 超碰夫妻97| 无码不卡亚洲成?人片| 亚洲AV秘 精品久久老牛影视| 美女高潮国产高清| 午夜精品久久久久久久99蜜桃一| 国产精品久久久久久久久AV大片| 超碰碰碰碰| 日本 免费 一区二区三区 久久香蕉| 九久久九精品视频| 超碰在线一区| 欧美老熟另类| 国产51色综合久久免费| 丝袜色综合| 又黄又粗又硬又长又大| 岛国色情视频在线观看| 熟女AV一区| 亚洲成a人片在线观看中文!!!| 日本新免费二区三区| 91色综合| 天天综合,91入口| 国产又爽又黄| av毛片aaaaa免费看| 国产丝袜美女在线一区| 欧美黑人168页欧美黑人167| 色色色热| 乱伦AVxx| 天天肏美女| 国产少妇与亚洲av| 国产Av超碰| 亚洲精品亚洲人成在线麻豆| 亚洲女人毛茸茸91| 亚洲天堂女优在线| 噜噜噜在线视频| 加勒比久久av| 欧美午夜视频| 蜜桃传媒一区二区亚洲| 偷拍五区| 亚洲熟久久| 人人看人人插| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 三上制服丝AV| 91天天综合网,天天综合网| 天堂种子在线www网资源| 久久精品国产精品一区| av激情亚洲五月天| 激情小说图片亚洲首页| 国产在线播放成人免费| 日本精品一区二区三| 青娱乐亚洲热| 亚洲AV小说| 巨爆乳肉感一区二区三区竹菊影视| 啊啊啊啊啊啊好湿好爽视频| 国产视频三区四区| 精品精品精品| a片 xxxx受爽视频| 超碰 97国产熟女| 手机在线人成免费视频| 国产一区二区三区免费视频在性观看 | 久久成人网站| 久久超碰97| 狠狠干91| 亚洲一区二区三区不卡国产欧美| 欧美图片校园春色| 欧美性色网| 欧日韩一二三f区| 国语精品对白| 欧美中文字幕精品人妻| 国产精品白丝在线播放| 免费的黄片wwwwww| 噜噜吧,噜噜色,噜噜| 久久人人舔人人爽舔人人av片| 大香蕉伊人75| 夜夜爽夜夜爽| 亚洲国产婷婷在线播放| 免费看美国人人爽,人人操| 日本一区二区不卡精品| 免费看污网站| 亚洲 在线| 内射小黄片| 屁股久久久久久久| 333kkkk·亚洲com久久| 116美女午夜| 青青草中日韩在线| 亚洲精品九九九| 日本人人操人人操| 欧美黑人与女人91~| 天天看人人操屄犊摸阴| 老熟女综合网| 熟女少妇一区二区三区| 亚州一区二区| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 水野优香在线观看| 97超碰热线| 日韩天堂av电影在线观看| 男人的天堂啪啪啪啪啪蜜桃不卡| 久久黄黄| 久久久久女教师免费一区| 精品偷拍13p欧美dodk视频| 精品国产网站| 我要去看2个日本美女.com曹逼| 免费试看60秒| 天天色悠悠激情| 综合亚洲网| 牛黄色久午久| 丰满的三级少妇欧美久久久| 天天看少妇| 熟女熟妇一区二区三四区| 天天操天天舔| 女性喷水高潮在线观看| 日本少妇va7777| 九一国产精品| 东京热男人的天堂网| 亚州黄站| 97色色色| 夜草网站| 国产精品视频在线播放| 久久久久久久九九九九九九| 97精品97| 天天欲望网| 综合操逼| JuliaAnn丝袜熟女系列| 天天色粽合合合合合合合| 久操| 91neishe| 小视频国产| K8久久久久| 欧美激情总合网| 久久三| 91中出| 东北操逼| 欧美大香蕉97| 欧美在线永久天堂| 91熟女在线| 久久,精品一二三| 午夜啪啪片| 国产品精品自在在线午夜免费| 国产成年精品高清在线观看91| 精品久久久久,69国产成人精| 日欧毛片久久| 青青草啪啪网| 伊人综合色网| 高清无码 国产精品| 欧美熟妇亚洲版| 精品人妻美妇91job| 国产亚洲精品久久久久小| 欧美亚洲美少妇一区二区| 欧美懂色综合网| 狠狠搞 亚洲91| 伊人五月天| 天天日天天干天天整| 日本操逼视频在线| 日韩三级在线观看网站| 懂色AV中文| 欧洲色色| 丁香色婷婷| 色成人Www精品永久观看| 少妇高潮喷水无套久久久久久| 日韩av一级黄片| 成年女人黄网站| 成人麻豆av电影网站| 91AV入口| 亚洲一级特黄大片在线播放91| 精品然女一区二区| 嗯嗯啊好大| 婷婷综合| 日韩欧美成人大香蕉| 猛交交| 天天操妹子| 精品久操| 精品二区久久| 亚洲欧美人妻| 三级日韩一区二区三区| 热思思免费视频| 国产十八禁视频| 国产日韩人人| 亚洲骚男同com| 久艹99| 九九性爱网| 思思热在线cao| 久久香蕉国产线看观看亚洲女人 | 天天拍天天操| 日韩美女,国产传媒,视频一区| 国产在线76页| 国产九九九九九九| 岛国黄片网站| 一区黄二区黄| 色97欧美| 亚洲欧洲日韩中文字幕一区| 乱操9999| 人妻中文字幕精品无码| 蜜色网色哟哟| 宅男91视频在线播放| 99在线观看视频在线高清| 天堂69亚洲精品中文字| 国产原创剧情在线丝袜 | 欧州91高潮| 啊啊啊男女| www..com操老师| 久久久性爱视频| 青青草在线视频人人想人人上| 久久大香蕉手机高清视频| 日韩精品 欧美激情| 亚洲成人在线播放| 国产日韩在线播放av| 日韩不卡av一二三| 不卡二三区人妻少妇| 97视频在线免费看| 岛国大片在线观看网站入口| 大香蕉手机在线| 伊人激情五月天一区二区| av日韩中文字幕| 久久久人妻| 91综合色噜噜| 亚洲激情av| 欧美综合天天| 欧美亚洲清纯| 日韩中文字幕二区| 99久国产精品午夜性色福利| 免费网站观看www在线观| 久久人人舔人人爽舔人人av片| 久久黄黄| A级国产欧美激情在线| 色香色欲天天综合网天天来吧| 美女大乳久久久久久久女人18| 久久久久夜夜夜夜| 天堂综合| 日韩Va亚洲va欧美Ⅴa久久| 欧美精品亚洲精品日韩传电影| 白嫩嫩一区| 日韩有码 一区二区三区| 青草园大香蕉| 91成人社区| 日韩人妻网站| 久久老女人| 超碰在线1234区| 久久激情视频| 91久热| av东京热男人的天堂| 国产高清视频无码在线| 欧美十八禁网站| 日本视频一区二区三区| 日韩AV无码中文一区二区| 五月天激情婷婷| 伊人操| 麻豆 欧美 日韩| 国产性爱在线视频一区二区| 激情丁香五月| 日本熟妇浓毛hdsex| 久久精品一区| 五月综合久久| 美女午夜福利免费视频| 欧美日韩中文视频播放| 青青草色插素人| 丁香五月综合| 三级片网站在线播放| 欧美毛片在线网| 国产乱伦亚洲| 国产日韩欧美中文在线播放| 亚洲天堂男人| 乱欲性色| 亚洲色五月| 91A欧美电影网站| 欧美青青视频| 久干网| 蜜桃久久久久久久| 久久人妻精品| 五月天婷婷基地| 中文字幕aⅴ在线视频| 狠狠操一区二区| 天美国产三级传媒| 强奸a片网| 中文字幕日韩人妻视频一区二区三区 | 亚洲欧洲综合av在线| 91色五月俺来也| 看日韩美女二区三区免费操逼视频 | 日本天堂在线播放| 美女让帅哥通她小鸡鸡| 欧日韩一二三f区| 国产97/欧美| 天天综合站| 亚洲色图欧美色图制服丝袜| 精品久久久中文字幕不| 屌妞视频久久久久久久久久久久| 一区二区免费电影久久| 亚洲无码超碰免费| jizzjizz欧美| 羞答答AV中文字| 日韩精品人妻中文字幕不卡乱码| 色五月婷婷五月天| 夫妻四区五区六区| A 天堂在线观看视频| 亚洲一区操| 97精品熟女少妇一区| 亚州欧美综合| 精品综合久久久久久97| 免费视频在线观看啊啊啊啊啊| 色婷婷一区二区三区久久| 精品女同一区二区三区| 欧美一级A一级a爱片久久| 综合国产影视三级| 伊人丁香五月婷婷| 日韩天天综合| 十八禁视频一区二区| 乳欲人妻办公室奶水| 97久久精品亚洲| 日韩精品系列| 中日亚韩免费视频| 麻豆乱码久久精| 骚日日av| 国产成人网站在线观看| 婷婷综合网| 国产精品不卡一区二区三区| 精品人妻中文字幕高清| 欧美色另类| 91老熟妇| 欧美色五月| 99九九久久| 操一对老熟妇爽上天视频| 97中文字幕一区| 伦理弟一页| A级国产欧美激情在线| 久久久涩| 99热只有| 91网站18禁| 午夜120视频在线观看| 色婷婷六月| 国产亚卅97| 边做饭边操逼逼| 色综合一本| 思思热影视| 天天看片麻豆| 黄色电影在线播放综合网站| 久久久精久久久| 很很操在线| 一区二区首页| 中文字幕亚洲永久精品| 99热在线观看| 免费观看性欧美一级| 天天做天天爱夜夜爽毛片试看| 亚洲欧美综合| 青青草吊丝| 欧美亚涩| 亚洲精品三区在线观看| 爱爱动态120秒| 欧美爆操91| 久草毛片电影怡| 操逼视频免费日韩无码| 国产青视频| 日本精品高清一二区一本到| 伊人国产AV| 无码黑人精品一区二区三区三| 狠狠五月天| 69av一区二区三区| 51一区二区三区| 97国产高清视频在线观看| 欧美日韩精品久久久久东北老熟妇| 亚洲天堂资源在线| 国模不卡一本二本三电影| 亚洲乱码国产乱码精网站| 91制服丝袜中文字幕| 亚洲无码一区二区三区三州| 黄色人人| 天天内射| 综合网欧| 亚洲无码一二三区| 久久国产逼| 97色涩| 丁香六月婷婷久久综合| 国产黄片在线免费观看| 夜夜骑夜夜操| 高潮精品| 欧美综合91| 久久精品夜色国产亚洲AV| 五月丁香啪啪啪| 日韩一性一交一A片俄罗斯| 大香蕉碰| 超碰在线99| 国产精品欧美日韩久久| 欧美激情性久久久久久| 欧美伦乱爱| 亚洲精品一区二区三区新线路| dy888午夜老子影视达达兔| 男人的天堂视频精品乱在线| 日韩九九九| 精品人妻一区二区三区视频| 人妻啊啊人妻啊啊| 婷婷五月天小说| 99在线观看| 欧美刺激色黄片免费看| 欧成人精品一区二区三区| 国内精品久9| 内射中国少妇高清视频免费视频 | 情色日播放AV| 日韩少妇丰满亚洲| 天天天天做夜夜夜夜做| 先锋色眉乱伦资源| 91爽啪| 黄色大片一区二区密桃丝袜| a人片中文字幕一区二区| 自拍亚洲综合| 舔足天天操天天射| 精品国产乱码久久久久久久久久毛片 | 精品一区二区啪啪啪| 超碰97资源中文字幕| 97频视在线| 欧美劲爆第一页| 久久精品国产亚洲AV无码做| 亚洲激情网| 色呦呦、国产精品| 国产91专区| 久久黄人人爽视频| 日韩精品1区2区中文字幕| 激情婷婷五月天| 黄色不卡视频| 国产午夜在线观看| 97在线视频观看| 国产激情av女片自拍| 亚洲综合五月天婷婷丁香| 人人澡人人弄| 成人性爱免费播放| 综合网欧美| 操我无码| 欧美72网页| 亚洲爽图| 青青草十区九区爱夜| 国产中午字一暮区| 家庭乱伦麻豆| 久久9视频| 青娱乐手机日韩在线视频| 色欧美综合| 岛国AB视频| 欧美久久婷| 日韩精品 欧美激情| 日本在线不卡一二区| 熟女欧美日韩综合婷婷| 涩综合导航| α√在线| 国产人人干| 东北丰满熟女国产一区| 试看60秒| 日本 成 人 小说 电影 一区二区| 97欧美精品综合| 国产精品久久久久久久久久久久久久吹| 欧美视频激情久久久久久| 欧美一区二区三区大综合| 老熟女综合| 99热99在线播放激情| 美女网站黄页| 一级性爱视频免费在线| 久久人人爽人人爽人人片Ⅴ| 国产精品丝袜在线| 亚洲精品国产AV天美传媒| 国产强奸乱伦欧美| 欧美综合 站| 久久性生大片免费观看性| 91oumei| 一牛一区二区三区久久| 丰满人妻av一区二区三区 | 五月丁香六月激情综合| 国产日韩精品无码去免费专区国产| 国产绿奴视频在线观看| 黄久在线| 特级特黄一级毛片免费| 麻豆亚洲Av成人无码一区精品| 亚洲宗合网| 亚州综合网| 人人妻人人色| 精品国产污一区二区三区| 操逼视频亚洲| 精品久操| 夜夜嗨一区二区三区三州加勒比| 黄在线| 欧美青青草视频| 清柠毛片| 日本 欧美 国产一区| 97超碰天天| 天美传媒国产原创中文字幕亚洲欧美另类 | 色噜噜人妻av中文字幕| 日日狠狠久久偷偷色综合免费| 国产熟女高潮一区二区三区| 亚洲自拍另类丝袜综合| 青娱乐日韩无码| 久久久久久人| 九9精品| 中文字幕久久精视频久久大全| 亚洲精品毛片在线观看| 亚洲第一页色网| 欧美劲爆视频一区二区| 国产精品久久久久无码A√| 欧综合网| 久久久久久九九九| 亚拍在线| 午夜啊啊| 久久综合女优| 色色色综合网| 久热69九色熟妇97| 操逼逼无码| 久久m| 婷婷美人网| 试看60秒| 日韩三级av片| 午夜精品久久久| 青青草依人大香蕉| 2017,超碰| 1024午夜激情男人的天堂| 一级日本牲交大片好爽在线看| 国产情色第一第二页在线观看| 欧美性爱日韩性爱| 国产乱码精品一区二区三区四川| 久久大| 亚洲成a人v欧美综合天堂下载| 欧洲小说色图视频另类| av橘色网站| 秋霞午夜成人福利片片| 人妻中文字幕精品无码| 污啪啪啪视频| 日本 情色 1区2区3区| 九九九九九九九九九国产精品| 国产综合久久久鬼色| 久久最新视频免费观看| 欧美 综合| 中文字幕av一区二区三区人妻少妇 | 超碰97玖玖爱| 亚洲美女精品九九视频| 啪一啪免费视频| 久久久久久久久久久久久久久性生活视频| 国模吧 一区二区三区| 曰韩av中文字幕专区| 囯产精品久久久久久久久久梁医生 | 国产乱伦亚洲| 国产日本一区二区三区蜜臀在线观看| 国产9l 大屁股| 日本午夜操逼| 新视频sss国产| 国产精品人人爽人人做可爱福利| 精品久久久久久中文| 亚洲高清无码AAA久久久精品| 日韩精品一区二区日韩| 福利伊人玖玖国产| 加勒比五月天| 无码国产Av| 男人天堂日日夜夜| 欧美大香蕉久| 自拍二页| 黄色毛片A片| 欧美情色贴图| 99久久久无码精品国产人| 成人精品视频一区二区| 国产精品com| 丁香五月综合| 91天堂丝袜美腿| 无码免费精品高清| 亚洲91综合| 国产日韩欧美三级片| 日韩精品国模| 搡老熟女老女人老熟妇免费视频| 天堂蜜桃无码视频一区二区| 大香蕉一级黄色片久久| 久超碰在| 99热在线播放| 天天碰操中国年青熟妇| 日韩国产乱子伦App| 伦理片秋霞免费影院| 国产精品视频在线观看| 久久久不卡区一区二区三区久久久| 欧美久久人体| 亚洲午夜免费狠狠干| 青青欧洲黑| 人人操人人肉久久精品| 亚殴在线| 午夜精品视频777| 日韩在线观看三级电影| 干美女人妻| 日韩啪啪啪视频| 操婢日韩| 熟妇熟女一区二区三区| 欧美激情欧美精品| 日韩中文字幕人妻视频| 超碰欧美97| 亚洲精品蜜桃久久久| 91精品国产91久久青草| 丰满少妇高潮无码| 18禁精品网站在线看| 欧美姓爱综合网| 九七毛片九九毛片| 久久精品老司| 7月婷婷综合| 91粉嫩萝控精品福利网站_精品影音先锋国 | 日韩一性一交一A片俄罗斯| 爱欲AV| 天天爽天天| 国产成人精品日本亚洲语言| 淫骚熟女一区二区三区| 丁香六月激情| 91亚洲黑人| 懂色AV一区二区三区| 一起草三级AV电影在线观看| 精品久久久久,69国产成人精| 91天天综合日韩欧美| 91九色精品熟女内射| 中文字幕一区电影在线观看| 好湿好紧视频| 好吊色青靑草| 免费看黄片现成| 亚洲成aⅴ人片不卡无码| 亚洲91网站| 欧美 亚洲 大香| 熟妇视频一区二区三区在线观看| 色操逼网| 手机在线视频国内精品| 91天天| 韩国轻伦国内自拍一区| 久久久久网站-538在线视频-欧美永久乱码 | 中文有码9| 偷拍导航视频网站| 日韩精品人妻一区二区| 黄骗免费网站| 777AV电影| 九九人人操| 久久久久久91香蕉国产| 玖玖视频在线资源一区二区三区| 91深夜夜| 亚洲中文字幕在线视频一区二区| 激情文学亚洲| 麻豆人妻偷人精品无码视频| 易易A毛视频| 久久男人精品| 嗯嗯啊在线视频| 亚洲一本色码中文字幕| 亚洲女人毛茸茸91| 激情综合网亚洲| 中文字幕成人理论在线| 综合国产97| 亚洲的天堂网| 精品中文日韩字幕视频| 性色AV蜜色av色欲av| 久久av成人无码免费| 欧美日韩超碰在线| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 天天操女人| 亚洲91射| 操逼操网| 欧美日韩人妻婷婷一区| 后入式五六区| 69少妇一区二区| 国产无遮挡| 91综合熟女| 国内三级自拍小视频在线观看| 国产成人网| 婷婷九月丁香| 先锋精品av色鲁| 爱爱啊啊啊| 操91| 97色网| 亚洲激情网| 91欧| 欧美亚洲激情小说| 无码免费在线观看黄色片| 99国产天美| 久久久久免费看少妇A片特黄| 超碰97综合在线| 五月天激情小说| 亚洲无码超碰免费| 日欧操屄视频| 新精精品久久精品| 激情综合网激情五月天| 日韩免费簧片| 欧美人妖内射| 又摸又舔在线观看网站| 超碰成人国产| 亚洲色图尤物视频| JuliaAnn丝袜熟女系列| 黑人与人妻| 97操97色| 99在线精品视频| 99re国产精品视频| 秋霞网无码| 欧美日韩国产传媒在线精品| 国产13区| 午夜福利精品| 亚洲色图图片| 熟人人妻少妇精品久久| 中文字幕精品专区搜索结果91| 人人操人人搞人人草| 国产精品第一页国产大屁股视频免费区| 成人av在线播放| 免费国产视频| 校园春色五月天| 国语少妇精| 91 综合网| 麻豆人妻精品一区二区| 精品少妇一区二区三区免费观看| 96精品久久久久久久久| 风间由美日韩欧美久久| 日韩人妻精品| 吊色| 精品久久久一本一道| 日韩八十路老熟女| 死我十八禁| 国产精品97超碰| 欧美性爱97超碰| 四虎永久在线精品免费网址| 中文字幕版| 东京热不卡视频| 亚洲好色人妻| 白丝AV| 亚洲伊人a线观看视频| 国产av美女被艹的乱叫| 人妻熟女一区二区| 欧美精品,四区。五区| 久久久国产成人一区二区三区在线| 亚洲男人电影天堂| 韩三级a视频在线观看| av网页一区二区三区| 日韩人妻一区二区精品| 亚洲一区二区三区久久 亚洲一区二区| 国产精品久久久久久久无码AV| 久久久96精品| 91少妇人妻| 欧美1区二区三区公司| 99re公开精品免费视频| 丁香五月久久| 91伊人大香蕉| 欧美黄色图片| 玖玖综合视频| 脫衣舞一区二区三区| 99re不伦| 九九RE视频在线精品| 亚洲国产一区二区三区在线 | 秋霞免费无码视频日韩A片| 亚欧性爱无码| 综合网欧美在线| 人人妻天天做天天爽| 国产91福利小视频在线观看| 国产极品一区二区三区三州| 福利风月五月天影院| 欧美在线天堂| 国产精品白虎| www. 男人天堂成人在线| 在线日韩精品一区二区三区| 久久午夜色播影院免费高清| 啪啪资源网| 国内精品a| 爱爱动态120秒| 麻豆久久久久久久久丝袜| 久久三区四区| 国产吞精a级片激情电影| 亚洲欧美setu| 五月婷婷hd| 亚洲另类色综合网站| 成人欧美一区二区三区黑人一| 看一级黄色视频| 欧美有码亚洲中文字幕一区二区三区四区| 日韩传媒在线| 国产传媒午夜理伦精品| 99热99色| 精品久久久不卡一区二区| 亚洲日韩电影| 欧美精品第3页| 九九九九九九九九九九精品视频| 综合视频91| 天美精品原创av片国产| 五月香婷婷| 超碰97起碰| 麻豆区久久久久亚| 加勒比海色香蕉婷婷| 欧美精品久久久久久久久88| 欧美亚洲综合色| 亚洲骚男同com| 黄色在线网站| 亚洲精品美女操逼| 无码一区免费在线不卡| 成年人一级黄色毛片大全在线观看| 十八禁视频网站| 旡码电影特区| 国产日韩中文字幕欧美| 三级特黄60分钟播放| 99re8免费高清在线| 国产91影院| 特级大荫道BBwBBwBBW| 久久精品导航| 六月丁丁香| 国内毛片四区| 国产又爽又黄| 激情欧美97| 日本三级黄页| 精品免费视频国产一区| 白丝1区2区3区| 人人弄人人摸| 天天综合香 ld视频| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 一本色道无码DVD中文字幕| 久久久久久性爱片| 78久久| 国产精品肉丝自拍| 女同女同恋久久级三级| 亚洲精品色| 91社区伊人| 诱惑人妻欧美一区在线播放| 久久性生大片免费观看性| 成人无码专区精品视频| 一级性爱啪啪视频| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 色色五月天婷婷| 水多多映视AV| 九九色色| 一区在线精品中文字幕| 狠狠干综合| 26UUU欧美日本| 久久久99999久网站| 国产日韩欧美三级片| 97在线免费看视频| 熟女一区二区三区| 欧美色就是色| 足交视频老司机| 综合久久婷婷| 手机午夜电影神马久久| 欧美在线55555| 精品美女久久久久| 色天堂在线观看| 国产精品爽爽v| 久久天堂网| 1956日韩精品| 91社操逼| 大香蕉青青9| 日韩婷婷| 国产精品亚洲一级av第二区| 97硬碰| 五月丁香社区婷婷日韩欧美精品影院| 日本天堂在线播放| 992这里有精品| www.99中文字幕| 久久超碰大香蕉| 六月婷婷激情| 久久五月天婷婷丁香中文字幕| 北京美女一区二区| 午夜福利无毒不卡| 亚洲资源站| 蜜桃久久综合视频| 黄色工厂这里只有精品| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | A V少妇特黄三级| 日韩亚洲中文字幕在线| 麻豆精品.欧美精品.日韩精品.| 久久久999日本大片| 久久成人国产| 蜜屁av| 欧美 熟女 日韩| 日韩精彩免费| 国产精品熟女乱伦| 超碰在线香蕉| 亚洲色图 欧美| 物业黑人 AV一区| 影音综合网| 国产精品探花在线| 中文字幕一二区二三区人妻专区| 插入综合网| 欧美性爱在线无码| 亚洲无码成人精品| 五月丁香六月综合缴清无码 | 国产女同视频在线播放| 91天堂丝袜美腿| 超碰69| 国产精品亚洲四五区在线观看| 人摸人人操人| 亚洲人妻中文在线视频| 伊人麻豆传媒| 97视频在线观看网站| 小骚逼被操的爽不爽| 熟女视频久久| 国产精品99精品视频网站| 麻豆91熟妇人妻中文字幕茄子| 精产国品一区二三产品| 日韩欧美视频青青| 激情视频网址| 99热在线播放| 久久人妻办公室视频| 激情五月综合网| 二色av| 人人摸人人干| 2020视频1区2区3区| 91爽啪| 嗯啊啊啊轻点视频 | 九九久久一区二区伦理| 樱花蜜乳av| 精品成人亚洲午夜电影| 色天天野狼综合社区| 中文字幕乱码人妻一区二区三区,99精品| 精品人体无圣光凹凸| juliaann欧美丝袜办公室| 嗯~啊~轻一点 视频| 国产激情在线| 天天澡天天爽日日av| 男人网站婷婷| jiujiujiujingpin| 玖玖超碰熟| 一区超碰一区| 亚州性色| 狠狠操狠狠燥| 青青草一区二区高清无码视频| 青青草字幕AV| 青青草视频在线观看一区二区| 人人考人人摸人人干| 日韩熟女乱伦中出| 强奸乱伦大香蕉网| 99视频这有这里有精品| 浪人综合网| 无码国产精品96久久久久孕妇| 97精品一区| 性色avv| 性老妇一区二区三区| 久久亚洲人妻| 久久亚洲欧美一区二区三区-亚洲国产精品第一区二区 | 99无码| 无码人妻一区二区三区色欲aⅴ| 亚洲深夜福利| 欧美gv在线观看| 亚洲一区二区三区中文字幕| 亚洲日本韩国在线| 日日夜夜干| 亚热日本熟女| 天天操天天干美女网址导航| 精品视频在线观看精品| 国产精品美女视频诱惑| 免费精品人妻一区二区三| 午夜男人一级A片7777| 26uuu国产日韩综合在线观看| 91天天综合日韩欧美| 欧美日韩久久精品爱爱| 91 欧美| 福利视频一区二区微拍| 91美女视频在线观看| 九色精品视频导航1| 中国国国产一级特黄毛片| 精品国产乱码久久久久久久久1 | 78m成人视线| 亚洲欧洲无码bt精品合集| 日本成人电影资源网| 人妻激情偷乱视频一区二区三区 | 日韩成人综合网| 青青草日本中文字幕| 超碰在线免费一区二区三区| 吖在线不卡一区二区国产剧情| 蜜臀AV秘一区翔田千里| 国产精品久久久鸭无码的功能| 欧美做爰无码A片视频| 亚洲天堂另类美腿| 欧美日韩亚洲少妇寂寞影院正在播放 | 午夜精品久久久久久久久久蜜桃| 亚洲在线a| 婷婷激情五月天小说网| 国产家庭乱伦表演| 亚洲日韩精品在线播放| 97人肏| 91模特在线观看| 日韩 欧美 视频 在线 一区| 夜夜爽爽爽| 97在线播放 | 免费国产| 国产精品com| 51一区二区三区| 97蜜桃综合| 午夜福利 成人 91| 翔田千里AⅤHD无码| 日韩午夜啪啪视频| 欧美色图 人妻| 欧美成熟性爱精品| 国产精品色色| 熟妇一区,二区,三区。| 97超碰色色| 樱花蜜乳av| 激情综合色| 青操影院| 国产精品一级特黄aaa大片在线观看| 亚欧高清v| 美女骚尻视频| 国产亚洲精品A在线观看下载| 日韩黄色电影网站| 精品人妻一区二区三区夜夜| 性久久久| 激情网五月天| 在线二区不卡| www色色色com| 另类老少妇| 日韩中文字幕在线视频观看| 超碰中文字幕人妻草一区| 麻豆天美在线| 亚洲偷拍自拍在线视频| 色哟哟av| 日韩免费看黄片| 精品制服美女中文一区二区三区| 日韩精品人妻| 亚洲精品视频二区| 精品亚洲| 又黄又爽在线观看视频 | 伦伦成年午夜免费视频| 国产亚洲色婷婷99精品91| 国产成久久综合片| 天天夜夜久久| 国产精品96| 日韩视频啪啪| 欧美高清在线| 久久精视频美日韩在线视频| 性欧美| 亚洲熟女中文字幕在线| 久久神马影院| 熟妇xxxxx性春色| 国产天美欧美| 嗯嗯啊啊操我| 日日干夜夜操视频h| 亚洲欧美91| 五月婷婷综合网| 91综合在线| 熟妇视频一区二区三区在线观看| 夜夜高潮夜夜爽夜夜爱爱一区| 日本欧美韩国国产在线| 欧美大干日韩| 欧美一区二区福利在线| 操淫穴亚洲五月丁香 | V A在线| 97色伦欧美| 日韩黄色片子| 久草老司机| 欧美午夜精品久久久久久3D| 黄色香蕉视频网站一区| 国产高清在线自在拍69| 黄污污污污| 看免费的黄片| 日韩精品区二区三区不卡| 欧美激情另类一区二区| 人人操欧美风骚| 亚洲天天精品| 国产免费久久精品99re韩国| 99久久9| 五月丁香综合啪啪| 乱伦日本色图AⅤ| 国产高清26uuu| 99re黄| 日韩91网| 日本道人妻久久久在线不卡色视频| 在线看的av| 一区,二区,三区网站| 天天欧美色| 97人人草| 成人线上超碰| 97伊人超碰| 欧美高清无码免费视频高清版| 午夜精品一区二区三区三上悠亚| 国产精品一级二级在线| 亚 欧 美 综合| 日韩精品一二三四| 天天射影院| 九九九九九九视频| 日韩无码操逼片| 日韩熟女操逼| 精品中文一区二区| 久久精品国产Aⅴ| 麻豆人妻精品一区二区| 国产精品内射婷婷一级二| 超碰 国产熟女精品一区| 嗯嗯嗯好爽| 天天干夜夜一操| 超碰95| 精品少妇一区二区| 操人妻少妇中文| 国产熟女完整版中字| 97欧美色综合| 久久不卡一区二区| 超碰在线99| 久久av成人无码免费| 日本韩高清无砖码22o| 国产后入式在线观看| 欧美精品双插| 嗯嗯,啊啊,国产精品| 欧洲综合无码| 欧美亚洲手机在线| 9.1小视频| 国产肏屁眼视频| 女人天堂AV五区在线| 久热婷婷| 国产黄片在线免费观看| 国产精品4p在线观看| 人妻少妇无码| 亚洲国产亚洲天堂| 丁香六月婷婷久久综合| 视频国产精品未满十八禁止在线观看| 亚洲骚逼少妇| 色偷综合| 激情视频一二三| 亚洲视频一二区| 殴美大黄片| 黄片免费久久久久久久| 日韩免费在线观看不卡| 久久久久9999| 欧美成人性活片| julia国产在线 | 欧美一级黄色免费专区| 国产成人久久精品蜜臀| 亚州日韩97| 国产1727欧美| 碰超人人在线一区二区三区| 丝袜喷水在线| 成人日本精品九区| 91色黑人少妇| 国产精品无码在线| 欧美日韩性爱无码| 97天堂| 亚洲做性| 96精品久久久| 免看60秒涩涩视频| 欧美啪啪啪91| 日影院久久婷婷夜夜网| 岛国不卡超碰护士AV在线播放| 欧美日韩情色一区二区| 欧美另类精品xxxx| 免费人成毛片乱码| 一本久道久久综合狠狠爱| 国产又黄又粗的视频| 美國A片| 五十路人妻在线| 2020国产精品| 尤物av网站免费在线播放| 肥臀熟女福利视频一区二区| 大学生口爆吞精| 少妇贴图| 日本不卡三级网在线播放| 中国熟女91| 日韩欧美午夜视频在线| 欧美第五页| 91狠婷| 国产成人亚洲精品无码古代早漏男 | av网站在线观看了| sewuyueav| 天美av在线观看| 欧洲综合色| 999久久久久久久精| 性爱网站一区二区| 日日躁天天躁狠狠躁| 99色热| 人人操人人干xxx| 精品中文字幕第一页| 精品久久久久,69国产成人精| 天天干天天操天天干天天操| 狠狠爱综合| 亚洲午夜免费狠狠干| 青青草中文-久久青草精品一区二区三| 无码人妻丰满热妇又大又粗| 久久久久成人亚洲国产| 精品少妇一区二区三区免费观看| 久热91| 国模限制级电影| www四虎|