亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

JavaScript插件化開發教程 (四)

2019-11-20 13:18:49
字體:
來源:轉載
供稿:網友

一,開篇分析

Hi,還記得上一篇文章嗎。主要講述了一個“Tab”插件是如何組織代碼以及實現的”,以及過程化設計與面向對象思想設計相結合的方式是

如何設計一個插件的,兩種方式各有利弊取長補短,本系列文章是以學習為導向的,具體場景大家自己定奪使用方式。在從這篇文章中,我們還是以那個“Tab”實例為主,

繼續擴展相關功能。嘿嘿嘿,廢話少說,進入正題。直接上實際效果圖:

大家看到了吧,增加了一個新的功能,如果我們在初始化時,我們的模塊配置信息項目的條目數大于我們指定的,那么就會顯示在“更多模塊”

操作項的隱藏列表中,我們的初始化參數配置也從新做了調整比如多了一個“displayMax”指定初始化時的條目數,還有一個項目屬性,“status”

在初始化時也去掉了不需要配置了,在程序中動態生成配置,增加了程序的靈活性,下面就具體分析一下吧。

(二),實例分析

(1),首先確定這個插件做什么事。下面看一下插件的調用方式,以及配置參數說明。如下代碼:

復制代碼 代碼如下:

{
    buttonText : "添加模塊" ,
    result : [
        {
            text : "向導提示" ,
            url : "help.html" ,
            showClose : "0"
        } ,
        {
            text : "學生信息" ,
            url : "info.html" ,
            showClose : "1"
        } ,
        {
            text : "學生分類" ,
            url : "category.html" ,
            showClose : "1"
        } ,
        {
            text : "大熊君{{bb}}" ,
            url : "bb.html" ,
            showClose : "1"
        } ,
        {
            text : "Beta測試模塊" ,
            url : "test.html" ,
            showClose : "1"
        } ,
        {
            text : "三胖子" ,
            url : "help.html" ,
            showClose : "1"
        } ,
        {
            text : "四禿子" ,
            url : "help.html" ,
            showClose : "1"
        }
    ] ,
    displayMax : 5 // 最多顯示項目
}   
 

“bigbear.ui.createTab”里面包含兩個參數,第一個是dom節點對象,第二個是插件參數選項,"buttonText "代表“Tab“插件中,操作按鈕的文字描述。

”result“是一個數組,里面包含的是選項卡項目的屬性,包括文字描述,點擊選項卡項目時做請求使用的url,”showClose“代表選項卡的選項是否顯示關閉按鈕。

“status”在初始化時也去掉了不需要配置了,在程序中動態生成配置??赡軙嘘P閉狀態,分別表示為:1-默認顯示,0-關閉狀態,2-超過默認的條目數。

(2),功能分步驟介紹

1---,通過可選參數,初始化插件:

復制代碼 代碼如下:

$(function(){
    bigbear.ui.createTab($("#tab"),{
        buttonText : "添加模塊" ,
        result : [
            {
                text : "向導提示" ,
                url : "help.html" ,
                showClose : "0"
            } ,
            {
                text : "學生信息" ,
                url : "info.html" ,
                showClose : "1"
            } ,
            {
                text : "學生分類" ,
                url : "category.html" ,
                showClose : "1"
            } ,
            {
                text : "大熊君{{bb}}" ,
                url : "bb.html" ,
                showClose : "1"
            } ,
            {
                text : "Beta測試模塊" ,
                url : "test.html" ,
                showClose : "1"
            } ,
            {
                text : "三胖子" ,
                url : "help.html" ,
                showClose : "1"
            } ,
            {
                text : "四禿子" ,
                url : "help.html" ,
                showClose : "1"
            }
        ] ,
        displayMax : 5 // 最多顯示項目
    }) ;
}) ;           

2---,渲染并且完成時間綁定以及相關的業務邏輯,比如初始化時條目數量驗證。

復制代碼 代碼如下:

