校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > 各種AJAX方法的使用比較詳解

各種AJAX方法的使用比較詳解

熱門標簽:百靈鳥 襄陽外呼系統接口 徐州電銷卡外呼系統供應商 上海浦東百度地圖標注中心注冊 科智聯智能電銷機器人 青海醫療智能外呼系統怎么樣 老虎郵局地圖標注點 外呼系統獲取客戶手機號 目標三維地圖標注

閱讀目錄

開始

第一代技術:生成客戶端代理腳本調用服務端

新技術的改進方向

第二代技術:jQuery直接調用WebService

第三代技術:更簡單的數據格式

第四代技術:直接提交表單

多submit按鈕的提交(用jQuery.form實現)

批量輸入控件的提交(用jQuery.form實現)

提交復雜表單(用jQuery.form實現)

各種AJAX開發方法的對比與總結

相關鏈接

本文收集了在ASP.NET平臺上,一些具體代表性的AJAX開發方法,我將用實際的示例代碼來演示如何使用它們,讓您感受AJAX的進化歷程,同時也希望將一些優秀的AJAX開發方法介紹給您。

為了方便地介紹這些AJAX開發方法,我將它們劃分為四代技術。

注意:按代劃分AJAX技術純屬我個人的觀點,只為了更好了區分它們。

此外,一些不借助任何框架類庫的原始AJAX開發方法,本文將不討論它們。

第一代技術:生成客戶端代理腳本調用服務端

這類技術展示了第一代的AJAX框架的主要設計思想:在服務端為客戶端生成代理腳本, 然后由這些代理腳本調用服務端,調用者可以不必知道整個調用過程是如何實現的, 而且在客戶端的調用風格也基本與服務端的代碼類似。

這類技術的代表作有:ASP.NET AJAX, AjaxPro 二個服務端框架。

下面我將用ASP.NET AJAX框架來演示如何進行AJAX開發。

首先,我們可以創建一個WebService服務:

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
//若要允許使用 ASP.NET AJAX 從腳本中調用此 Web 服務,請取消對下行的注釋。 
[System.Web.Script.Services.ScriptService]
public class WebService1 : System.Web.Services.WebService {

