成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

10種最常見(jiàn)的Javascript錯(cuò)誤——總結(jié)于1000+個(gè)項(xiàng)目,并闡述如何避免

開(kāi)發(fā) 前端
為了回饋我們的開(kāi)發(fā)者社區(qū),我們查看了數(shù)千個(gè)項(xiàng)目的數(shù)據(jù)庫(kù),發(fā)現(xiàn)了 JavaScript 中頻度最高的 10 種錯(cuò)誤。我們會(huì)告訴你什么原因?qū)е铝诉@些錯(cuò)誤,以及如何防止這些錯(cuò)誤發(fā)生。如果你能夠避免落入這些 “陷阱”,你將會(huì)成為一個(gè)更好的開(kāi)發(fā)者。

為了回饋我們的開(kāi)發(fā)者社區(qū),我們查看了數(shù)千個(gè)項(xiàng)目的數(shù)據(jù)庫(kù),發(fā)現(xiàn)了 JavaScript 中頻度***的 10 種錯(cuò)誤。我們會(huì)告訴你什么原因?qū)е铝诉@些錯(cuò)誤,以及如何防止這些錯(cuò)誤發(fā)生。如果你能夠避免落入這些 “陷阱”,你將會(huì)成為一個(gè)更好的開(kāi)發(fā)者。