tabProto.init = function(){
    if(this._isEmptyResult()){
        this._setContent("暫無任何模塊!") ;
    }
    var that = this ;
    this.getElem().find(".title .adder")
    .text("+" + this.getOpts()["buttonText"])
    .on("click",function(){
        that.getElem().find(".console-panel").slideToggle(function(){
            that._renderConsolePanel("0") ;
        }) ;
    }) ;
    $.each(this.getOpts()["result"],function(i,item){
        if(that._isDisplayMax(i + 1)){
            that._saveOrUpdateStatus(item,"1") ;
        }
        else{
            that._saveOrUpdateStatus(item,"2") ;
        }
        that._render(item) ;
    }) ;
    if(!that._isDisplayMax(this.getOpts()["result"].length)){
        this.getElem().find(".title .more-mod").fadeIn(function(){
            $(this).find(".tag").on("click",function(){
                var root = $(this).next() ;
                root.empty() ;
                $.each(that._getItemListByStatus("2"),function(i,data){
                    $("<div></div>").text(data["text"])
                    .on("click",function(){
                        if(that._getItemListByStatus("1").length < that.getOpts()["displayMax"]){
                            that.getElem().find(".title .items div").eq(data["index"]).fadeIn(function(){
                                that._saveOrUpdateStatus(data,"1") ;
                            }) ;
                        }
                        else{
                            alert("不能添加任何模塊,目前已經是最大數量!") ;
                        }
                    })
                    .appendTo(root) ;
                }) ;
                root.toggle() ;
            }) ;
           
        });
    }
    this.getElem().find(".title .items div")
    .eq(0)
    .trigger("click") ; // 假定是必須有一項,否則插件意義就不大了!
} ;

3---,選項卡切換以及數據內容渲染操作。

復制代碼 代碼如下:

 tabProto._setCurrent = function(index){
     var items = this.getElem().find(".title .items div").removeClass("active") ;
     items.eq(index).addClass("active") ;
     var contents = this.getElem().find(".content .c").hide() ;
     contents.eq(index).show() ;
 } ;   

復制代碼 代碼如下:

 item.on("click",function(){
     that._setCurrent($(this).index()) ;
     that._getContent(data["url"]).done(function(result){
         that._setContent(result) ;
     })
     .fail(function(){
         throw new Error("Net Error !") ;
     });
 })

 
復制代碼 代碼如下:

 tabProto._setContent = function(html){
     this.getElem().find(".content").html(html) ;
 } ;
 tabProto._getContent = function(url){
     return $.ajax({
         url : url
     }) ;
 } ;

4---,核心的輔助數據操作方法,不涉及dom。

復制代碼 代碼如下:

 /* update time 2015 1/26 15:36 */
 tabProto._isDisplayMax = function(size){
     var displayMax = this.getOpts()["displayMax"] || 5 ;
     return (size <= displayMax) ? true : false ;
 } ;
 tabProto._isEmptyResult = function(){
     if(!this.getOpts()["result"].length){
         return false ;
     }
     return true ;
 } ;
 tabProto._saveOrUpdateStatus = function(item,status){
     item["status"] = status ;
 } ;
 tabProto._getItemListByStatus = function(status){
     var list = [] ;
     var result = this.getOpts()["result"] ;
     $.each(result,function(i,item){
         if(status == item["status"]){
             list.push(item) ;
         }
     }) ;
     return list ;
 } ;
 tabProto._getStatusByIndex = function(index){
     var status = null ;
     var result = this.getOpts()["result"] ;
     $.each(result,function(i,item){
         if(index == item["index"]){
             status = item["status"] ;
         }
     }) ;
     return status ;
 } ;

(三),完整代碼以供學習,本代碼已經過測試,包括目錄結構以及相關的文件。

 1,html

復制代碼 代碼如下:

 <body>
     <div class="dxj-ui-hd">
         大熊君{{bb}} - DXJ UI ------ Tab
     </div>
     <div class="dxj-ui-bd">
         <div id="tab">
             <div class="title">
                 <div class="adder">
                     + 添加學生信息
                 </div>
                 <div class="items">
                     <!--<div><span class="del">X</span>歡迎頁</div>
                     <div><span class="del">X</span>用戶管理</div>
                     <div><span class="del">X</span>Bigbear</div>-->
                 </div>
                 <div class="more-mod">
                     <div class="tag">更多模塊</div>
                     <div class="mods">
                        
                     </div>
                 </div>
             </div>
             <div class="console-panel">
             </div>
             <div class="content">
                 <!--<div class="c">
                
                     <div class="input-content"><span>姓名:</span><input type="text" /></div>
                     <div class="input-content"><span>備注:</span><textarea></textarea></div>
                
                 </div>    <div class="input-content"><input type="button" value="保存" /></div>
                 -->
             </div>
         </div>
     </div>
 </body>

