整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          踩過許多坑后,送你這份H5交互的頁面跳轉方式總結

          年做了大量的 HTML5 項目,遇到了很多坑。在這個過程中學到了一些之前不具備的知識,所以這篇文章就簡單分享一下這方面的話題。

          傳統的MPA

          首先,說一個比較古老的東西,叫做 MPA。

          MPA 的全稱是 Multi-page Application,意思是整個應用(站點)由多個完整的 html 構成。用戶在頁面 1 點擊跳轉,需要向服務端請求頁面 2,請求成功后渲染。而用戶返回時,相當于是點擊了瀏覽器的返回,頁面退回到之前的歷史記錄,并重新加載出來。

          在這樣的模式下,頁面間切換慢、不流暢的問題比較突出,尤其是在移動端。

          同時,它還產生了幾個小問題:

          • 跳轉動畫:頁面間的跳轉無法實現轉場動畫效果。
          • 如果前一個頁比較長,用戶滑動到頁面比較靠下方的位置后點擊,返回時,頁面無法默認停留在原位置。
          • iOS 右滑返回產生問題,從頁面 1 跳轉到頁面 2,再從頁面 2 跳轉到頁面 3,右滑返回,會直接回到頁面 1 前的頁。

          SPA

          隨著對移動端體驗需求的提高以及技術的進步,另一種模式 SPA(Single-page Application)逐漸成為主流。

          SPA 簡單來說,就是原來在 MPA 中的多個 html,現在被放在了一個 html 中,并被分成若干個片段。跳轉、返回的本質變成了分段的「隱藏」與「顯示」。跳轉不需要反復對服務端進行請求,從而使得頁面與頁面之間切換更加快速流暢。

          在這樣的機制下,跳轉與返回完全由代碼控制,所以可以通過代碼定義頁面轉場的效果、返回。

          在設計轉場動畫時,我們需要留意的是導航欄是 Native 的還是 HTML5 的。如果導航欄是 Native 的,那 HTML5 頁面不包括導航欄,它相當于是網頁外的元素,不在轉場效果的設計范圍內。

          WebView

          說 HTML5 的跳轉,就不得不說 WebView。簡單來說,WebView 是在 App 中用于顯示 web 內容的容器。上文提到的 MPA 和 SPA,都裝在了這個叫做 WebView 的容器中。

          用戶點擊頁面中的元素進行跳轉,除了前面的兩種方式外,還有第三種:新打開 WebView 的方式。在這樣的方式下,跳轉的本質是 HTML5「告訴」Native,由 Native 執行打開新 WebView,并在新 WebView 中加載頁面。

          因為 Native 的機制,打開新 WebView 的同時,之前的 WebView 會被自然、完整地保留。所以這時,之前的幾個問題就變為:

          • 跳轉動畫:頁面間的跳轉動畫由 WebView 之間的跳轉動畫來決定。
          • 返回后頁面停留在原位置:完美支持。
          • iOS 右滑返回:完美支持。

          不過需要注意的地方是,打開新 WebView 是一個資源消耗比較大的操作。如果我們在設計一個流程時,需要比較多的連續使用這種方式,需要和研發同學進行充分的溝通。

          比較特殊的Replace

          前述的三種跳轉,都會產生歷史記錄。MPA、SPA 的歷史記錄是在 HTML5 中產生,新開 WebView 中的記錄是在 Native 中產生。

          在 MPA 或 SPA 中,如果跳轉時使用 Replace 方法,它會用新頁面替換之前的頁面,歷史記錄中沒有之前頁面的記錄。

          這是一種特殊的跳轉方式,在設計一些不可逆的流程時可考慮使用。

          多頁面回退

          了解了上述的幾種機制后,我們來看一個小的應用場景──多頁面回退。

          我們在實際業務中,經常會有這樣的需求。假設我們有 1、2、3 三個頁組成的一個流程,在頁面 3 上有個「完成」按鈕點擊回到頁面 1。在不同的交互模式下,實現這樣的跳轉有著不同的機制。

          1. SPA模式下的正常跳轉

          這種模式是 3 個頁面都在一個 WebView 中。點擊頁面 3 中的「完成」按鈕,回退 -2 ,即回退 2 步歷史記錄,到頁面 1。

          2. 新打開WebView

          打開新 WebView 又分三種方式。

          如果我們把 3 個頁面,拆分到 2 個 WebView 中,如下圖,點擊完成按鈕,即關閉自身所在的 WebView。

          同樣是打開新的 WebView,如果我們按如下圖的方法拆分會稍微復雜。這時點擊完成按鈕,首先關閉自身所在的 WebView,當頁面 2「意識」到自己重新被展現時,自動退回 1 步到頁面 1。

          每次打開新的 WebView,這時點擊完成,回退的本質是 HTML5「告訴」Native 關閉多個 WebView。需要特別注意的是,HTML5 中實現這種方式不是天然具備的,它需要 Native 具有一次關閉多個 WebView 的能力。所以我們在設計方案時,需要了解清楚自家的 Native 是否有這樣的能力。

          總結

          以上,簡單說了幾種 HTML5 的跳轉方式。這些跳轉方式,沒有絕對的對與錯,我們在設計方案時,需要根據實際的業務需求與技術的限制,來整體考慮解決方案。

          根據個人經驗,也有幾點小帖士分享給大家:

          • 前后邏輯交織不復雜的單個頁面,可以考慮使用新 WebView 打開跳轉。
          • 如果是一個任務型的流程,可以考慮將一個任務流包在一個 WebView 中,在任務內使用 SPA 跳轉。不同的任務使用不同的 WebView。保持任務之間的關系清晰明了。
          • 設計上需要著重表現頁面間轉場動畫的效果,優先考慮使用 SPA 跳轉。
          • 為防止流程過于復雜,盡量不要自定義關閉、返回的行為。保持關閉為默認的關閉行為,保持返回為默認的返回行為。

          節課來學習超鏈接實現頁面間的跳轉。

          這是百度的首頁,當把鼠標指針滑到百度熱搜的文章上,指針形狀由箭頭變成了小手,點擊鼠標左鍵,會打開一個新的頁面,展示這篇熱搜文章的內容。

          這個功能是如何實現的呢?就是使用超鏈接。

          什么是超鏈接?當鼠標劃入文本時,文字變成藍色,同時添加了下滑線,這就提示瀏覽者這不是普通的文本而是可點擊的鏈接。

          這個文本被稱作 HyperText 意為超文本,這個術語是由泰德-納爾遜在20世紀60年代提出,是使互聯網發揮作用的關鍵概念之一,超文本是用超鏈接的方法,將各種不同空間的文字信息組織在一起的網狀文本。

          超鏈接就像像橋梁建立了 不同頁面之間的聯系,實現了訪問不同網站中的頁面,有了它 就可以在互聯網的世界中自由穿梭。

          超鏈接實現通過標準的雙標簽 a, a 是anchor單詞的縮寫,是錨的意思,要實現跳轉功能必須攜帶一個屬性href ,它是Hypertext Reference 的縮寫,意為超文本引用,href的值是目標頁面的地址,和圖片的 src 屬性類似??梢允褂孟鄬徒^對路徑,標簽對內的內容為顯示在頁面中的文本。

          我們來實現一個頁面跳轉的案例。

          打開編輯器,新建文件 anchor.html,向頁面中插入兩個 a 標簽,給每個 a 標簽中填入一些顯示的文本,千鋒教育、千鋒前端。

          第一個 a 標簽定義 href 屬性 值為千鋒教育的網址(http://www.qfedu.com/) 第二個標簽不定義任何屬性

          在瀏覽器中打開,兩個都表現出來了,可兩個標簽表現出來的樣式明顯不同,帶有 href 屬性的 a 標簽文本。 默認樣式是藍色的,并且帶有下劃線效果。沒有 href 屬性的 a 標簽文本,就沒有這些樣式了。

          鼠標指針劃入千鋒前端指針的形狀仍然是一個小箭頭,點擊鼠標也沒有任何的響應。 鼠標指針劃入千鋒教育,指針的形狀變成了小手,點擊鼠標左鍵的時候。頁面跳轉到了千鋒教育的官網。

          需要注意,跳轉的目標頁面地址,如果是一個網址,需要帶上 http://前綴,否則就不能實現頁面跳轉。

          可是當點擊超鏈接的文本時,頁面是在原來的窗口中打開的。在點擊 百度熱搜 的一篇文章上時,會打開一個新的瀏覽器窗口,頁面在新的窗口里顯示。

          如何實現這個效果?需要給 a 標簽添加一個新的屬性 target,這個屬性的作用是:定義超鏈接頁面打開方式,值定義為 _self,表示鏈接的目標頁面在當前窗口中打開,值定義為 _blank,表示鏈接的目標頁面在新的瀏覽器窗口中打開。

          回到編輯器,給第一個 a 標簽添加 target 屬性,屬性值設置成 _self?;氐綖g覽器,刷新點擊千鋒教育,仍然在當前窗口中打開,可以看出 _self 就是也是超鏈接 target 的默認值。

          回到編輯器,把 target 的值設置成 _blank,刷新頁面,再次點擊,頁面在新窗口中打開了。

          使用超鏈接跳轉頁面——完。

          文章配套視頻鏈接:

          「鏈接」

          黑帽SEO技術不論多么神奇,不管用戶看到的頁面多么的敏感,但是搜索引擎爬蟲看到的永遠都是正規的信息,而用戶看到的是非常規信息。很明顯,這是因為網站頁面做了處理,能夠分辨出普通用戶和搜索引擎,不同的對象調用不同的頁面,這個就是網站頁面跳轉。

          什么是網站頁面跳轉以及為什么要進行頁面跳轉就不多去細說了,那么怎么進行頁面跳轉呢。關于網頁跳轉技術很多,文章也很多,方法代碼都很多,但是這些方法差別在那里,那些方法速度更快,那些方法更靈活,那些方法用戶能感覺到,為什么能感覺到。夜島SEO看了一些文章,結合多年的黑帽SEO優化工作經驗,通過繪制序列圖等辦法簡單總結一下,換個角度理解一下,希望對大家有所幫助!

          本文夜島重點在于比較http跳轉,html跳轉,js跳轉的工作流程,以及重點分析他們在時間開銷上的情況,同時我們重點在于繪制一些圖形,然后希望讀者能夠從圖中體會到區別,需要讀者體會的地方都用特別區域標識出來了。請大家注意。

          一.什么是頁面跳轉


          網站都是由各種各樣頁面組成,正常情況下A頁面里面包含B頁面,C頁面的鏈接,用戶在瀏覽A頁面過程中,手工人為點擊B鏈接,然后用戶瀏覽器就顯示到B頁面。這個過程我們就可以叫頁面跳轉。

          黑帽SEO中常用的站群排名技術99.9%是必須要做跳轉的,不然排名上去了給客戶看什么內容呢。我們考慮如下場景,一個網站由A,B,C頁面構成。正常他們有他們自己顯示內容。隨著時間推移,發現A頁面內容應該同C頁面內容相同,但是由于A頁面已經被大量用戶收藏在瀏覽器的收藏夾中,或者被搜索引擎收錄,若是現在取消A頁面的地址(就是取消頁面),則對用戶是個非常糟糕的事情,但是同時維護兩個頁面A及C又是個麻煩的事情,稍有疏忽就會造成內容不一致,給用戶造成困惑,同時搜索引擎也會不認可。

          如何保證A地址不取消,同時又準確保證兩個頁面顯示內容相一致?

          我們今天要解決的是在沒有用戶干預下的頁面跳轉,完成當用戶需要顯示頁面A時,我們給他顯示頁面C的內容。

          另外為了說明問題方便,我們同時也假設頁面B內容也指向內容C,只是采用跳轉技術不一樣,這樣我們方便區別兩種行為的差別。



          如上圖中,展示了用戶訪問服務器獲取頁面的一個基本過程。圖中主要分為兩個部分,左側區域是用戶端,右側區域是服務端,用戶端的用戶通過手機或者電腦或者智能設備訪問服務端頁面。

          服務端由若干頁面構成,這里簡化了服務端行為,并且抽象成三個頁面A,B,C,正常情況下服務端應該有很多Action對象,Action對象同頁面相對應,提供各種服務,我們僅僅簡化Page:A,Page:B,Page:C;

          用戶端就是手機,包括手機操作操作系統,網絡層(tcp/ip/udp等),http等協議層,以及瀏覽器,瀏覽器內部進行html的解析,css渲染,js執行引擎等等。

          典型用戶頁面瀏覽行為如下:


          1.用戶啟動瀏覽器

          2.在瀏覽器地址中輸入域名url地址

          3.瀏覽器發起http請求

          4.網絡層發起tcp請求到服務器,傳輸http數據包

          5.服務器接收到請求后進行處理,然后返回相關頁面內容

          6.Tcp接收返回數據給http協議解析系統

          7.http將返回數據返回瀏覽器

          8.瀏覽器解析html數據,處理htmlhead

          9.根據head處理后續工作

          10.解析body數據

          11.處理裝載事件Onload(已經開始js的執行,在裝入數據過程中已經可以執行一些js事件,具體要根據頁面以及瀏覽器特性而定)

          12.根據css進行顯示,執行js

          13.用戶進行后續事情

          以上僅僅是典型瀏覽器行為,具體瀏覽器行為同頁面內容、瀏覽器特性等都有關系,要具體分析。

          二.頁面跳轉的分類


          根據上面的圖1,我們可以有如下分類方法:

          一)以跳轉地點發生系統那一側分為:

          服務端跳轉


          頁面跳轉發生在服務端,服務端負責將實際內容獲取,然后發送給客戶端,這個情況下,一般用戶不會感覺到跳轉的實際行為,因此有些時候我們也不叫做跳轉。具體的服務端跳轉行為有很多,各個技術都有各自的特點。例如:Struts2基于注解服務端跳轉、<request.getRequestDispatcher(“xx.jsp”).forward(request,response)、<jsp:forwardpage=””/>等,php也有自己的放回,總之各自有各自的辦法,夜島就不一一舉例了,大家自己去搜索吧。

          客戶端跳轉


          跳轉行為需要客戶單程序參與的一種行為(自然不是用戶參與的,那個不是本文討論的)。在這個過程中,一般用戶一定會知道的,瀏覽器地址欄會發生變化,這個分類比較多,我們專門進行一個分類。

          二)用戶端跳轉中,我們根據跳轉行為發生在那個軟件層次,分為:http層跳轉、應用層跳轉;應用層跳轉繼續分為:htmlhead跳轉、js跳轉等。

          http層跳轉


          http跳轉是指server根據工作情況通過http返回狀態碼,指示客戶端瀏覽器跳轉到相應頁面的過程,一般返回碼是302.,下面是http302狀態碼的定義:

          Htmlhead頭指令跳轉

          在html代碼的head中添加特殊標簽,如下

          <metahttp-equiv=”refresh”content=”5;url=http://www.heimaoke.com/”/>

          表示:5秒之后轉到黑帽客網站首頁。

          這個跳轉需要瀏覽器具體解析html后才能進行,慎重更多時間才能進行,或者情況更復雜。

          Js跳轉


          通過在html代碼中添加js代碼,通過js代碼實現跳轉

          <scriptlanguage=”javascript”type=”text/javascript”>

          window.location.href=”login.jsp?backurl=”+window.location.href;

          </script>
          這個跳轉應該比htmlhead跳轉更向后延遲。

          服務端跳轉流程


          頁面跳轉顯示的內容發生在服務端,服務端負責將實際內容獲取到,然后發送給客戶端。一般用戶不會感覺到跳轉的實際行為,因此有些時候我們也不叫做跳轉

          具體工作的參考過程如下:



          如上圖,用戶請求訪問PageA,頁面A內容指向頁面C,相關過程如下:

          1.用戶通過瀏覽器訪問PageA

          2.瀏覽器通過http處理模塊請求GetPageA
          3.http處理模塊同服務器建立tcp連接,并發出請求獲取PageA指令

          4.PageA內容指向PageC,通過內部程序將內容C獲取到本地

          5.PageA接收到PageC的數據后,將數據返回給http模塊

          6.http模塊接收到數據后返回給瀏覽器

          7.瀏覽器接收到http返回的html數據后,解析html的head

          8.處理html的body

          9.處理html的onload方法

          10.瀏覽器最后將數據等顯示給用戶

          注意:圖中不同斜線的區域

          通過server跳轉后,用戶看到的是PageC的內容,但是瀏覽器地址欄中地址是PageA的地址。

          優點:跳轉行為在server進行,一次tcp連接完成相關操作,對用戶是透明的,不會造成疑惑。

          缺點:對用戶隱藏了信息,跳轉行為都發生在server端,對server有壓力。

          server端功能各異,需要分工負責,當用戶訪問某功能后,需要返回另外一個功能,這個時候沒必要把全部功能都放到一個服務器上。

          例如:單點登錄:用戶在某個服務器上登錄成功后,一定要在重新跳轉到功能服務器上。

          網絡支付:用戶在銀行的網站支付完成后,必須重新定向到另外企業應用服務器上。

          適用范圍:應用內部系統,適當的包含關系時。

          http跳轉流程


          http跳轉是指server根據工作情況通過http返回狀態碼,指示客戶端瀏覽器跳轉到相應頁面的過程,一般返回碼是302,下面是http302跳轉的相關參考流程

          注意圖中,區域,顏色,斜線等等。



          如上圖,用戶請求訪問PageB,頁面B內容指向頁面C,相關過程如下:

          1.用戶通過瀏覽器訪問PageB

          2.瀏覽器通過http處理模塊請求GetPageB

          3.http處理模塊同服務器建立tcp連接,并發出請求獲取PageB

          4.PageB內容指向PageC,PageB的處理模塊通過http的重定向協議通知客戶端程序,通過發送消息,302,以及跳到目的地址等進行

          5.http處理模塊接收到消息后直接跳轉到目標地址,同時通知瀏覽器(修改地址欄)

          6.http處理模塊請求PageC頁面內容

          7.PageC處理模塊處理數據,生成html代碼,返回數據給http處理模塊

          8.http處理模塊接收到數據后放回數據給瀏覽器

          9.瀏覽器接收到http返回的html數據后,解析html的head

          10.處理html的body

          11.處理html的onload方法

          12.瀏覽器最后將數據等顯示給用戶

          優點:響應速度快,在http1.1協議下通過合適的設置可以使用同一個tcp連接,節省網絡時間,服務器及用戶端都不需要進行額外的數據處理工作,節省時間。

          缺點:僅僅能做跳轉沒有其他功能,基于js及html的跳轉可以選擇延時跳轉,但是302無法選擇延時跳轉等

          適用范圍:快速跳轉,不需要延時,經常用在兩個系統之間跳轉等。

          Htmlrefresh跳轉流程


          通過在htmlhead中添加<meta>標簽,在標簽里指定相關參數,指示瀏覽器跳轉到相應頁面,相關跳轉必須在http層面將html數據傳輸給瀏覽器后,瀏覽器解釋html代碼過程中,發現跳轉并且根據跳轉指令跳轉到相應頁面。

          參考流程如下圖:



          如上圖,用戶請求訪問PageB,頁面B內容指向頁面C,相關過程如下:

          1.用戶通過瀏覽器訪問PageB

          2.瀏覽器通過http處理模塊請求GetPageB

          3.http處理模塊同服務器建立tcp連接并發出請求獲取PageB

          4.PageB處理模塊處理數據,生成html代碼,最后將html通過http協議傳輸回去。

          5.http后將數據放回給瀏覽器,瀏覽器開始處理html

          6.瀏覽器首先會處理html的head部分,最后發現有跳轉的相關指令

          7.瀏覽器根據跳轉指令,重新聯系http模塊,發出獲取PageC的指令

          8.http通過tcp連接到服務器,獲取PageC內容,然后返回給瀏覽器

          9.瀏覽器接收到http返回的html數據后重新處理html,首先解析html的head

          10.處理html的body

          11.處理html的onload方法

          12.瀏覽器最后將數據等顯示給用戶

          優點:跳轉方式靈活,可以指定延時跳轉等等

          缺點:可能多次建立tcp連接,在低速網絡下效率更低,浪費客戶端的時間

          Htmljs實現跳轉工作流程


          最后來看一下js跳轉,工作中每個瀏覽器都有自己的js執行引擎,執行引擎根據js代碼,來動態調用瀏覽器進行跳轉,相關參考代碼如下:

          <scriptlanguage=”javascript”type=”text/javascript”>

          window.location.href=”login.jsp?backurl=”+window.location.href;

          </script>

          具體js跳轉過程如下圖:



          如上圖,用戶請求訪問PageB,頁面B內容指向頁面C,相關過程如下:

          1.用戶通過瀏覽器訪問PageB

          2.瀏覽器通過http處理模塊請求GetPageB

          3.http處理模塊同服務器建立tcp連接同server建立連接,并發出請求獲取PageB

          4.PageB處理模塊處理數據,生成html代碼,最后將html通過http協議傳輸回去。

          5.http后將數據放回給瀏覽器,瀏覽器開始處理html

          6.瀏覽器首先會處理html的head部分,最后會發現有跳轉的相關指令

          7.瀏覽器處理html的body,以及js等,最后根據js的指令指示瀏覽器獲取頁面C

          8.最后根據js的指令指示瀏覽器獲取頁面C瀏覽器會根據跳轉指令,重新聯系http模塊,發出獲取PageC的指令

          9.http通過tcp連接到服務器,最后獲取PageC的內容,然后返回給瀏覽器

          10.瀏覽器接收到http返回的html數據后重新處理html,首先解析html的head

          11.處理html的body

          12.處理html的onload方法
          13.瀏覽器最后將數據等顯示給用戶

          優點:跳轉方式靈活,可以指定延時跳轉等等。

          缺點:可能多次建立tcp連接,在低速網絡下效率更低,浪費客戶端的時間。

          使用訪問:快速跳轉,不需要延時,經常用在兩個系統之間跳轉等。

          頁面跳轉最糟糕的情況


          當A跳轉到B時,我們用符號A–>B表示,下面的循環跳轉A–>B–>C–>A,會發生什么事情。若是循環跳轉僅僅發生在server端,則相關系統會迅速被拖垮。若是循環跳轉發生在客戶端參與的系統中,很快客戶端及server端都會發生問題。

          因此循環跳轉我們是要嚴格避免的,解決辦法:

          1.不跳轉,但是不可能完全避免,并且不太可能實現,一般系統都是開放的系統,會不斷添加功能,即使當前沒有跳轉,但是過幾個月。。。。。。

          2.打破跳轉的循環,加強系統的檢查力度避免循環跳轉的發生。

          3.最重要的,監控系統,當發現某個客戶端或者系統在單位時間內有過多的訪問時,主動斷開連接或者拒絕這個客戶端的訪問等等。這個非常重要,一個好的系統是必須有這個功能的,否則即使沒有循環跳轉,但是若是用戶連續快速訪問一個頁面也是有很大問題的,例如ie中按下F5鍵循環刷新頁面,若是沒有檢測機制。。。。

          三.總結


          每種跳轉方法對于用戶來講都帶來了內容上的變化,原以為A頁面的內容變成C頁面內容。跳轉的方法有很多,夜島SEO無法為大家一一列舉,當我們使用時如何選擇那種類別時,需要弄明白每一種跳轉的特點,包括:性能,功能等,根據不同網絡情況進行不同的選擇,例如有的網絡建立tcp連接速度慢,這個時候就適宜選擇server端的跳轉等。

          若是保證系統之間的耦合關系更小,系統之間更靈活則需要采用http方式跳轉、js跳轉,html跳轉等。

          有的時候需要在跳轉前進行一些判斷或者額外的操作等,就是js跳轉比較方便,但是也有個瀏覽器適配的問題。有時候一個js兼容性不好的js代碼可能不工作,造成部分用戶無法跳轉。
          更多黑帽SEO技術知識學習教程請訪問夜島SEO技術博客(www.yeadao.com),一個專注于黑帽SEO快速排名技術研究與學習教程分享的網站!


          主站蜘蛛池模板: 搜日本一区二区三区免费高清视频| 毛片一区二区三区无码| 国产在线一区二区三区av| 无码人妻一区二区三区在线| 无码人妻一区二区三区兔费 | 日本精品一区二区在线播放| 久久无码人妻精品一区二区三区| 免费观看一区二区三区| 精品国产一区二区三区不卡| 女女同性一区二区三区四区| 中文字幕不卡一区| 精品久久久久久无码中文字幕一区| 手机福利视频一区二区| 久久精品国产第一区二区三区 | 中文字幕AV无码一区二区三区| 在线日韩麻豆一区| 精品女同一区二区三区免费站| 国产福利电影一区二区三区| 精品亚洲av无码一区二区柚蜜| 久久精品中文字幕一区| 国产视频福利一区| 在线|一区二区三区四区| 亚洲第一区视频在线观看| 中文字幕aⅴ人妻一区二区| 中文字幕一区二区三区免费视频| 精品国产一区二区三区| 无码人妻精品一区二区蜜桃网站| 国产成人精品一区二区三区| 一区二区在线视频观看| 免费一区二区三区在线视频| 日本高清一区二区三区| 无码人妻一区二区三区免费| 丝袜美腿一区二区三区| 精品免费国产一区二区| 免费无码一区二区| 亚洲国产精品乱码一区二区| 国产精品合集一区二区三区| 无码人妻精品一区二区三区久久久 | 国产中文字幕一区| 无码日韩人妻AV一区免费l| 狠狠做深爱婷婷综合一区|