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

一個 JS 框架需要做什么

開發 前端
那這篇文章要說的是什么呢?就是假設你現在什么都沒學,就靠基本功,去完成一個靜態頁面,當然也有業務邏輯,包括數據的 CRUD、動畫,怎么做?有個關于 VanillaJS 的梗不知道大家看過沒,你一定會會心一笑的。

為什么這么說?不知道各位有沒有發現,雖然前端發展快,但一些有名的框架至少會火熱很長時間,比如 Backbone、React、Ember 。如果有心要學,肯定有足夠的時間把它學會,畢竟事實擺在面前,很多公司的上線產品就是用 React 來寫的,比如 Teambition 的簡聊,貌似它是從 Backbone 重構過來的。然而,很多同學在接手新項目時,常常會不知所措,不知道用什么技術去做,或者說,只依賴于擅長的技術,就算在一些場景中它可能并不是最適合 的。

因為這些同學平時不夠努力嗎?不是吧。他們可能會看書到很晚,瀏覽很多博客,就是為了去了解 CORS 的應用,或者是想知道為什么 Angular 中的 scope 在某些時候不能雙向綁定了。對,時間是花了,但遇到問題還是一頭霧水。可能前端就是這么一份工作吧,慫恿你去學游泳,蛙泳、自由泳、蝶泳,海嘯來了照樣被 沖走……

那這篇文章要說的是什么呢?就是假設你現在什么都沒學,就靠基本功,去完成一個靜態頁面,當然也有業務邏輯,包括數據的 CRUD、動畫,怎么做?有個關于 VanillaJS 的梗不知道大家看過沒,你一定會會心一笑的。

沒有 jQuery 了,沒有 Bootstrap 了,扔掉所有你引以為傲的武器,但大惡魔 IE 6 還在。具體的需求不給了,反正給了你們也不會照著去實現,真有心要做的話,可以做一個 todo app 吧。

[[153714]]

DOM 查詢

在沒有第三方框架可以用的時候,如果真的按照功能列表,從第一條實現到最后一條,每個模塊用自執行匿名函數包起來,所有代碼寫在一個文件中,看上去十分合理,但真這么做的話,恐怕你會瘋掉吧。哦,好處是你可以跟別人吹噓今天寫了三四百行代碼,產量很高呢!

所以,不使用第三方框架,我們可以自己寫,它的功能只要符合應用場景就可以了,不用去考慮各種不會發生的奇葩情況。