  [WebMethod]
  public int Add(int a, int b)
  {
    return a + b;
  }

這段代碼就是一個普通的WebService代碼,唯獨需要注意的是:在類的定義上加了一個ScriptService修飾特性。

接下來,我們還需要在一個ASPX頁面中,用ScriptManager為它生成客戶端的代理腳本:

asp:ScriptManager ID="ScriptManager1" runat="server">
  Services>
    asp:ServiceReference Path="/WebService1.asmx" InlineScript="true" />
  /Services>
/asp:ScriptManager>

說明:InlineScript="true"的設置并不是必須的,只是為了讓我們看到ScriptManager到底生成了什么代碼。

從截圖可以看到,除了引入了二個必要的AJAX客戶端類庫外,還在客戶端為WebService1生成了代理腳本。

有了這些代碼后,我們可以用下面的JavaScript代碼調用服務端:

function Call_Add(){
  WebService1.Add(1,2, ShowResult);
}
function ShowResult(result){
  document.getElementById("output").value = result;
}

前面這個示例太簡單了,再來個參數復雜的示例吧,還是從先服務端開始,先定義一個參數類型:

public class Customer
{
  public string Name { get; set; }
  public int Age { get; set; }
  public string Address { get; set; }
  public string Tel { get; set; }
  public string Email { get; set; }
}

WebSerice的代碼:

[WebMethod]
public string AddCustomer(Customer customer)
{
  if( customer == null )
    return "customer is null.";
  
  // 簡單地返回一個XML字符串。
  // 告訴客戶端:服務端收到了什么樣的數據。
  return XmlHelper.XmlSerialize(customer, Encoding.UTF8);
}

仍然借用前面的ScriptManager設置,來看JavaScript的調用代碼:

function Call_AddCustomer(){
  var customer = {Name: document.getElementById("txtName").value, 
          Age: document.getElementById("txtAge").value, 
          Address: document.getElementById("txtAddress").value, 
          Tel: document.getElementById("txtTel").value, 
          Email: document.getElementById("txtEmail").value};
  WebService1.AddCustomer(customer, ShowResult);
}

基本上還是與服務端的編碼方式差不多,先創建一個customer對象,再傳給調用方法。

在那個年代之前(2006年),原始的AJAX實現方式非常復雜,而這種方法讓客戶端代碼風格看起來與服務端十分類似,這確實是個了不起的設計思路。 然而各種技術一直在改進中,現在,2013年,當我們再來回顧這種方法時,會發現它確實存在一些不完善的地方, 以至于現在使用這種方法的人很少了,這種技術被淘汰了!

其實我們可以從另一外角度來思考:如果這種方法真的很優秀,它就不可能被淘汰,正是因為有更優秀的方法出現了,它才會遭到淘汰的命運。

新技術的改進方向

前面介紹的那種AJAX方法能讓客戶端的調用代碼與服務端的代碼風格基本一致,看似很完美的方法為什么會被淘汰了呢?

我來分析一下這種開發方法的缺陷:

1. 前端代碼不夠獨立,必須要在頁面中添加引用之后才能調用服務端,這其實是一種強耦合。

2. 出現了更優秀的前端框架能簡少獲取調用參數的代碼量。

繼續閱讀本文,您會發現后面我將要介紹的新方法都朝著解決這些缺陷在努力, 這些缺陷也算是指出了新技術的改進方向。

由于前端在調用服務端時,需要事先生成代理腳本,這種設計會阻礙前端代碼的封裝性。 您可以想象一下:如果客戶端需要一個【獲取當前用戶信息】的功能,而這個功能必須由服務端實現的, 此時,我們就只能指望服務端為客戶端生成代理類來調用這個功能了。 但這個功能太有用,許多地方都需要使用,您是不是會想將它提取到一個公用的文件中?

遺憾的是:就算您將這段調用代碼提取到一個公共的public.js文件中,每個頁面在引用public.js后, 并不能調用【獲取當前用戶信息】功能,因為代理腳本并不一定存在,public.js中的代碼還不能運行起來。 怎么辦?

答:為每個引用public.js的頁面,再添加ScriptManager引用那個服務吧。

共用性越高的功能,您會發現這種引用代碼的重復度也就越高。
簡單說來,這種方法將WebService, aspx頁面, js代碼耦合在一起了。
由于耦合,您越用越發現越麻煩。

這種生成代理腳本的開發方法雖然能讓前端代碼與后端代碼的風格一致,然而, 前端與后端畢竟不是同一種開發語言,它們要關注的方向也是不一樣的。尤其是當更優秀的前端框架出現后, 這種后端包辦前端的方法不僅讓后端與前端耦合在一起,而且還限制了前端技術的發展, 最終只能是被拋棄的命運!

現在請記住我們為了提交一個Customer信息寫了什么樣的代碼:

var customer = {Name: document.getElementById("txtName").value, 
        Age: document.getElementById("txtAge").value, 
        Address: document.getElementById("txtAddress").value, 
        Tel: document.getElementById("txtTel").value, 
        Email: document.getElementById("txtEmail").value};

我在介紹第四代技術時,您會發現它們消失了!

第二代技術:jQuery直接調用WebService

隨意jQuery前端類庫的流行,另一種新的開發方法也開始流行起來了。

HTTP調用本來是個很簡單很透明的技術,只要指定一個URL,構造一個請求體就可以了, 前端代理腳本的方法將這個過程封裝了起來,由于它的封裝制造了耦合并限制前端的發展。 新的AJAX技術只能突破這個限制,舍棄這些代理腳本,直接調用后端代碼。

下面的示例代碼還是基于前面的示例,唯獨不同的是:不是需要代理類,現在是直接調用服務端。

由于后端的服務代碼沒有改變,我也就不再貼出它們了,而且頁面也不需要再添加什么引用,我們就直接看前端代碼好了:

$.ajax({
  type:"POST", url: "/WebService1.asmx/Add", 
  contentType:"application/json",
  data:"{a: 1, b: 2}",
  dataType:'json',
  success:function(result){          
    $("#output").val(result.d);
  }
});

這段代碼也能調用服務端的Add方法。

由于服務端采用JSON數據格式,所以需要在客戶端多指定一些請求頭,而這些事情以前是由代理腳本完成的。 雖然現在的代碼稍微多一點,但是耦合沒有了,更便于提取一些公用代碼了。

事實上,如果您一直用這種方法調用WebService,那么jQuery提供了設置默認參數的功能, 我們可以利用這個特性減少代碼量。

還是再來看一下前面那個復雜的參數類型的前端調用代碼吧:

var customer = {Name: $("#txtName").val(), 
        Age: $("#txtAge").val(), 
        Address: $("#txtAddress").val(), 
        Tel: $("#txtTel").val(), 
        Email: $("#txtEmail").val()};
var jsonStirng = $.toJSON( {customer: customer} );
$.ajax({
  type:"POST", url: "/WebService1.asmx/AddCustomer", 
  contentType:"application/json",
  data: jsonStirng,
  dataType:'json',
  success:function(result){
    $("#output").val(result.d);
  }
});

主要的代碼還是一樣的,集中在獲取調用參數,但是要轉成JSON格式。

再次一次提醒:不要老是盯著要指定一大堆的jQuery參數,它們可以通過設置默認值的方式解決。
我之所以現在不想讓它們消失,是因為后面還有更好的方法,先留著它們吧。

說明:這種方法不僅可以用于調用WebService,也可以調用WCF (basicHttpBinding),畢竟它們都使用HTTP協議。 不過,WCF還有一堆煩人的配置要設置,但這不是jQuery的問題,這是服務端框架的缺陷。

第三代技術:更簡單的數據格式

前面我們看到了可以利用jQuery調用WebService,不過JSON的轉換過程感覺有些多余,瀏覽器的提交就沒有這個轉換步驟嘛。 有時看到一些家伙們著還在JavaScript中拼接JSON字符串,我非常反感,所以這次的示例代碼并沒有給那種方法抹黑,我采用了一個JSON插件。

第三代技術就完美地解決了輸入輸出必須采用JSON問題,而且解決了POST的限制。

由于這次變革改變了數據格式,所以服務端也發生了改變, 新的框架解決了這些問題,例如:ASP.NET MVC框架,MyMVC框架都支持這個開發方式。

來看一下現在服務端的代碼:

[Action]
public int Add(int a, int b)
{
  return a + b;
}
[Action]
public string AddCustomer(Customer customer)
{
  // 簡單地返回一個XML字符串。
  // 告訴客戶端:服務端收到了什么樣的數據。
  return XmlHelper.XmlSerialize(customer, Encoding.UTF8);
}

注意:這種AJAX技術沒有與客戶端的任何耦合,只要知道一個URL就可以調用了。 來看客戶端的代碼吧:

$.ajax({
  type:"POST", url: "/AjaxDemo/Add.cspx", 
  data: {a: 1, b: 2},
  success:function(result){          
    $("#output").val(result);
  }
});
// 第二個調用
var customer = {Name: $("#txtName").val(), 
        Age: $("#txtAge").val(), 
        Address: $("#txtAddress").val(), 
        Tel: $("#txtTel").val(), 
        Email: $("#txtEmail").val()};
$.ajax({
  type:"POST", url: "/AjaxDemo/AddCustomer.cspx", 
  data: customer,
  success:function(result){
    $("#output").val(result);
  }
});

注意:type:"POST"并不是必須的,您也可以把它們改成GET方式提交。

如果您此時用Fiddler查看請求內容,會發現請求的數據采用的是key=valuekey=vlaue的格式,與瀏覽器的方式一致。 由于沒有JSON數據格式的限制,現在的參數項簡單了。

現在再看上面這段代碼,主要代碼量在哪里?

是不是在獲取調用參數那塊?

繼續閱讀本文,我要讓它消失。

第四代技術:直接提交表單

我們來看一下示例用的表單:

form id="form1" action="/AjaxDemo/AddCustomer.cspx" method="post">
  p>b>新增客戶資料/b>/p>
  span>Name: /span>input type="text" name="Name" value="abc" />br />
  span>Age: /span>input type="text" name="Age" value="20" />br />
  span>Address: /span>input type="text" name="Address" value="武漢" />br />
  span>Tel:/span> input type="text" name="Tel" value="12345678" />br />
  span>Email: /span>input type="text" name="Email" value="test@163.com" />br />
  br />
  input type="submit" name="btnAddCustomer" value="保存客戶資料" />
/form>

前面用了三種方法在提交這個表單,下面我們再來看一下更簡單的提交方式:

script type="text/javascript">
$(function(){
  // 只需要下面這個調用就可以將表單改成異步提交方式!
  $("#form1").ajaxForm({
    success:function(result){
      $("#output").val(result);
    }
  });
});
/script>

為了更清楚展示這種方法,我甚至把script標簽也貼出來了。

如果您用過jQuery就應該能發現,真正的代碼就只有ajaxForm的那個調用。

說明:ajaxForm是jQuery.form插件提供的功能。

服務端的代碼繼續使用前面示例的代碼,所以就不貼出了。

再對比前面幾種AJAX的實現方法,您說哪種方法最簡單?

您對第四代AJAX技術有興趣嗎?

我還為它設計了三種不同場景下的示例,讓您感受它的強大與簡單,請繼續閱讀。

多submit按鈕的提交(用jQuery.form實現)

您認為前面的示例太簡單了,是嗎?

可能有人會說,如果有多個submit按鈕,這種方法就不合適了,我要響應每個按鈕,為它們指定不同的URL !

真是這樣嗎? 看下面的示例吧。

相關的前端代碼如下:

form id="form1" action="/AjaxTestAutoAction/submit.cspx" method="post">
  p>span>Input:/span>
    input type="text" name="input" style="width: 300px" value="Fish Li" />/p>
  p>span>Output:/span>
    input type="text" id="output" style="width: 300px" readonly="readonly" />/p>
  input type="submit" name="Base64" value="轉換成Base64編碼" />nbsp;nbsp;
  input type="submit" name="Md5" value="計算md5" />nbsp;nbsp;
  input type="submit" name="Sha1" value="計算sha1" />
/form>

script type="text/javascript">
$(function(){  
  $("#form1").ajaxForm(function(result) {
    $("#output").val(result);
  });
});
/script>

服務端代碼:

public class AjaxTestAutoAction
{
  [Action]
  public string Base64(string input)
  {
    return Convert.ToBase64String(Encoding.Default.GetBytes(input));
  }