數(shù)據(jù)才是王道,我們收集并分析了出現(xiàn)頻次排前 10 的 JavaScript 錯(cuò)誤。 Rollbar 會(huì)收集每個(gè)項(xiàng)目的所有錯(cuò)誤,并總結(jié)每個(gè)錯(cuò)誤發(fā)生的次數(shù)。我們通過(guò)根據(jù) “指紋”(rollbar 用到的一種算法,詳見(jiàn):https://rollbar.com/docs/grouping-algorithm/)對(duì)錯(cuò)誤進(jìn)行分組。基本上,如果第二個(gè)錯(cuò)誤只是***個(gè)錯(cuò)誤的重復(fù),我們會(huì)把兩個(gè)錯(cuò)誤分到同一組。這會(huì)給用戶一個(gè)很好的概括,而不是像在日志文件中看到的那樣直接一大堆讓人感覺(jué)到十分壓迫的 dump。

我們專注于最有可能影響您和您的用戶的錯(cuò)誤。為此,我們通過(guò)研究各種不同公司的項(xiàng)目集來(lái)對(duì)于錯(cuò)誤進(jìn)行排列。如果我們只查看每個(gè)錯(cuò)誤發(fā)生的總次數(shù),那么客戶量大的的項(xiàng)目產(chǎn)生的錯(cuò)誤可能會(huì)壓倒其他錯(cuò)誤,導(dǎo)致實(shí)際收集到的是與大多數(shù)讀者無(wú)關(guān)的錯(cuò)誤數(shù)據(jù)集。

以下是 JavaScript 錯(cuò)誤 Top 10:

10種最常見(jiàn)的Javascript錯(cuò)誤——總結(jié)于1000+個(gè)項(xiàng)目,并闡述如何避免

為了便于閱讀,我們將每個(gè)錯(cuò)誤描述都縮短了。接下來(lái),讓我們深入到每一個(gè)錯(cuò)誤,來(lái)確定什么會(huì)導(dǎo)致它,以及如何避免創(chuàng)建它。

1. Uncaught TypeError: Cannot read property

如果你是一個(gè) JavaScript 開(kāi)發(fā)人員,可能你看到這個(gè)錯(cuò)誤的次數(shù)比你敢承認(rèn)的要多(LOL…)。當(dāng)你讀取一個(gè)未定義的對(duì)象的屬性或調(diào)用其方法時(shí),這個(gè)錯(cuò)誤會(huì)在 Chrome 中出現(xiàn)。 您可以很容易的在 Chrome 開(kāi)發(fā)者控制臺(tái)中進(jìn)行測(cè)試(嘗試)。

10種最常見(jiàn)的Javascript錯(cuò)誤——總結(jié)于1000+個(gè)項(xiàng)目,并闡述如何避免

發(fā)生這種情況的原因很多,但常見(jiàn)的一種是在渲染 UI 組件時(shí)對(duì)于狀態(tài)的初始化操作不當(dāng)。

我們來(lái)看一個(gè)在真實(shí)應(yīng)用程序中發(fā)生的例子:我們選擇 React,但該情況也同樣適用于 Angular、Vue 或任何其他框架。

 

  1. class Quizextends Component{ 
  2.   componentWillMount() { 
  3.     axios.get('/thedata').then(res=> { 
  4.       this.setState({items: res.data}); 
  5.     }); 
  6.   } 
  7.  
  8.   render() { 
  9.     return ( 
  10.       <ul> 
  11.         {this.state.items.map(item => 
  12.           <li key={item.id}>{item.name}</li> 
  13.         )} 
  14.       </ul> 
  15.     ); 
  16.   } 

這里有兩件重要的事情要實(shí)現(xiàn):

  • 組件的狀態(tài)(例如 this.state)從 undefined 開(kāi)始。
  • 當(dāng)異步獲取數(shù)據(jù)時(shí),不管它是在構(gòu)造函數(shù)componentWillMount還是componentDidMount中獲取的,組件在數(shù)據(jù)加載之前至少會(huì)呈現(xiàn)一次,當(dāng) Quiz ***次呈現(xiàn)時(shí),this.state.items 是未定義的。 這又意味著 ItemList 將 items 定義為 undefined,并且在控制臺(tái)中出現(xiàn)錯(cuò)誤 - “Uncaught TypeError: Cannot read property ‘map’ of undefined”。

這很容易解決。最簡(jiǎn)單的方法:在構(gòu)造函數(shù)中用合理的默認(rèn)值來(lái)初始化 state。

 

  1. class Quizextends Component{ 
  2.   // Added this: 
  3.   constructor(props) { 
  4.     super(props); 
  5.  
  6.     // Assign state itself, and a default value for items 
  7.     this.state = { 
  8.       items: [] 
  9.     }; 
  10.   } 
  11.  
  12.   componentWillMount() { 
  13.     axios.get('/thedata').then(res=> { 
  14.       this.setState({items: res.data}); 
  15.     }); 
  16.   } 
  17.  
  18.   render() { 
  19.     return ( 
  20.       <ul> 
  21.         {this.state.items.map(item => 
  22.           <li key={item.id}>{item.name}</li> 
  23.         )} 
  24.       </ul> 
  25.     ); 
  26.   } 

在你的應(yīng)用程序中的具體代碼可能是不同的,但我們希望我們已經(jīng)給你足夠的線索,以解決或避免在你的應(yīng)用程序中出現(xiàn)的這個(gè)問(wèn)題。如果還沒(méi)有,請(qǐng)繼續(xù)閱讀,因?yàn)槲覀儗⒃谙旅娓采w更多相關(guān)錯(cuò)誤的示例。

2. TypeError: ‘undefined’ is not an object

這是在 Safari 中讀取屬性或調(diào)用未定義對(duì)象上的方法時(shí)發(fā)生的錯(cuò)誤。您可以在 Safari Developer Console 中輕松測(cè)試。這與 1 中提到的 Chrome 的錯(cuò)誤基本相同,但 Safari 使用了不同的錯(cuò)誤消息提示語(yǔ)。

10種最常見(jiàn)的Javascript錯(cuò)誤——總結(jié)于1000+個(gè)項(xiàng)目,并闡述如何避免

3. TypeError: null is not an object

這是在 Safari 中讀取屬性或調(diào)用空對(duì)象上的方法時(shí)發(fā)生的錯(cuò)誤。 您可以在 Safari Developer Console 中輕松測(cè)試。

10種最常見(jiàn)的Javascript錯(cuò)誤——總結(jié)于1000+個(gè)項(xiàng)目,并闡述如何避免

有趣的是,在 JavaScript 中,null 和 undefined 是不一樣的,這就是為什么我們看到兩個(gè)不同的錯(cuò)誤信息。undefined 通常是一個(gè)尚未分配的變量,而 null 表示該值為空。 要驗(yàn)證它們不相等,請(qǐng)嘗試使用嚴(yán)格的相等運(yùn)算符 ===:

10種最常見(jiàn)的Javascript錯(cuò)誤——總結(jié)于1000+個(gè)項(xiàng)目,并闡述如何避免

在現(xiàn)實(shí)世界的例子中,這種錯(cuò)誤可能發(fā)生的一種場(chǎng)景是:如果在加載元素之前嘗試在 JavaScript 中使用元素。 因?yàn)?DOM API 對(duì)于空白的對(duì)象引用返回值為 null。

任何執(zhí)行和處理 DOM 元素的 JS 代碼都應(yīng)該在創(chuàng)建 DOM 元素之后執(zhí)行。 JS 代碼按照 HTML 中的規(guī)定從上到下進(jìn)行解釋。 所以,如果 DOM 元素之前有一個(gè)標(biāo)簽,腳本標(biāo)簽內(nèi)的 JS 代碼將在瀏覽器解析 HTML 頁(yè)面時(shí)執(zhí)行。 如果在加載腳本之前尚未創(chuàng)建 DOM 元素,則會(huì)出現(xiàn)此錯(cuò)誤。

在這個(gè)例子中,我們可以通過(guò)添加一個(gè)事件監(jiān)聽(tīng)器來(lái)解決這個(gè)問(wèn)題,這個(gè)監(jiān)聽(tīng)器會(huì)在頁(yè)面準(zhǔn)備好的時(shí)候通知我們。 一旦 addEventListener被觸發(fā),init() 方法就可以使用 DOM 元素。

  1. <script> 
  2.   function init(){ 
  3.     var myButton = document.getElementById("myButton"); 
  4.     var myTextfield = document.getElementById("myTextfield"); 
  5.     myButton.onclick = function(){ 
  6.       var userName = myTextfield.value; 
  7.     } 
  8.   } 
  9.   document.addEventListener('readystatechange'function(){ 
  10.     if (document.readyState === "complete") { 
  11.       init(); 
  12.     } 
  13.   }); 
  14. </script> 
  15.  
  16. <form> 
  17.   <inputtype="text"id="myTextfield"placeholder="Type your name"/> 
  18.   <inputtype="button"id="myButton"value="Go"/> 
  19. </form> 

4. (unknown): Script error

當(dāng)未捕獲的 JavaScript 錯(cuò)誤(通過(guò)window.onerror處理程序引發(fā)的錯(cuò)誤,而不是捕獲在try-catch中)被瀏覽器的跨域策略限制時(shí),會(huì)產(chǎn)生這類的腳本錯(cuò)誤。 例如,如果您將您的 JavaScript 代碼托管在 CDN 上,則任何未被捕獲的錯(cuò)誤將被報(bào)告為“腳本錯(cuò)誤” 而不是包含有用的堆棧信息。這是一種瀏覽器安全措施,旨在防止跨域傳遞數(shù)據(jù),否則將不允許進(jìn)行通信。

要獲得真正的錯(cuò)誤消息,請(qǐng)執(zhí)行以下操作:

1. 發(fā)送 ‘Access-Control-Allow-Origin’ 頭部

將 Access-Control-Allow-Origin 標(biāo)頭設(shè)置為 * 表示可以從任何域正確訪問(wèn)資源。 如有必要,您可以將域替換為您的域:例如,Access-Control-Allow-Origin:www.example.com。 但是,處理多個(gè)域會(huì)變得棘手,如果你使用 CDN,可能由此產(chǎn)生更多的緩存問(wèn)題會(huì)讓你感覺(jué)到這種努力并不值得。 在這里看到更多。

這里有一些關(guān)于如何在各種環(huán)境中設(shè)置這個(gè)頭文件的例子:

Apache

在 JavaScript 文件所在的文件夾中,使用以下內(nèi)容創(chuàng)建一個(gè) .htaccess 文件:

 

  1. Header add Access-Control-Allow-Origin "*" 

Nginx

將 add_header 指令添加到提供 JavaScript 文件的位置塊中:

 

  1. location ~ ^/assets/ { 
  2.     add_header Access-Control-Allow-Origin *; 

HAProxy

將以下內(nèi)容添加到您為 JavaScript 文件提供資源服務(wù)的后端:

 

  1. rspadd Access-Control-Allow-Origin:\ * 

2. 在<script>中設(shè)置crossorigin="anonymous"

在您的 HTML 代碼中,對(duì)于您設(shè)置了 Access-Control-Allow-Origin header 的每個(gè)腳本,在 script 標(biāo)簽上設(shè)置 crossorigin =“anonymous” 。在腳本標(biāo)記中添加 crossorigin 屬性之前,請(qǐng)確保驗(yàn)證上述 header 正確發(fā)送。 在 Firefox 中,如果存在 crossorigin 屬性,但 Access-Control-Allow-Origin 頭不存在,則腳本將不會(huì)執(zhí)行。

5. TypeError: Object doesn’t support property

這是您在調(diào)用未定義的方法時(shí)發(fā)生在 IE 中的錯(cuò)誤。 您可以在 IE 開(kāi)發(fā)者控制臺(tái)中進(jìn)行測(cè)試。

10種最常見(jiàn)的Javascript錯(cuò)誤——總結(jié)于1000+個(gè)項(xiàng)目,并闡述如何避免

這相當(dāng)于 Chrome 中的 “TypeError:”undefined“ is not a function” 錯(cuò)誤。 是的,對(duì)于相同的邏輯錯(cuò)誤,不同的瀏覽器可能具有不同的錯(cuò)誤消息。

對(duì)于使用 JavaScript 命名空間的 Web 應(yīng)用程序,這是一個(gè) IE l瀏覽器的常見(jiàn)的問(wèn)題。 在這種情況下,99.9% 的原因是 IE 無(wú)法將當(dāng)前名稱空間內(nèi)的方法綁定到 this 關(guān)鍵字。 例如:如果你 JS 中有一個(gè)命名空間 Rollbar 以及方法 isAwesome 。 通常,如果您在 Rollbar 命名空間內(nèi),則可以使用以下語(yǔ)法調(diào)用 isAwesome 方法:

  1. this.isAwesome(); 

Chrome,F(xiàn)irefox 和 Opera 會(huì)欣然接受這個(gè)語(yǔ)法。 另一方面 IE,不會(huì)。 因此,使用 JS 命名空間時(shí)最安全的選擇是始終以實(shí)際名稱空間作為前綴。

  1. Rollbar.isAwesome(); 

6. TypeError: ‘undefined’ is not a function

當(dāng)您調(diào)用未定義的函數(shù)時(shí),這是 Chrome 中產(chǎn)生的錯(cuò)誤。 您可以在 Chrome 開(kāi)發(fā)人員控制臺(tái)和 Mozilla Firefox 開(kāi)發(fā)人員控制臺(tái)中進(jìn)行測(cè)試。

10種最常見(jiàn)的Javascript錯(cuò)誤——總結(jié)于1000+個(gè)項(xiàng)目,并闡述如何避免

隨著 JavaScript 編碼技術(shù)和設(shè)計(jì)模式在過(guò)去幾年中變得越來(lái)越復(fù)雜,回調(diào)和關(guān)閉中的自引用范圍也相應(yīng)增加,這是這種/那種混淆的相當(dāng)常見(jiàn)的來(lái)源。

考慮這個(gè)代碼片段:

 

  1. function testFunction(){ 
  2.   this.clearLocalStorage(); 
  3.   this.timer = setTimeout(function(){ 
  4.     this.clearBoard();    // what is "this"
  5.   }, 0); 
  6. }; 

執(zhí)行上面的代碼會(huì)導(dǎo)致以下錯(cuò)誤:“Uncaught TypeError:undefined is not a function”。 你得到上述錯(cuò)誤的原因是,當(dāng)你調(diào)用 setTimeout() 時(shí),實(shí)際上是調(diào)用 window.setTimeout() 。 因此,在窗口對(duì)象的上下文中定義了一個(gè)傳遞給 setTimeout() 的匿名函數(shù),該函數(shù)沒(méi)有 clearBoard() 方法。

一個(gè)傳統(tǒng)的,舊瀏覽器兼容的解決方案是簡(jiǎn)單地將您的 this 保存在一個(gè)變量,然后可以由閉包繼承。 例如:

 

  1. function testFunction(){ 
  2.   this.clearLocalStorage(); 
  3.   var self = this;   // save reference to 'this', while it's still this! 
  4.   this.timer = setTimeout(function(){ 
  5.     self.clearBoard();   
  6.   }, 0); 
  7. }; 

或者,在較新的瀏覽器中,可以使用 bind() 方法傳遞適當(dāng)?shù)囊茫?/p>

 

  1. function testFunction(){ 
  2.   this.clearLocalStorage(); 
  3.   this.timer = setTimeout(this.reset.bind(this), 0);  // bind to 'this' 
  4. }; 
  5.  
  6. function testFunction(){ 
  7.     this.clearBoard();    //back in the context of the right 'this'
  8. }; 

7. Uncaught RangeError: Maximum call stack

這是 Chrome 在一些情況下會(huì)發(fā)生的錯(cuò)誤。 一個(gè)是當(dāng)你調(diào)用一個(gè)不終止的遞歸函數(shù)。您可以在 Chrome 開(kāi)發(fā)者控制臺(tái)中進(jìn)行測(cè)試。

10種最常見(jiàn)的Javascript錯(cuò)誤——總結(jié)于1000+個(gè)項(xiàng)目,并闡述如何避免

此外,如果您將值傳遞給超出范圍的函數(shù),也可能會(huì)發(fā)生這種情況。 許多函數(shù)只接受其輸入值的特定范圍的數(shù)字。 例如: Number.toExponential(digits) 和 Number.toFixed(digits) 接受 0 到 20 的數(shù)字, Number.toPrecision(digits) 接受 1 到 21 的數(shù)字。

 

  1. var a = new Array(4294967295);  //OK 
  2. var b = new Array(-1); //range error 
  3.  
  4. var num = 2.555555; 
  5. document.writeln(num.toExponential(4));  //OK 
  6. document.writeln(num.toExponential(-2)); //range error! 
  7.  
  8. num = 2.9999; 
  9. document.writeln(num.toFixed(2));   //OK 
  10. document.writeln(num.toFixed(25));  //range error! 
  11.  
  12. num = 2.3456; 
  13. document.writeln(num.toPrecision(1));   //OK 
  14. document.writeln(num.toPrecision(22));  //range error! 

8. TypeError: Cannot read property ‘length’

這是 Chrome 中發(fā)生的錯(cuò)誤,因?yàn)樽x取未定義變量的長(zhǎng)度屬性。 您可以在 Chrome 開(kāi)發(fā)者控制臺(tái)中進(jìn)行測(cè)試。