好,開始。我們最依賴的功能是通過 CSS 選擇器獲取相應的 DOM 元素,這里只使用兼容性最高的方式,就是 id 和元素名選擇器。

 

  1. var idRegex         = /^#[\w\-]+/i, 
  2.     tagRegex        = /^[a-z]+/i; 
  3.       
  4. function query(selector, context) { 
  5.   context = context || document; 
  6.  
  7.   if (idRegex.test(selector)) { 
  8.     return document.getElementById(selector.substring(1)); 
  9.   } else if (tagRegex.test(selector)) { 
  10.     return context.getElementsByTagName(selector); 
  11.   } 
  12.  
  13.   return null

對了,我把所有 DOM 操作放在了 F.DOM 命名空間下,所以是這樣使用 query 方法的:

F.DOM.query('#id');

的確比 jQuery 的 $('#id') 方式麻煩很多,但“子不嫌母丑,狗不嫌家貧”,自己寫的代碼,再爛也要用下去。

另外一些必須的操作就不把代碼貼出來了,比如說 addClass、removeClass、hasClass 等。

DOM 事件

如果有同學參加過面試的話,我想“怎么去監聽一個 DOM 事件?請盡可能考慮瀏覽器兼容性”這個問題是經常會問到吧。這兒寫一個可行方案吧。

  1. / 監聽 DOM 事件 
  2. function addEventListener(el, event, handler, useCapture) { 
  3.   if (el.addEventListener) { 
  4.     el.addEventListener(event, handler, useCapture); 
  5.   } else if (el.attachEvent) { 
  6.     el.attachEvent('on' + event, handler); 
  7.   } else { 
  8.     // not support 
  9.   } 
  10.  
  11. // 取消 DOM 事件 
  12. function removeEventListener(el, event, handler, useCapture) { 
  13.   if (el.removeEventListener) { 
  14.     el.removeEventListener(event, handler, useCapture); 
  15.   } else if (el.detachEvent) { 
  16.     el.detachEvent('on' + event, handler); 
  17.   } else { 
  18.     // not support 
  19.   } 

我知道大家可能有更好的,或者更完善的方案,但抱歉這里討論的重點不是它。

關于 DOM 事件方面,還有一些有用的方法,比如 preventDefault 和 stopPropagation 也可以自己去封裝一下。然后這兒想討論一下 DOM 加載完成的事件。jQuery 中我們會這么用:

  1. $(function() { 
  2.   // ready 
  3. }); 

如果我們也想封裝一個類似的方法,可能會這么寫:

addEventListener('window', 'load', callback);

可是 load 事件是在什么情況下觸發的呢?當頁面上的所有資源,包括圖片,加載完之后才觸發!也就是說,如果圖片很多,網速很慢,那觸發 load 要花很長時間。在本地調試時不會有這種延遲的問題,所以往往會被忽略。

那怎么改正呢?第一,可以把 <script> 放到 <body> 中所有元素的下方,就不需要監聽任何“加載完成”的事件了。第二,監聽 DOMContentLoaded 事件,IE 9+ 支持。至于如何兼容低版本瀏覽器,可以看這篇文章 (addDOMLoadEvent)

#p#

組件式開發

“組件”這個詞其實來源于很多框架,比如 Backbone 中的 View,React 就更不用說了,它為了組件化專門規定了 JSX(當然它有更宏偉的 goal) 。我們這里討論的組件也是差不多的意思,就是按照功能,把頁面上分成一個個獨立的模塊,模塊之間通過消息(事件)進行溝通。關于模塊耦合,JSX 是通過類似于 HTML 標簽嵌套的方式來表現的,而我們自然沒這么高級,就直接把依賴的模塊注入到其他模塊中,比如:

  1. /** 
  2. * 應用頂層,構造一些頁面中用到的組件 
  3. */ 
  4. function App() { 
  5.   F.Component.call(this); 
  6.  
  7. App.prototype = new F.Component(); 
  8.  
  9. F.extend(App.prototype, { 
  10.   constructor: App, 
  11.   init: function() { 
  12.     this._blogPost = new BlogPost('#blog-post'); 
  13.     this._blogList = new BlogList('#blog-list'this); 
  14.     this._newsList = new NewsList('#news-wrapper'); 
  15.   } 
  16. }); 
  17.  
  18. new App(); 

其中,BlogPost 是發布日志的組件,BlogList 是日志列表。發布日志后必然會顯示到列表中,所以在構造日志列表時,會把 BlogPost 注入到 BlogList 中。

每個組件可以提供一個 id 選擇器,表示該組件需要繪制在哪個元素內。

消息傳播機制

關于 BlogPost 和 BlogList,大家可以想象微博的主頁,它上面是一個發布框,下面是微博列表,就是這樣一個界面。

當微博發布之后,列表中需要增加新發布的內容,這個過程是誰給誰發消息?按照面向對象的思想,應該是類似于這樣:

// 在 發布框組件 中調用 列表組件 的方法
blogList.add(item);

顯然是 BlogPost 依賴于 BlogList 對嗎?但貌似我們上面的代碼不是這個邏輯,而是反過來。那么實際情況就成了這樣:

// 發布框:BlogPost 中觸發事件
this.emit('add', item);

// 列表:BlogList 中監聽事件
this.listenTo(blogPost, 'add', handler);

// 由 handler 處理發布事件

嗯,代碼變多了,看來得強行圓回來。

為什么我強烈建議使用后者?假設過了一段時間,某個充滿創意的策劃突然告訴你,當發布微博之后,可以顯示到朋友圈(假設有這么個東西)。那么前者的方式會怎么做?是不是首先給這個發布框多注入一個依賴,即朋友圈,然后調用朋友圈的某個方法?

如果再過段時間,又有新創意了,是不是又得給發布框加依賴了?最后搞得發布框依賴于微博列表、依賴于朋友圈、依賴于其他 8 個組件,真不想用水性楊花來形容它。

這個問題很常見吧?如果用消息機制的方式就會好很多,只需要在新增加的組件中監聽發布框的 'add' 事件就可以了。

如果你能接受這個方式,可能想知道怎么去簡單地實現它。

 

  1. var Event = F.Event = function Event() { 
  2.  
  3.   // 該組件相關的所有的事件都保存在 _events 對象中 
  4.   // 格式 - {'eventName': [{handler, context}*]} 
  5.   this._events = {}; 
  6. }; 
  7.  
  8. F.extend(Event.prototype, { 
  9.  
  10.   // 監聽事件 
  11.   on: function(event, handler, context) { 
  12.  
  13.     if (!this._events[event]) { 
  14.       this._events[event] = []; 
  15.     } 
  16.  
  17.     this._events[event].push({ 
  18.       handler: handler, 
  19.       context: context || this 
  20.     }); 
  21.   }, 
  22.     
  23.   // 觸發事件 
  24.   emit: function(event) { 
  25.     var events    = this._events[event] || [], 
  26.         args      = []; 
  27.  
  28.     // 第一個參數為事件名,后面的參數需要傳給處理該事件的方法,記錄到 args 中 
  29.     if (arguments.length > 1) { 
  30.       args = slice.call(arguments, 1); 
  31.     } 
  32.  
  33.     // 回調時需要傳入參數 
  34.     events.forEach(function(v) { 
  35.       v.handler.apply(v.context, args); 
  36.     }); 
  37.   } 

把重點部分貼了一下。第一,這個 Event 是所有組件的基類,所以每個組件都有 on 和 emit 方法。第二,F.extend 的作用就是把后面對象的方法和屬性直接賦值給第一個,extend 的意思是“擴展”而不是“繼承”,這點別混淆了。第三,通過改變上下文(就是 this),當一個組件的事件觸發時,由另一個組件處理。

由于上面省略了很多代碼,一般還要考慮的情況有,怎么取消監聽,怎么實現例子中的 listenTo 等。

組件繼承

關于繼承,這篇文章略有提到(4.2 通過 prototype 實現繼承)。

這里就寫個 F.extend 技巧好了。一般來說,會在繼承之后修改 prototype 的 constructor 屬性,并在它上面定義很多方法,就變成了:

  1. A.prototype = new B(); 
  2. A.prototype.constructor = A; 
  3. A.prototype.f1 = function() {}; 
  4. A.prototype.f2 = function() {}; 

大家不妨去實現一個 extend 方法,讓代碼變成:

  1. A.prototype = new B(); 
  2. extend(A.prototype, { /* 原型上的方法和屬性 */ }); 

DOM 事件代理

一個組件往往會對應一個頁面區域,那在這個區域上會有單擊按鈕等一些 DOM 事件。由于在初始化組件時,這些元素還沒有追加到 DOM 上去,所以就不能使用 addEventListener 這個方法來監聽單擊事件。那要怎么監聽呢?

兩種方法。一,在生成 HTML 片段時,設置元素的 onclick 屬性,比如:

container.innerHTML = '<a href="#" onclick="delegate(' + id + ')">click</a>';

技巧在于,這個 delegate 方法是全局的,并且它能通過組件的 id 來找到對應的組件對象,再調用該組件的回調函數。

二,在子元素添加到 DOM 之前,父容器是存在了的,所以可以對父容器監聽 click 事件,然后對 event.target 判斷。

addEventListener(container, 'click', delegate)

無論是哪種方法,具體實現時肯定會碰到問題,這些都是預期范圍內的,所以不用沮喪。

封裝 AJAX

同樣地,面試官極有可能問你“請用原生 JS 封裝 AJAX 的 GET 請求”。你應該已經熟稔于心,或者至少有筆記記錄了怎么寫。

現在要討論的是,如何利用“消息機制”去避免回調。jQuery 中的 ajax 方法需要一個 success 的回調,加上配置 url 等信息,導致完成一次請求所用到的代碼非常復雜,很難閱讀。ES 6 推出了 Promise,使得我們可以用同步的語法去做異步的事,閱讀性得到了提升。

由于我們不能用 Promise,所以就發消息吧,也很優雅。

 

  1. F.extend(Request.prototype, { 
  2.   constructor: Request, 
  3.   get: function() { 
  4.     var xhr   = createXHR(), 
  5.     self  = this
  6.  
  7.     xhr.open('GET'this._api, true); 
  8.     xhr.onreadystatechange = function() { 
  9.       if (xhr.readyState === 4 && xhr.status === 200) { 
  10.         self.emit('success', xhr.responseText); 
  11.       } 
  12.     }; 
  13.     xhr.send(); 
  14.   } 
  15. }); 

代碼并不全,說明一下,Request 繼承自 Event,構造時需要傳入一個 url,表示請求的地址。用法類似于:

// 在某個組件中,this 指向該對象的實例
var r = new Request('http://www.example.com/blogs');

r.get();
r.on('success', callback, this);

貌似有點像 Angular 中 new Resource(url); 的用法。

功能性兼容 (Polyfill)

這部分主要是為了兼容比如說 IE 6 不支持 HTML5 元素的樣式、數組中的高級用法(forEach 和 map 等)、字符串的高級用法(trim)、Function 的 bind 等。

因為是臨時編寫的框架,所以業務邏輯的代碼中需要什么,就補什么。

兼容 HTML5 元素你可以這么做,很簡單:

document.createElement('header');

把所有用到的元素都 createElement 一遍就行了,這段代碼必須放在 <head> 中。

至于兼容 forEach、map、bind 這一些,網上應該有一大堆吧,這兒只是為了提醒各位去考慮這些方面。然后,網上的兼容策略可能很復雜,沒必要,大家完全可以嘗試自己去寫,“過早的優化是萬惡之源”(這是個人最喜歡的名言了)。

淺談模板語言

這個雖然不是必須的,并且在我目前寫的代碼中也沒有考慮到,但經過一位高人提醒,就覺得,咦,很多聽上去高大上的技術,從原理來講都是柴米油鹽這些基礎知識。

如果各位之前對 underscore 中的 _.template 方法并不了解,看完這節應該會幫助你一些。

假設要生成一個用戶名的鏈接,用模板可以這么寫:

<a href="#">{{ name }}</a>

而用現在的方式是這么做的:

var html = '<a href="#">' + model.name + '</a>';

那么怎么通過模板的方式去做,不用費勁地拼接字符串呢?答案是正則。

  1. function parse(template, model) { 
  2.   return template.replace(/\{\{\s*(.+?)\s*\}\}/g, function(match, p1) { 
  3.     return model[p1] || match; 
  4.   }); 

替換時,match 表示由正則匹配到的字符串,這里是 '{{ name }}',p1 表示匹配到的字符串中第一個組的值,這里是 'name',問號 ? 是阻止貪婪匹配,最后由返回值替換 match,這里是 model.name 。

小結

文章中的代碼可能只展示了一小部分,因為我主要是想說明一些值得考慮的點,并不是教程,至少大家可以用這些作為草稿去開始。

繞來繞去,JS 中的語法也屈指可數,那為什么在學習新技術的時候會很焦灼呢?基礎是一個原因,沒有基礎就造不了任何建筑;知識面是另一個,解決問題時最怕的是不知道有某 個答案存在,使用 API 時最討厭的就是不知道它已經提供這個功能了。所以平時應該多看一些文章,有想法就記下來,無論是筆記的方式還是博客的方式都行,寫博客可以強迫你把想法表 達出來,這跟“看懂”是不一樣的。

至于學習的性價比,我只能說,不要停!

你可能覺得,唉,React 是很好,但眼下又用不到,就算學了也沒用,還不如把時間花在績效上。自己寫代碼永遠是個封閉的空間,包括因為遇到什么問題被動地去 google 也好,如果不是主動去看新鮮事物,能力的增長是十分緩慢的。為什么會不斷有新技術產生?這個事情本身就在告訴我們,需要用新的角度去解決新的問題(或者舊 的)。舉兩個例子,IE 在 Windows 系統上是不會自動更新的,現在它死了(Windows 10 Edge);Adobe Flash 適應不了移動平臺,而安全漏洞又頻出,現在它馬上要死了(Adobe 的高層表示并不 care,因為 Flash 只占很少一部分營收)。

互聯網它不跟你講人情的,適者生存。

 
責任編輯:王雪燕 來源: segmentfault
相關推薦

2020-10-29 18:36:02

DenoNode.jsJavascript

2011-02-25 14:26:18

ProFTPDMySQL

2011-11-10 10:04:20

2011-11-15 10:32:27

2023-06-29 00:16:45

2021-03-05 14:55:31

大數據面試跳槽

2021-10-28 22:51:24

比特幣黃金貨幣

2011-11-21 09:40:38

產品經理

2016-03-09 09:42:15

App產品經理項目啟動

2023-09-28 07:23:14

AB 實驗體系算法

2021-04-09 09:45:33

GitOps環境應用程序

2020-08-07 10:40:56

Node.jsexpress前端

2012-08-24 10:46:12

程序員

2015-11-13 16:25:45

電商

2017-09-04 20:20:04

數據中心DCIM工具傳感器

2025-05-22 06:44:23

2021-09-17 13:49:34

數字化

2014-04-29 10:50:16

池建強

2022-04-27 05:55:43

去QA化自動化測試開發

2015-10-26 15:45:33

CIBN
點贊
收藏

51CTO技術棧公眾號

成人美女视频在线看| 日本一区二区在线免费观看| 精品无码国产污污污免费网站| 在线免费看黄网站| 91久久精品无嫩草影院| 国产91富婆露脸刺激对白| 亚洲深夜福利在线| 国产精品日韩一区二区| 国产又粗又猛又爽又黄的视频小说| 九色porny自拍视频在线观看| 久久97超碰国产精品超碰| 亚洲精品国产精品国自产在线| 在线成人av电影| 精品人妻无码一区二区性色 | 国内精品久久久久久| 亚洲色图 在线视频| 欧美老女人性开放| 国产精品久久777777毛茸茸| 亚洲高清免费观看高清完整版| 国产a级黄色大片| www.看毛片| 欧美日韩一区自拍| 精品国产自在久精品国产| 亚洲黄色成人久久久| 免费看污视频的网站| 九九久久精品| 欧美亚日韩国产aⅴ精品中极品| 青青草原亚洲| 伊人久久一区二区| 希岛爱理av一区二区三区| 欧美日韩国产一二三| 亚洲自拍三区| 国产偷人妻精品一区二区在线| 88国产精品视频一区二区三区| 日韩av综合网站| 国产极品美女高潮无套久久久| 国产一级片在线| 美女mm1313爽爽久久久蜜臀| 久久精品一本久久99精品| 日本一二三区在线| av日韩中文| 久久久精品综合| 国产在线999| 欧美黄色一区二区三区| 日韩伦理一区二区三区| 欧美午夜精品一区二区三区| av黄色在线网站| 高清福利在线观看| 国产精品一区二区久久精品爱涩| 久久久久久久久91| 久久精品国产亚洲av久| 免费视频观看成人| 亚洲国产一二三| 日本在线视频一区| 国产夫妻在线观看| 免费日韩视频| 久久亚洲春色中文字幕| 亚洲色图欧美另类| 日韩福利一区| 樱花草国产18久久久久| 久久99精品久久久久久三级 | 在线视频你懂得一区二区三区| 视频一区二区综合| av片免费播放| 国产精品77777| 日韩av不卡电影| 欧美极品aaaaabbbbb| 国产精品99一区二区| 欧美高清无遮挡| 国产又粗又猛又爽又黄av | 影音先锋亚洲电影| 亚洲无av在线中文字幕| 青娱乐国产精品视频| 午夜不卡影院| 亚洲一区二区三区中文字幕在线| 国产在线无码精品| yourporn在线观看中文站| 国产成人在线影院| 国产尤物99| 99热这里只有精品3| 国产成人精品免费在线| 精品欧美日韩在线| 国产福利小视频| 成人av电影在线| 亚洲精品欧美日韩| 亚洲精品国产精品国自产网站按摩| 国内综合精品午夜久久资源| 最近2019中文字幕大全第二页| 蜜臀av一区二区三区有限公司| 9l视频自拍九色9l视频成人| 精品视频在线播放免| 亚洲av午夜精品一区二区三区| 欧美黑粗硬大| 亚洲精品一区二区三区四区高清| 国产ts丝袜人妖系列视频| 香蕉免费一区二区三区在线观看 | 精品自在线视频| 欧美日韩生活片| 神马影视一区二区| 久久久av一区| 亚洲 欧美 成人| 99精品免费网| 欧美在线一级va免费观看| 亚洲精品在线观看av| 欧美三区视频| 国产精品白嫩初高中害羞小美女 | 人妖欧美1区| 亚洲乱码国产乱码精品精98午夜| 一区二区三区四区视频在线观看 | 亚洲高清av一区二区三区| 欧美xxxx在线| 日韩成人激情视频| 亚洲综合视频网站| 欧美一区二区三区另类| 久久成人综合视频| 蜜桃av免费在线观看| 国自产拍偷拍福利精品免费一 | 免费看一级视频| 国产宾馆实践打屁股91| 午夜精品视频在线观看一区二区| av午夜在线观看| 91麻豆精品国产| 中文字幕一区二区在线观看视频| 亚洲人亚洲人色久| 国产午夜精品视频免费不卡69堂| 免费无遮挡无码永久在线观看视频| 蜜臀91精品一区二区三区| 国产中文字幕日韩| 国产三级视频在线看| 疯狂欧美牲乱大交777| 国产精品wwwww| 国产精品毛片视频| 亚洲欧美在线免费观看| 国产中文字幕免费| 成人少妇影院yyyy| www插插插无码免费视频网站| xxx性欧美| 在线免费不卡电影| 日本japanese极品少妇| 在线国产日韩| 国产三区精品| 成人影院在线视频| 欧美唯美清纯偷拍| 欧美 日韩 国产 成人 在线观看 | 9l视频白拍9色9l视频| 国产激情综合| 亚洲精品成a人在线观看| 久久精品第一页| 国产 日韩 欧美大片| 丁香色欲久久久久久综合网| 国产精品视频一区二区三区| 久久精品电影网站| 精品国产亚洲AV| 一级做a爱片久久| 国产精品无码av无码| 国产精久久久| 免费成人高清视频| 亚洲国产精品久久久久久久| 国产午夜精品理论片a级大结局| 综合国产精品久久久| 亚洲最大的免费视频网站| 亚洲精品720p| 黄色片免费观看视频| 国产一区二区伦理| 蜜桃欧美视频| 日本欧美电影在线观看| 在线视频综合导航| 欧美成人久久久免费播放| 激情五月播播久久久精品| 免费成人看片网址| 国产成人精选| 亚洲天堂av综合网| 亚洲专区在线播放| 久久蜜桃一区二区| 久草视频这里只有精品| 另类在线视频| 欧美激情一区二区三区成人| 黄色一级a毛片| 亚洲日本韩国一区| 国产一级特黄a大片免费| 狼人天天伊人久久| 国产精品白嫩初高中害羞小美女| 黄在线免费观看| 欧美午夜精品久久久| 老熟妇高潮一区二区三区| 成人av免费在线播放| 日韩在线第三页| 亚洲精品电影| 欧美日韩精品中文字幕一区二区| 大香伊人久久| 在线观看日韩av| 无码人妻av免费一区二区三区| 国产精品国模大尺度视频| 超碰影院在线观看| 亚洲成人精选| 欧美精品七区| 日韩在线成人| 国产精品久久一| www.av在线| 亚洲国产成人精品久久| 中文字幕资源网| 午夜精品福利久久久| 不卡的一区二区| 一区二区国产在线| 97操在线视频| 国精产品一区一区三区mba下载| 日韩精品有码在线观看| 国产精品久久久久久69| 成人免费在线视频观看| www.这里只有精品| 亚洲免费激情| 蜜桃网站在线观看| 成人在线免费观看网站| 国产精品久久久久久久久久久不卡 | 国产美女娇喘av呻吟久久| 国语对白做受xxxxx在线中国| 黑丝一区二区三区| 50度灰在线观看| 久久福利综合| 亚洲www在线| 国产成+人+综合+亚洲欧美| 51色欧美片视频在线观看| 外国精品视频在线观看 | 欧美国产精品专区| 999精彩视频| 亚洲综合好骚| 成人一对一视频| 欧美精品系列| 成人网欧美在线视频| 秋霞在线午夜| 久久久精品久久久久| 91伦理视频在线观看| 亚洲欧洲日产国产网站| 亚洲欧洲视频在线观看| 91激情在线视频| av黄色免费在线观看| 国产精品中文有码| 黄色小视频免费网站| 国内精品福利| 高清无码视频直接看| 欧美成人一品| 国产青草视频在线观看| 综合一区av| 亚洲av综合色区| 欧美在线国产| 久久久久99精品成人片| 精品一区二区三| 日韩高清av电影| 精品免费视频| 亚洲精品日韩精品| 色小子综合网| 成年丰满熟妇午夜免费视频| 欧美在线二区| av无码久久久久久不卡网站| 在线日韩电影| 影音欧美亚洲| 亚洲最大av| 国产爆乳无码一区二区麻豆| 亚洲手机在线| 国模无码视频一区二区三区| 五月精品视频| 欧美一区二区三区在线免费观看| 亚洲国产合集| 亚洲一区二区精品在线| 亚洲啊v在线观看| 欧洲精品在线播放| 国产偷自视频区视频一区二区| 五月婷婷深爱五月| 国产专区综合网| 久久久久无码国产精品一区李宗瑞| 91在线一区二区| 日韩久久久久久久久久久| 高清不卡在线观看av| 五级黄高潮片90分钟视频| 亚洲国产精品成人久久综合一区 | 亚洲电影中文字幕在线观看| 亚洲一区视频在线播放| 国产精品激情偷乱一区二区∴| 乱h高h女3p含苞待放| 国产精品日韩成人| 国产一二三四五区| 国产精品国产自产拍高清av| 免费在线看黄网址| 欧美日韩国产丝袜另类| 中文字幕你懂的| 精品乱人伦一区二区三区| 日韩专区一区二区| 亚洲成人黄色网| 国产爆初菊在线观看免费视频网站 | 精品久久香蕉国产线看观看亚洲| 在线免费看av网站| 亚洲国产一区二区三区| 中文字幕免费在线看| 亚洲国产成人久久综合一区| 97超碰人人在线| 国内伊人久久久久久网站视频| 国产一区二区主播在线| 日韩av毛片网| 韩国三级大全久久网站| 成人自拍性视频| 国产免费区一区二区三视频免费| 国产精品大全| 国产精品欧美大片| 亚洲一区不卡在线| 亚洲男人影院| 亚洲少妇一区二区三区| 国产精品伦理一区二区| 久久国产视频播放| 精品人在线二区三区| 香蕉视频在线免费看| 深夜成人在线观看| 在线免费看h| 国产精品入口免费| 91精品99| 欧美视频国产视频| 国产一区 二区 三区一级| www.超碰97| 亚洲一二三四区不卡| 一级aaaa毛片| 亚洲图片欧洲图片av| 免费h在线看| 国产精品一区视频| 牛夜精品久久久久久久99黑人| 国产又大又黄又粗又爽| 国产肉丝袜一区二区| 国产综合精品视频| 亚洲国产一区二区三区四区| 在线播放免费av| 午夜欧美不卡精品aaaaa| gay欧美网站| 国产欧美一区二区三区四区 | 亚洲小说欧美另类激情| 欧美精品大片| 黄色片免费网址| 成人免费小视频| 亚洲专区第一页| 日韩中文字幕在线观看| 日本在线观看高清完整版| 成人黄色av播放免费| 久久在线视频| 日本a在线免费观看| 日本不卡高清视频| 1314成人网| 亚洲视频一区二区在线观看| 国产精品久久久久久久一区二区| 日韩有码在线播放| 国产aⅴ精品一区二区四区| eeuss中文| 国产精品综合| 成人免费无码大片a毛片| 国产精品美女久久久久久久网站| 免费又黄又爽又猛大片午夜| 日韩一区二区三| 免费a在线观看| 国产成人av在线| 超碰精品在线观看| 国产二区视频在线| 91丨porny丨首页| 免费高清在线观看电视| 制服.丝袜.亚洲.另类.中文 | 国内外成人免费激情在线视频网站 | 婷婷在线精品视频| 亚洲成**性毛茸茸| 亚洲午夜天堂| 亚洲蜜桃在线| 国产麻豆欧美日韩一区| 日本学生初尝黑人巨免费视频| 在线观看免费亚洲| 视频免费一区| 超碰97国产在线| 欧美激情电影| 国产成人精品综合久久久久99| 午夜影院在线观看欧美| 日本天堂影院在线视频| 91精品久久久久久久久不口人| 欧美日本三区| 在线免费观看成年人视频| 欧美影片第一页| 性欧美1819sex性高清大胸| 韩国成人av| 久久国产精品第一页| 国产真实夫妇交换视频| 在线精品国产成人综合| 97久久综合区小说区图片区| 日韩精品无码一区二区三区免费 | 国产在线一区视频| 亚洲欧美制服中文字幕| 精品国产三级| 六月丁香婷婷激情| 亚洲色图在线视频| 日本私人网站在线观看| 91美女高潮出水| 美女诱惑一区| 熟女少妇一区二区三区| 制服丝袜中文字幕亚洲| 成人影院网站| 乱熟女高潮一区二区在线| 国产欧美一二三区| 国产精品欧美综合| 欧美激情综合亚洲一二区|