2,css

復制代碼 代碼如下:

 .dxj-ui-hd {
     padding:0px ;
     margin : 0 auto;
     margin-top:30px;
     width:780px;
     height:60px;
     line-height: 60px;
     background: #3385ff;
     color:#fff;
     font-family: "微軟雅黑" ;
     font-size: 28px;
     text-align: center;
     font-weight:bold;
 }
 .dxj-ui-bd {
     padding:0px ;
     margin : 0 auto;
     width:778px;
     padding-top : 30px ;
     padding-bottom : 30px ;
     overflow: hidden;
     border:1px solid #3385ff;
 }
 .dxj-ui-bd #tab {
     padding:0px ;
     margin : 0 auto;
     width:720px;
     overflow: hidden;
     position:relative;
 }
 .dxj-ui-bd #tab .title {
     width:720px;
     overflow: hidden;
     border-bottom:2px solid #3385ff;
 }
 .dxj-ui-bd #tab .title .adder {
     width:160px;
     height:32px;
     line-height: 32px;
     background: #DC143C;
     color:#fff;
     font-family: "微軟雅黑" ;
     font-size: 14px;
     text-align: center;
     font-weight:bold;
     float : left;
     cursor:pointer;
 }
 .dxj-ui-bd #tab .title .more-mod {
     overflow:hidden;
     border:1px solid #DC143C;
     width:70px;
     position:absolute;
     right:0;
     margin-right:6px;
     display:none;
 }
 .dxj-ui-bd #tab .title .more-mod .tag{
     height:32px;
     line-height:32px;
     width:70px;
     background: #DC143C;
     color:#fff;
     font-family: arial ;
     font-size: 12px;
     text-align: center;
     cursor:pointer;
 }
 .dxj-ui-bd #tab .title .more-mod .mods {
     overflow:hidden;
     width:70px;
     display:none;
 }
 .dxj-ui-bd #tab .title .more-mod .mods div {
     height:24px;
     line-height:24px;
     width:62px;
     font-family: arial ;
     font-size: 12px;
     cursor:pointer;
     padding-left:10px;
 }
 .dxj-ui-bd #tab .title .items {
     height:32px;
 
     width:480px;
     overflow: hidden;
     float : left;
 }
 .dxj-ui-bd #tab .title .items div {
     padding:0px;
     margin-left:10px;
     width:84px;
     height:32px;
     line-height: 32px;
     background: #3385ff;
     color:#fff;
     font-family: arial ;
     font-size: 12px;
     text-align: center;
     position:relative;
     float : left;
     cursor:pointer;
 }
 .dxj-ui-bd #tab .title .items div span.del {
     width:16px;
     height:16px;
     line-height: 16px;
     display:block;
     background: #DC143C;
     position:absolute;
     right:0 ;
     top:0;
     cursor:pointer;
 }
 .dxj-ui-bd #tab .content {
     width:716px;
     padding-top:30px;
     overflow: hidden;
     border:2px solid #3385ff;
     border-top:0px;
     min-height:130px;
     text-align:center;
 }
 .dxj-ui-bd #tab .content table {
     margin : 0 auto ;
 }
 .dxj-ui-bd #tab .content div.c {
     padding-top : 20px ;
     padding-left:20px;
     background:#eee;
     height:140px;
 }
 .dxj-ui-bd #tab .content div.c .input-content {
     margin-top : 10px ;
     font-family: arial ;
     font-size: 12px;
 }
 .dxj-ui-bd #tab .console-panel {
     width:716px;
     padding-top:20px;
     padding-bottom:20px;
     overflow: hidden;
     border:2px solid #3385ff;
     border-top:0px;
     border-bottom:2px solid #3385ff;
     background:#fff;
     display:none;
 }
 
 .active {
     font-weight:bold ;
 }

3,bigbear.js

復制代碼 代碼如下:

(function($){
    var win = window ;
    var bb = win.bigbear = win.bigbear || {
        ui : {}
    } ;
    var ui = bb.ui = {} ;
    var Tab = function(elem,opts){
        this.elem = elem ;
        this.opts = opts ;
    } ;
    var tabProto = Tab.prototype ;
    /* update time 2015 1/26 15:36 */
    tabProto._isDisplayMax = function(size){
        var displayMax = this.getOpts()["displayMax"] || 5 ;
        return (size <= displayMax) ? true : false ;
    } ;
    tabProto._isEmptyResult = function(){
        if(!this.getOpts()["result"].length){
            return false ;
        }
        return true ;
    } ;
    tabProto._saveOrUpdateStatus = function(item,status){
        item["status"] = status ;
    } ;
    tabProto._getItemListByStatus = function(status){
        var list = [] ;
        var result = this.getOpts()["result"] ;
        $.each(result,function(i,item){
            if(status == item["status"]){
                list.push(item) ;
            }
        }) ;
        return list ;
    } ;
    tabProto._getStatusByIndex = function(index){
        var status = null ;
        var result = this.getOpts()["result"] ;
        $.each(result,function(i,item){
            if(index == item["index"]){
                status = item["status"] ;
            }
        }) ;
        return status ;
    } ;
    tabProto._renderConsolePanel = function(status){
        var that = this ;
        var root = that.getElem().find(".console-panel") ;
        this._resetConsolePanel() ;
        $.each(that._getItemListByStatus(status),function(i,item){
            var elem = $("<div style='float:left';></div>").appendTo(root) ;
            $("<input type='radio' name='addmod' />")
            .data("item",item)
            .appendTo(elem) ;
            $("<span></span>").text(item["text"]).appendTo(elem) ;
        }) ;
        if(root.find("div").size()){
            $("<input type='button' value='添加模塊' style='margin-left:20px'/>")
            .on("click",function(){
                var data = root.find("input[type=radio]:checked").data("item") ;
                if(that._getItemListByStatus("1").length < that.getOpts()["displayMax"]){
                    that.getElem().find(".title .items div").eq(data["index"]).fadeIn(function(){
                        that._saveOrUpdateStatus(data,"1") ;
                    })
                    .trigger("click") ;
                }
                else{
                    that._saveOrUpdateStatus(data,"2") ;
                }
                that.getElem().find(".title .adder").trigger("click") ;
            })
            .appendTo(root) ;
        }
        else{
            root.text("暫無任何可添加的項目!") ;
        }
    } ;
    /* update time 2015 1/26 15:36 */ 
    tabProto._setCurrent = function(index){
        var items = this.getElem().find(".title .items div").removeClass("active") ;
        items.eq(index).addClass("active") ;
        var contents = this.getElem().find(".content .c").hide() ;
        contents.eq(index).show() ;
    } ;
    tabProto.getElem = function(){
        return this.elem ;
    } ;
    tabProto.getOpts = function(){
        return this.opts ;
    } ;
    tabProto._resetContent = function(){
        this.getElem().find(".content").html("") ;
    } ;
    tabProto._setContent = function(html){
        this.getElem().find(".content").html(html) ;
    } ;
    tabProto._getContent = function(url){
        return $.ajax({
            url : url
        }) ;
    } ;
    tabProto._deleteItem = function(elem){
        var that = this ;
        this.getElem().find(".title .items div")
        .eq(elem.index())
        .fadeOut(function(){
            that._resetContent() ;
            that._saveOrUpdateStatus(elem.data("item"),"0") ;
            that._triggerItem(elem.index() + 1) ;
        }) ;
    } ;
    tabProto._triggerItem = function(next){
        var nextStatus = this._getStatusByIndex(next) ;
        var items = this.getElem().find(".title .items div") ;
        next = items.eq(next) ;
        if(next.size() && "1" == nextStatus){ //后繼dom節點存在
            next.trigger("click") ;
        }
        else{
            items.eq(0).trigger("click") ;
        }
    } ;
    tabProto._resetConsolePanel = function(){
        this.getElem().find(".console-panel").empty() ;
    } ;
    tabProto.init = function(){
        if(this._isEmptyResult()){
            this._setContent("暫無任何模塊!") ;
        }
        var that = this ;
        this.getElem().find(".title .adder")
        .text("+" + this.getOpts()["buttonText"])
        .on("click",function(){
            that.getElem().find(".console-panel").slideToggle(function(){
                that._renderConsolePanel("0") ;
            }) ;
        }) ;
        $.each(this.getOpts()["result"],function(i,item){
            if(that._isDisplayMax(i + 1)){
                that._saveOrUpdateStatus(item,"1") ;
            }
            else{
                that._saveOrUpdateStatus(item,"2") ;
            }
            that._render(item) ;
        }) ;
        if(!that._isDisplayMax(this.getOpts()["result"].length)){
            this.getElem().find(".title .more-mod").fadeIn(function(){
                $(this).find(".tag").on("click",function(){
                    var root = $(this).next() ;
                    root.empty() ;
                    $.each(that._getItemListByStatus("2"),function(i,data){
                        $("<div></div>").text(data["text"])
                        .on("click",function(){
                            if(that._getItemListByStatus("1").length < that.getOpts()["displayMax"]){
                                that.getElem().find(".title .items div").eq(data["index"]).fadeIn(function(){
                                    that._saveOrUpdateStatus(data,"1") ;
                                }) ;
                            }
                            else{
                                alert("不能添加任何模塊,目前已經是最大數量!") ;
                            }
                        })
                        .appendTo(root) ;
                    }) ;
                    root.toggle() ;
                }) ;
                
            });
        }
        this.getElem().find(".title .items div")
        .eq(0)
        .trigger("click") ; // 假定是必須有一項,否則插件意義就不大了!
    } ;
    tabProto._render = function(data){
        var that = this ;
        var item = $("<div></div>").text(data["text"]).appendTo(this.getElem().find(".title .items")) ;
        data["index"] = item.index() ;
        item.on("click",function(){
            that._setCurrent($(this).index()) ;
            that._getContent(data["url"]).done(function(result){
                that._setContent(result) ;
            })
            .fail(function(){
                throw new Error("Net Error !") ;
            });
        })
        .data("item",data) ;
        if("2" == data["status"]){
            item.hide() ;
        }
        if("1" == data["showClose"]){
            $("<span class='del'>X</span>")
            .on("click",function(){
                if(win.confirm("是否刪除此項?")){
                    that._deleteItem(item) ;
                    return false ; // 阻止冒泡
                }
            })
            .appendTo(item) ;
        }
    } ;
    ui.createTab = function(elem,opts){
        var tab = new Tab(elem,opts) ;
        tab.init() ;
        return tab ;
    } ;   
})(jQuery) ;
  