10種最常見(jiàn)的Javascript錯(cuò)誤——總結(jié)于1000+個(gè)項(xiàng)目,并闡述如何避免

您通常會(huì)在數(shù)組中找到定義的長(zhǎng)度,但是如果數(shù)組未初始化或者變量名稱在另一個(gè)上下文中隱藏,則可能會(huì)遇到此錯(cuò)誤。讓我們用下面的例子來(lái)理解這個(gè)錯(cuò)誤。

 

  1. var testArray = ["Test"]; 
  2.  
  3. function testFunction(testArray){ 
  4.     for (var i = 0; i < testArray.length; i++) { 
  5.       console.log(testArray[i]); 
  6.     } 
  7.  
  8. testFunction(); 

當(dāng)你用參數(shù)聲明一個(gè)函數(shù)時(shí),這些參數(shù)變成了函數(shù)作用域內(nèi)的本地參數(shù)。這意味著即使你函數(shù)外有名為 testArray 的變量,在一個(gè)函數(shù)中具有相同名字的參數(shù)也會(huì)被視為本地參數(shù)。

您有兩種方法可以解決您的問(wèn)題:

1. 刪除函數(shù)聲明語(yǔ)句中的參數(shù)(事實(shí)上你想訪問(wèn)那些聲明在函數(shù)之外的變量,所以你不需要函數(shù)的參數(shù)):

 

  1. var testArray = ["Test"]; 
  2.  
  3. /* Precondition: defined testArray outside of a function */ 
  4. function testFunction(/* No params */){ 
  5.     for (var i = 0; i < testArray.length; i++) { 
  6.       console.log(testArray[i]); 
  7.     } 
  8.  
  9. testFunction(); 

2. 用聲明的數(shù)組調(diào)用該函數(shù):

 

  1. var testArray = ["Test"];  
  2. function testFunction(testArray){ 
  3.    for (var i = 0; i < testArray.length; i++) { 
  4.       console.log(testArray[i]); 
  5.     } 
  6.  
  7. testFunction(testArray); 

9. Uncaught TypeError: Cannot set property

當(dāng)我們嘗試訪問(wèn)一個(gè)未定義的變量時(shí),它總是返回 undefined ,我們不能獲取或設(shè)置任何未定義的屬性。 在這種情況下,應(yīng)用程序?qū)伋?“Uncaught TypeError: Cannot set property”。

例如,在 Chrome 瀏覽器中:

10種最常見(jiàn)的Javascript錯(cuò)誤——總結(jié)于1000+個(gè)項(xiàng)目,并闡述如何避免

如果測(cè)試對(duì)象不存在,錯(cuò)誤將會(huì)拋出 “Uncaught TypeErrorUncaught TypeError: Cannot set property”。

10. ReferenceError: event is not defined

當(dāng)您嘗試訪問(wèn)未定義的變量或超出當(dāng)前范圍的變量時(shí),會(huì)引發(fā)此錯(cuò)誤。 您可以在 Chrome 瀏覽器中輕松測(cè)試。

10種最常見(jiàn)的Javascript錯(cuò)誤——總結(jié)于1000+個(gè)項(xiàng)目,并闡述如何避免

如果在使用事件處理系統(tǒng)時(shí)遇到此錯(cuò)誤,請(qǐng)確保使用傳入的事件對(duì)象作為參數(shù)。像 IE 這樣的舊瀏覽器提供了一個(gè)全局變量事件,但并不是所有瀏覽器都支持。像 jQuery 這樣的庫(kù)試圖規(guī)范化這種行為。盡管如此,***使用傳入事件處理函數(shù)的函數(shù)。

 

  1. function myFunction(event){ 
  2.     event = event.which || event.keyCode; 
  3.     if(event.keyCode===13){ 
  4.        alert(event.keyCode); 
  5.     } 

結(jié)論

我們希望你學(xué)到了新的東西,可以避免將來(lái)的錯(cuò)誤,或者本指南幫助你解決了頭痛的問(wèn)題。

盡管如此,即使有***實(shí)踐,生產(chǎn)中也會(huì)出現(xiàn)意想不到的錯(cuò)誤。能夠查看影響用戶的錯(cuò)誤,并擁有快速解決問(wèn)題的好工具,這一點(diǎn)非常重要。推薦 Rollbar 。

責(zé)任編輯:未麗燕 來(lái)源: Elevenbeans' blog
相關(guān)推薦

2020-08-07 11:46:47

JavaScript開(kāi)發(fā)代碼

2020-05-29 14:30:35

Kubernetes開(kāi)發(fā)錯(cuò)誤

2019-06-21 10:13:26

JavaScript錯(cuò)誤開(kāi)發(fā)

2018-03-12 13:25:51

2020-05-21 18:38:49

JavaScript前端技術(shù)

2018-02-10 08:40:01

JavaScriptASP.NETLLVM

2020-04-29 14:37:24

JavaScript前端技術(shù)

2019-08-13 11:32:55

物聯(lián)網(wǎng)技術(shù)大數(shù)據(jù)

2023-02-08 10:39:08

2015-07-29 10:46:20

Java錯(cuò)誤

2016-12-05 09:20:37

機(jī)器學(xué)習(xí)算法

2009-06-22 15:01:00

java項(xiàng)目常見(jiàn)錯(cuò)誤

2020-07-30 08:27:33

Javascript閉包變量

2022-10-10 09:00:35

ReactJSX組件

2015-09-21 09:27:25

數(shù)據(jù)可視化錯(cuò)誤

2016-02-26 10:20:17

HadoopSpark大數(shù)據(jù)項(xiàng)目

2020-08-03 10:13:29

CIO項(xiàng)目管理技術(shù)

2020-03-02 08:35:05

物聯(lián)網(wǎng)實(shí)施物聯(lián)網(wǎng)IOT

2013-08-15 09:47:07

云遷移云技術(shù)

2014-08-25 10:24:01

Linux
點(diǎn)贊
收藏

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

主站蜘蛛池模板: www.xxxx欧美 | 日韩中文字幕免费在线 | 成人片免费看 | 久久久久久看片 | 97久久国产| 欧美久久久久 | 五月激情婷婷网 | 国产精品毛片一区二区三区 | 四虎永久 | 国产精品视频一区二区三区, | 五月天综合影院 | 一区二区三区精品视频 | 亚洲精品在线观 | 一本一道久久a久久精品蜜桃 | 草草视频在线观看 | 欧美影院| 欧美日韩在线一区二区三区 | 欧美性久久久 | 国产精品免费一区二区 | 日本五月婷婷 | 一本大道久久a久久精二百 国产成人免费在线 | 天天插天天操 | 国产成人精品一区二区三区 | 日韩三极 | 中文字幕视频在线 | 国产日韩亚洲欧美 | 欧美成人影院在线 | 97精品超碰一区二区三区 | 国产精品久久精品 | 中文字幕11页 | 久久综合狠狠综合久久 | 色精品 | 天堂一区二区三区四区 | 国产精品一区二区久久久久 | 一本大道久久a久久精二百 欧洲一区二区三区 | 国产精品久久久久久久久久 | 日韩高清中文字幕 | 91免费在线看 | 国产精品久久久久一区二区三区 | 国产精品成人av | 九九久久精品视频 |