  [Action]
  public string Md5(string input)
  {
    byte[] bb = Encoding.Default.GetBytes(input);
    byte[] md5 = (new MD5CryptoServiceProvider()).ComputeHash(bb);
    return BitConverter.ToString(md5).Replace("-", string.Empty);
  }

  [Action]
  public string Sha1(string input)
  {
    byte[] bb = Encoding.Default.GetBytes(input);
    byte[] sha1 = (new SHA1CryptoServiceProvider()).ComputeHash(bb);
    return BitConverter.ToString(sha1).Replace("-", string.Empty);
  }
}

代碼仍然很清晰:

1. 服務端定義三個方法,對應三個submit按鈕。

2. 前端還是只調用一個ajaxForm解決所有問題。

這種方法就是由前端的 jQuery, jQuery.form 以及服務端的MyMVC框架 共同實現的。 想像一下利用其它三種方法需要多少代碼吧。

批量輸入控件的提交(用jQuery.form實現)
再來展示另一個現實的例子,批量輸入界面的提交。

頁面表單代碼如下:

JavaScript代碼:

script type="text/javascript">
$(function(){
  
  $("#form1").ajaxForm({
    success:function(result){
      $("#output").val(result);
    }
  });

});

服務端代碼如下:

這個示例的全部代碼就這么多,廢話不想多說,您自己去想用其它方法需要多少代碼!

提交復雜表單(用jQuery.form實現)
前面的示例都是直接提交表單,沒有驗證表單的過程,而且都以Textbox控件為主,再來個復雜的表單示例。

頁面表單代碼如下:

JavaScript代碼:

script type="text/javascript">
$(function(){
  
  $("#form1").ajaxForm({
    beforeSubmit: ValidateForm,
    success:function(result){
      $("#output").val(result);
    }
  });

  function ValidateForm(formData, jqForm, options) { 
    if( jqForm.context.ProductName.value.length == 0 ){
      alert("商品名稱不能為空。");
      $(jqForm.context.ProductName).focus();
      return false;
    }
    return true;
  }
});

/script>

服務端代碼:

[Action]
public string AddProduct(Product product)
{
  // 簡單地返回一個XML字符串。
  // 告訴客戶端:服務端收到了什么樣的數據。
  return XmlHelper.XmlSerialize(product, Encoding.UTF8);
}

各種AJAX開發方法的對比與總結

看過了這些示例后,我們再來回顧這些AJAX方法的進化過程:

1. 以ASP.NET AJAX為代表的【生成客戶端代理腳本調用服務端】技術, 為了包裝原始AJAX的復雜過程,服務端為客戶端生成了代理腳本, 這種封裝后的客戶端在調用方式上與服務端基本一致,看起來簡化了不少,而且降低了開發門檻, 然而,它的優點也是它是它的最大缺點:服務端包辦了客戶端的事情,它完全沒有想到客戶端技術也在進步! 當更優秀的前端技術出現時,它的結局只能是淘汰。

2. 【jQuery直接調用WebService】可以看做是第一代技術的改進,它丟棄了服務端生成代理腳本的功能, 直接在客戶端準備服務端所需要的數據格式,借助jQuery內部對XmlHttpRequest的封裝,也能方便地調用服務端。 這種方法解決了客戶端、服務、頁面三方的耦合,但是數據格式卻受到序列化方式的限制,使得起來怪怪的。 這種怪怪的感覺其實也是不方便的表現。

3. 為了讓前端更方便地調用服務端,服務端框架只能改變,ASP.NET MVC框架和MyMVC框架都支持更簡單的數據格式, 而且不需要那個多余的asmx文件,直接用類庫就可以響應客戶端請求。 這類技術的最主要特點是:用更簡單的數據格式就可以調用服務端。 由于數據格式簡單化,為以后的繼續改進留下了機會。

4. 由于服務端不要求序列化的數據格式,且前端技術仍在進步,終于jQuery.form插件可以讓我們不需要關注表單數據的收集過程, 它能模擬瀏覽器的提交行為,正確識別【成功控件】并將它們提交到服務端,因此代碼得到最大限度的縮減,讓AJAX開發過程更加容易。

前面幾個采用jQuery.form的示例也讓我們看到:不管表單是什么樣的,永遠只需要一個調用。

而且它將jQuery的調用過程也做了非常好的封裝,所以我認為這是最容易使用的AJAX開發方法。

您可能感興趣的文章:
  • AjaxControlToolKit DropDownExtender(下拉擴展控件)使用方法
  • AjaxControlToolKit CalendarExtender(日歷擴展控件)的使用方法
  • Jquery AJAX 框架的使用方法
  • jquery ajax abort()的使用方法
  • asp.net下ajax.ajaxMethod使用方法
  • 微軟ajax庫的使用方法(ajax.ajaxMethod)

標簽:咸寧 辛集 揭陽 紅河 股票 商洛 佛山 荊州

巨人網絡通訊聲明:本文標題《各種AJAX方法的使用比較詳解》,本文關鍵詞  各種,AJAX,方法,的,使用,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《各種AJAX方法的使用比較詳解》相關的同類信息!
  • 本頁收集關于各種AJAX方法的使用比較詳解的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    日韩国产精品久久久| 日本欧美久久久久免费播放网| 欧美日韩在线精品一区二区三区激情| 国产美女在线观看一区| 国产精品资源在线看| 韩日精品视频一区| 国产精品一区二区在线看| 国产精品一区二区在线看| 国产高清不卡二三区| 成人av网站在线| 99久久久无码国产精品| 色婷婷综合久久久中文一区二区 | 欧美日韩国产高清一区二区 | 亚洲成a人片综合在线| 欧美日韩你懂得| 风间由美中文字幕在线看视频国产欧美| 久久国产精品区| 国产高清视频一区| 91欧美激情一区二区三区成人| 欧美视频一区二区在线观看| 69p69国产精品| 久久婷婷综合激情| 国产精品久久一级| 日韩有码一区二区三区| 国产一区999| 色猫猫国产区一区二在线视频| 欧美日韩情趣电影| 2023国产一二三区日本精品2022| 日本一区二区三区在线观看| 国产精品久久久一本精品| 国产精品久久久久久久久动漫 | 丁香天五香天堂综合| 激情综合网激情| 成人av网站大全| 欧日韩精品视频| 91精品国产色综合久久久蜜香臀| 精品日韩在线观看| 久久精品一区二区三区不卡| 国产精品免费看片| 亚洲黄色尤物视频| 蜜桃av一区二区| 国产成人亚洲综合a∨婷婷图片| 国产在线不卡视频| 99视频精品免费视频| 777xxx欧美| 欧洲精品在线观看| 日韩欧美一二三| 中文一区二区在线观看| 一区二区三区日本| 美女国产一区二区| 成人国产精品免费网站| 色香蕉成人二区免费| 日韩女优视频免费观看| 亚洲欧洲另类国产综合| 视频一区免费在线观看| 成人91在线观看| 51久久夜色精品国产麻豆| 国产丝袜欧美中文另类| 五月天丁香久久| 国产精品主播直播| 欧美丝袜丝nylons| 国产精品久久久久久久裸模| 亚洲第一搞黄网站| 成人av在线电影| 欧美α欧美αv大片| 亚洲猫色日本管| 国产精品77777| 7777精品伊人久久久大香线蕉的| 欧美国产精品一区二区三区| 视频精品一区二区| 色嗨嗨av一区二区三区| 国产农村妇女精品| 老司机精品视频在线| 播五月开心婷婷综合| 欧美高清激情brazzers| 日韩一区二区三区三四区视频在线观看 | 亚洲最大色网站| 国产69精品一区二区亚洲孕妇| 日韩一区二区麻豆国产| 亚洲一区二区三区四区五区中文| 精品亚洲国内自在自线福利| 在线看国产一区| 亚洲欧洲日韩在线| 成人免费福利片| 久久久久九九视频| 国产剧情一区二区| 2024国产精品视频| 国产综合久久久久久鬼色| 日韩一二三区视频| 蜜桃视频一区二区三区 | 日韩视频123| 亚洲成国产人片在线观看| 高清av一区二区| 亚洲欧美视频在线观看视频| 成人高清视频免费观看| 久久久高清一区二区三区| 精品一区二区三区免费视频| 欧美一区二区美女| 久久不见久久见免费视频7| 欧美一区午夜视频在线观看| 婷婷国产v国产偷v亚洲高清| 91精品国产综合久久精品性色| 国产精品美女视频| 成人夜色视频网站在线观看| 亚洲乱码日产精品bd| 色综合久久六月婷婷中文字幕| 中文字幕一区二区三区乱码在线| 99久久精品国产麻豆演员表| 亚洲欧美国产77777| 欧美性大战久久久久久久蜜臀| 性久久久久久久久久久久| 91精品国产综合久久香蕉麻豆| 美洲天堂一区二卡三卡四卡视频 | 国产精品久久777777| 成人免费va视频| 国产欧美中文在线| 成人精品免费看| 亚洲国产一区二区a毛片| 3d动漫精品啪啪| 高清国产一区二区| 亚洲福利视频导航| 久久久亚洲午夜电影| 成人黄色在线看| 婷婷丁香久久五月婷婷| 久久久亚洲精品石原莉奈| 91在线播放网址| 老司机免费视频一区二区三区| 中文字幕av一区二区三区| 91国内精品野花午夜精品| 蜜桃精品视频在线| 欧美极品美女视频| 欧美高清一级片在线| 丁香一区二区三区| 天天色综合成人网| 最新日韩av在线| 欧美成人高清电影在线| 色天使色偷偷av一区二区| 另类小说色综合网站| 一区二区在线电影| 国产精品嫩草影院com| 日韩写真欧美这视频| 日本精品一区二区三区高清 | 精品少妇一区二区三区在线播放| 欧美综合一区二区| 99久久综合色| 狠狠色狠狠色综合日日91app| 精品日产卡一卡二卡麻豆| 色哟哟国产精品| 福利一区二区在线观看| 亚洲综合色区另类av| 欧美性xxxxxx少妇| 色94色欧美sute亚洲线路一久| 国产永久精品大片wwwapp| 午夜视频在线观看一区二区三区| 国产精品免费人成网站| 久久久夜色精品亚洲| 精品理论电影在线| 91超碰这里只有精品国产| 色域天天综合网| 99久久精品情趣| 精彩视频一区二区三区| 日本不卡免费在线视频| 天天综合网天天综合色| 亚洲最新视频在线观看| 亚洲男人的天堂网| 中文字幕亚洲综合久久菠萝蜜| 欧美老年两性高潮| 欧美三级视频在线观看| 欧美视频在线不卡| 欧美中文字幕不卡| 精品视频一区二区三区免费| 国产福利一区二区| 韩国精品免费视频| 经典三级视频一区| 激情欧美日韩一区二区| 中文字幕巨乱亚洲| 中文字幕制服丝袜一区二区三区| 国产视频一区二区在线| 亚洲国产高清不卡| 国产精品无遮挡| 亚洲欧美一区二区三区国产精品 | 欧美性大战xxxxx久久久| 91福利在线观看| 欧美亚洲一区二区在线| 欧美日韩成人高清| 欧美一区二区三区不卡| 欧美一区二区精品在线| 正在播放亚洲一区| 国产亚洲一二三区| 亚洲人成精品久久久久久| 亚洲第一综合色| 青娱乐精品在线视频| 国产成人免费av在线| 色综合久久久久久久| 在线播放国产精品二区一二区四区| 91.com视频| 国产精品久久久久久久第一福利 | 在线免费不卡电影| 欧美一级国产精品| 国产欧美久久久精品影院 |