(四),最后總結

 ?。?),面向對象的思考方式合理分析功能需求。

  (2),以類的方式來組織我們的插件邏輯。

 ?。?),不斷重構上面的實例,如何進行合理的重構那?不要設計過度,要游刃有余,推薦的方式是過程化設計與面向對象思想設計相結合。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产日韩在线视频| 日韩欧美有码在线| 97久久精品人搡人人玩| 亚洲欧美激情四射在线日| 欧美乱人伦中文字幕在线| 亚洲国产欧美一区二区三区同亚洲| 精品国产欧美一区二区三区成人| 亚洲sss综合天堂久久| 日韩精品视频免费专区在线播放| 国产精品国产三级国产专播精品人| 成人亚洲综合色就1024| 中文字幕最新精品| 日本高清+成人网在线观看| 国产精品美女久久久久av超清| 日韩大陆毛片av| 97在线精品视频| 日韩免费电影在线观看| 国产精品色悠悠| 欧美性猛交xxxx黑人| 国产精品视频永久免费播放| 日韩精品在线观看视频| 国产精品伦子伦免费视频| 亚洲欧美综合区自拍另类| 日韩电影免费观看在线观看| 亚洲高清av在线| 国产精品视频在线播放| 神马国产精品影院av| 黑人巨大精品欧美一区二区一视频| 成人国产精品一区| 日本亚洲欧美三级| 69影院欧美专区视频| 亚洲国产成人爱av在线播放| 国产日韩专区在线| 国产亚洲精品久久久久动| 亚洲欧美日韩国产成人| 美女黄色丝袜一区| 久久久久久久久亚洲| 日韩精品在线视频美女| 欧美精品做受xxx性少妇| 热久久99这里有精品| 亚洲第一精品夜夜躁人人爽| 亚洲福利视频在线| 欧美精品一区二区免费| 久久久久国产精品免费| 欧美一级大片在线免费观看| 成人免费自拍视频| 国产精品h片在线播放| 亚洲一区二区三区四区视频| 亚洲欧洲av一区二区| 欧美成人黑人xx视频免费观看| 日韩有码在线视频| 97精品一区二区三区| 动漫精品一区二区| 欧美性猛交xxxxx免费看| 亚洲片国产一区一级在线观看| 亚洲风情亚aⅴ在线发布| 日本精品久久久久影院| 69久久夜色精品国产69乱青草| 亚洲视频在线免费观看| 亚洲色图偷窥自拍| 国产精品成av人在线视午夜片| 国产精品麻豆va在线播放| 欧美日韩亚洲视频| 91久久中文字幕| 欧美制服第一页| 91麻豆国产语对白在线观看| 精品国产一区二区三区四区在线观看| 在线观看免费高清视频97| 国产精品福利小视频| 国产最新精品视频| 欧美日韩亚洲天堂| 成人天堂噜噜噜| 欧美一级在线亚洲天堂| 国产精品成人国产乱一区| 亚洲爱爱爱爱爱| 欧美xxxx14xxxxx性爽| 国产精品成人在线| 国产精品成人免费电影| 国产精品免费久久久久影院| 国产精品日日做人人爱| 国产精品久久久久久久久粉嫩av| 国产91对白在线播放| 亚洲福利在线看| 久久99久久亚洲国产| 国产亚洲欧洲黄色| 国产精品久久久久av| 国产精品尤物福利片在线观看| 亚洲精品综合久久中文字幕| 精品中文视频在线| 亚洲综合中文字幕在线观看| 91国产中文字幕| 亚洲激情第一页| 欧美福利视频网站| 国产亚洲成精品久久| 国产成人av网址| 国产噜噜噜噜久久久久久久久| 国产精品午夜一区二区欲梦| 最新日韩中文字幕| 久久99精品国产99久久6尤物| 亚洲国产另类久久精品| 亚洲欧美日韩直播| 国模吧一区二区三区| 色偷偷av一区二区三区| 久久久久免费视频| 国产欧亚日韩视频| 久久久噜噜噜久久中文字免| 亚洲第一免费播放区| 日韩电视剧免费观看网站| 美女啪啪无遮挡免费久久网站| 欧美另类第一页| 这里精品视频免费| 国产在线视频2019最新视频| www.日本久久久久com.| 久久精品人人做人人爽| 欧美精品激情在线| 国产精品电影久久久久电影网| 亚洲激情电影中文字幕| 国产精品久久久久久久久久久久久| 亚洲石原莉奈一区二区在线观看| 中文字幕一区电影| 欧美在线视频免费| 成人日韩在线电影| 精品亚洲一区二区| 欧美国产一区二区三区| 亚洲性猛交xxxxwww| 青草热久免费精品视频| 亚洲级视频在线观看免费1级| 777午夜精品福利在线观看| 成人激情综合网| 亚洲男人7777| 欧美激情影音先锋| 日韩欧美高清在线视频| 精品色蜜蜜精品视频在线观看| 精品少妇一区二区30p| 欧美成人免费一级人片100| 亚洲人成网站999久久久综合| 久青草国产97香蕉在线视频| 国产精品视频白浆免费视频| 最近中文字幕2019免费| 亚洲精品视频网上网址在线观看| 亚洲乱码国产乱码精品精| 日韩欧美在线看| 97超级碰碰碰| 欧美专区在线播放| 久久久久久久97| 欧美另类99xxxxx| 国产视频精品一区二区三区| 欧美美女操人视频| 亚洲精品suv精品一区二区| 456亚洲影院| 色婷婷综合成人av| 欧美日韩成人网| 国产激情综合五月久久| 国产精品盗摄久久久| 亚洲美女黄色片| 亚洲欧美国产日韩中文字幕| 欧美专区福利在线| 久热国产精品视频| 国产成人精品视| 亚洲欧美日韩精品| 久久久国产精品x99av| 欧美激情在线播放| 久久精品国产久精国产思思| 久久国产精品久久久久久|