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

首頁 > 編程 > JavaScript > 正文

js驗證模型自我實現的具體方法

2019-11-20 22:38:11
字體:
來源:轉載
供稿:網友

市面上有很多表單驗證的框架,教我們怎么驗證表單的數據提交,說實話也真的很簡單,但是我們會有一種感覺我們要是離開了這些框架的時候,我們有時候會束手無策,然后js驗證寫的很不規范,沒有一套比較好的模式,那我寫這篇的目的就是:我們自己構建js驗證應該是什么樣子的,來慢慢看一下。
假設我們現在寫一個登錄的頁面(這可能是最簡單的數據提交了哦),html頁面會有一個用戶名和一個密碼的文本框讓我們用戶輸入自己的用戶名和密碼,我們肯定是要判斷用戶名和密碼是否為空,很明顯這樣的js驗證判斷是放在onblur事件里面觸發,html代碼如下:

ValidateHelper是一個對象,一些驗證的方法就是在這個對象里面,我們規定一下,js驗證用戶的輸入有兩返回結果,一個成功,一個是失敗。成功的時候我們輸出成功的提示,
失敗的時候我們輸出失敗的提示,對應的兩個輸出方法:

復制代碼 代碼如下:

    normalMessage: function(jqueryObj, msg) {
        var emObj = $(jqueryObj.parent().find('em')[0]);
        emObj.empty().append(msg);
    },
    warningMessage: function(jqueryObj, msg) {
        ValidateHelper.clearMessage(jqueryObj);
        var emObj = $(jqueryObj.parent().find('em')[0]);
        var spanElement = "<span style='color:#FF4C31;float:left;height:23px;line-height:23px;padding:0 10px 0 35px;'>"
                + msg
                + "</span>";
        emObj.empty().append(spanElement);

    },


還有一個清除提示的方法:
復制代碼 代碼如下:

clearMessage: function(jqueryObj) {
    var emObj = $(jqueryObj.parent().find('em')[0]);
    emObj.empty();
},

我們已經寫了成功和失敗提示方法,以及清除提示的方法,這個三個是我們在后面會一直調用的基本方法。
好了,我們寫一個驗證用戶輸入不能為空的方法:
復制代碼 代碼如下:

    validateStringValueIsEmpty: function(obj, normalMsg, warningMsg) {
        var jqueryObj = $(obj);
        ValidateHelper.clearMessage(obj);
        if ($.trim(jqueryObj.val()).length == 0) {
            ValidateHelper.warningMessage(jqueryObj, warningMsg);
            return false;
        }
        else {
            ValidateHelper.normalMessage(jqueryObj, normalMsg);
            return true;
        }
    },

這個方法會在onblur中被調用的驗證方法,里面自然也用到了成功和失敗提示方法,以及清除提示的方法。參數有三個,要驗證的Dom或者jQuery對象、成功提示信息、失敗提示信
息。要是為空就失敗,要是不為空就成功。
上面寫好的方法在onblur中會觸發的,我們提交數據的時候還會用到得哦:
復制代碼 代碼如下:

    initInfo: function() {

        var userName = $('#email');
        var userPwd = $('#setPwd');
        if (!ValidateHelper.validateStringValueIsEmpty(userName, '通過', '不能為空')) {
            userName.focus();
            return null;
        }
        if (!ValidateHelper.validateStringValueIsEmpty(userPwd, '通過', '不能為空')) {
            userPwd.focus();
            return null;
        }

        var userInfo = {
            UserName: userName.val(),
            UserPwd: userPwd.val()
        };

        return userInfo;
    },

    post: function() {

        var userInfo = ValidateHelper.initInfo();
        if (userInfo == null) {
            return;
        }

        $.ajax({
            type: "post",
            dataType: "text",
            url: "Ajax/Module.aspx",
            timeout: 30000,
            data: { UserName: userInfo.UserName, UserPwd: userInfo.UserPwd },
            success: function(data) {
                alert(data.toString());
            }
        });
    }


這邊呢要是在提交數據的時候會調用validateStringValueIsEmpty方法,要是返回的是失敗 是不會真的提交給服務器端得。
那上面的情況是一個最簡單的處理不為空的情況,要是我們想驗證是否是Email 是否是身份證號碼,這些復雜的驗證實現如下:
復制代碼 代碼如下:

var Validation = {
    textCount: function(field, counter, maxLimit) {
        var message = $(field).val();
        if ($(field).val().length > maxLimit)
            $(field).val(message.substring(0, maxLimit))
        //$(counter).text(maxLimit-field.value.length);   
    },
    refreshValidator: function(img, input) {
        $(img).attr('src', $(img).attr('src') + "&r=" + Math.random());
        $(input).focus();
    },
    isUrl: function(s) {
        var strRegex =
                            /^((http(s)?|ftp|telnet|news|rtsp|mms):////)?(((/w(/-*/w)*/.)+[a-zA-Z]{2,4})|(((1/d/d|2([0-4]/d|5[0-5])|[1-9]/d|/d).){3}(1/d/d|2([0-4]/d|5[0-5])|[1-9]/d|/d).?))(:/d{0,5})?(//+.*)*$/;
        return strRegex.test(s);
    },
    isDecimal: function(d) { var pattern = /^(([1-9]/d{0,12})|0)(/./d{1,2})?$/; return pattern.test(d); },
    isEmail: function(s) {
        var pattern = /^[/w-]+(/.[/w-]+)*@[/w-]+(/.[/w-]+)+$/;
        return pattern.test(s);
    },
    isLowEmail: function(s) {
        var b, e;
        b = s.indexOf("@");
        e = s.indexOf(".");
        if (b <= 0) return false;
        if (e < 0 || e == (s.length - 1)) { return false; }
        return true;
    },
    clearNoNum: function(event, obj) {
        event = window.event || event;
        if (event.keyCode == 37 | event.keyCode == 39) {
            return;
        }
        obj.value = obj.value.replace(/[^/d.]/g, "");
        obj.value = obj.value.replace(/^/./g, "");
        obj.value = obj.value.replace(//.{2,}/g, ".");
        obj.value = obj.value.replace(".", "$#$").replace(//./g, "").replace("$#$", ".");
    },
    checkNum: function(obj) {
        obj.value = obj.value.replace(//.$/g, "");
    },
    isInteger: function(value) {
        var integerReg = new RegExp(/^/d+$/);
        return integerReg.test(value);
    },
    isValidateReg: function(value) {
        var validateReg = /^([A-Za-z0-9/s/-/_/~/!/@/#/$/%/^/&/*/(/)/|/</>/?/:/;/"/'/./[/]/{/}/,/+/`/////=]){6,16}$/;
        if (validateReg.test(value)) {
            return true;
        }
        return false;
    },
    isDate: function(strValue) {
        var objRegExp = /^/d{4}(/-|//|/.)/d{1,2}/1/d{1,2}$/

        if (!objRegExp.test(strValue))
            return false;
        else {
            var arrayDate = strValue.split(RegExp.$1);
            var intDay = parseInt(arrayDate[2], 10);
            var intYear = parseInt(arrayDate[0], 10);
            var intMonth = parseInt(arrayDate[1], 10);
            if (intMonth > 12 || intMonth < 1) {
                return false;
            }
            var arrayLookup = { '1': 31, '3': 31, '4': 30, '5': 31, '6': 30, '7': 31,
                '8': 31, '9': 30, '10': 31, '11': 30, '12': 31
            }
            if (arrayLookup[parseInt(arrayDate[1])] != null) {
                if (intDay <= arrayLookup[parseInt(arrayDate[1])] && intDay != 0)
                    return true;
            }
            if (intMonth - 2 == 0) {
                var booLeapYear = (intYear % 4 == 0 && (intYear % 100 != 0 || intYear % 400 == 0));
                if (((booLeapYear && intDay <= 29) || (!booLeapYear && intDay <= 28)) && intDay != 0)
                    return true;
            }
        }
        return false;
    },
    isZip: function(value) {
        var validateReg = /^[0-9]{6}$/;
        return validateReg.test(value);
    },
    checkSpecialChar: function(value) {
        var validateReg = /([~!@#$%^&*////,./(/)]){6,16}$/;
        return validateReg.test(value);
    },
    CheckSpecialString: function(value) {
        var validateReg = /[/u0000-/u0008/u000B/u000C/u000E-/u001F/uD800-/uDFFF/uFFFE/uFFFF]/;
        return validateReg.test(value);
    },
    isTel: function(s) {
        var patrn = /^/d{3,4}-/d{7,8}(-/d{3,4})?$/
        if (!patrn.exec(s)) return false
        return true
    },

    isMobile: function(value) {
        var validateReg = /^1/d{10}$/;
        return validateReg.test(value);
    },
    getLength: function(value) {
        return value.replace(/[^/x00-/xff]/g, "**").length;
    },
    isLicence: function(value) {
        var validateReg = /^[A-Za-z]{10}[0-9]{10}$/;
        return validateReg.test(value);
    },
    isPersonalCard: function(value) {
        var validateReg = /(^/d{15}$)|(^/d{17}(/d|[A-Za-z]{1})$)/;
        return validateReg.test(value);
    },
    isOrganizationCodeCard: function(value) {
        var validateReg = /^[A-Za-z0-9]{9}$/;
        return validateReg.test(value);
    },
    isBankAccount: function(value) {
        var validateReg = /^[1-9]{1}[0-9]*$/;
        return validateReg.test(value);
    },
    MaxLength: function(field, maxlimit) {
        var j = field.value.replace(/[^/x00-/xff]/g, "**").length;
        var tempString = field.value;
        var tt = "";
        if (j > maxlimit) {
            for (var i = 0; i < maxlimit; i++) {
                if (tt.replace(/[^/x00-/xff]/g, "**").length < maxlimit)
                    tt = tempString.substr(0, i + 1);
                else
                    break;
            }
            if (tt.replace(/[^/x00-/xff]/g, "**").length > maxlimit) {
                tt = tt.substr(0, tt.length - 1);
                field.value = tt;
            }
            else {
                field.value = tt;
            }
        }
    }
};



這個類是寫了一些驗證Email 、身份證號碼等等的正則表達式,供我們后面使用,使用方法如下:
復制代碼 代碼如下:

    validateStringValueForEmail: function(obj, normalMsg, warningMsg) {
        var jqueryObj = $(obj);
        ValidateHelper.clearMessage(obj);
        if (!ValidateHelper.validateStringValueIsEmpty(jqueryObj, "通過", "不能為空")) {
            ValidateHelper.warningMessage(jqueryObj, "不能為空");
            return false;
        }
        if (!Validation.isEmail(jqueryObj.val())) {
            ValidateHelper.warningMessage(jqueryObj, warningMsg);
            return false;
        }
        else {
            ValidateHelper.normalMessage(jqueryObj, normalMsg);
            return true;
        }
    },
    validateStringValueForCardID: function(obj, normalMsg, warningMsg) {
        var jqueryObj = $(obj);
        ValidateHelper.clearMessage(obj);
        if (!ValidateHelper.validateStringValueIsEmpty(jqueryObj, "通過", "不能為空")) {
            ValidateHelper.warningMessage(jqueryObj, "不能為空");
            return false;
        }
        if (!Validation.isPersonalCard(jqueryObj.val())) {
            ValidateHelper.warningMessage(jqueryObj, warningMsg);
            return false;
        }
        else {
            ValidateHelper.normalMessage(jqueryObj, normalMsg);
            return true;
        }
    },


那到這邊是基本可以處理我們的一般的js驗證了,可以試試以后用在自己的框架上,我們把自己調試的源碼附上:
ASPX :
復制代碼 代碼如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="FormValidateModuleEx._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>

    <script src="js/jquery-1.6.2.min.js" type="text/javascript"></script>
    <script src="js/MyValidate.js" type="text/javascript"></script>
    <%--<script src="js/CheckPersonCardID.js" type="text/javascript"></script>--%>
</head>
<body>
    <div>
        <li>
            <label for="email">
                用戶名:
            </label>
            <input name="email" type="text" id="email" maxlength="50" onblur="return ValidateHelper.validateStringValueIsEmpty($(this),'通過','不能為空');" /><em></em>
        </li>
        <li>
            <label for="setPwd">
                密碼:
            </label>
            <input name="setPwd" type="password" id="setPwd" maxlength="16" onblur="return ValidateHelper.validateStringValueIsEmpty($(this),'通過','不能為空');" /><em></em>
        </li>
        <li>
            <label for="setPwd">
                身份證:
            </label>
            <input name="cardId" type="text" id="cardId" onblur="return ValidateHelper.validateStringValueForCardID($(this),'通過','身份證格式不正確');" /><em></em><%--IdCardValidate($(this),'身份證的格式不正確');--%>
        </li>
        <li>
            <label for="setPwd">
                Email:
            </label>
            <input name="againEmail" type="text" id="againEmail" onblur="return ValidateHelper.validateStringValueForEmail($(this),'通過','email格式不正確');" /><em></em>
        </li>
        <li><input onclick="return ValidateHelper.post();" type="button" id="btnPost" /></li>
    </div>
</body>
</html>


js:
復制代碼 代碼如下:

var Validation = {
    textCount: function(field, counter, maxLimit) {
        var message = $(field).val();
        if ($(field).val().length > maxLimit)
            $(field).val(message.substring(0, maxLimit))
        //$(counter).text(maxLimit-field.value.length);   
    },
    refreshValidator: function(img, input) {
        $(img).attr('src', $(img).attr('src') + "&r=" + Math.random());
        $(input).focus();
    },
    isUrl: function(s) {
        var strRegex =
                            /^((http(s)?|ftp|telnet|news|rtsp|mms):////)?(((/w(/-*/w)*/.)+[a-zA-Z]{2,4})|(((1/d/d|2([0-4]/d|5[0-5])|[1-9]/d|/d).){3}(1/d/d|2([0-4]/d|5[0-5])|[1-9]/d|/d).?))(:/d{0,5})?(//+.*)*$/;
        return strRegex.test(s);
    },
    isDecimal: function(d) { var pattern = /^(([1-9]/d{0,12})|0)(/./d{1,2})?$/; return pattern.test(d); },
    isEmail: function(s) {
        var pattern = /^[/w-]+(/.[/w-]+)*@[/w-]+(/.[/w-]+)+$/;
        return pattern.test(s);
    },
    isLowEmail: function(s) {
        var b, e;
        b = s.indexOf("@");
        e = s.indexOf(".");
        if (b <= 0) return false;
        if (e < 0 || e == (s.length - 1)) { return false; }
        return true;
    },
    clearNoNum: function(event, obj) {
        event = window.event || event;
        if (event.keyCode == 37 | event.keyCode == 39) {
            return;
        }
        obj.value = obj.value.replace(/[^/d.]/g, "");
        obj.value = obj.value.replace(/^/./g, "");
        obj.value = obj.value.replace(//.{2,}/g, ".");
        obj.value = obj.value.replace(".", "$#$").replace(//./g, "").replace("$#$", ".");
    },
    checkNum: function(obj) {
        obj.value = obj.value.replace(//.$/g, "");
    },
    isInteger: function(value) {
        var integerReg = new RegExp(/^/d+$/);
        return integerReg.test(value);
    },
    isValidateReg: function(value) {
        var validateReg = /^([A-Za-z0-9/s/-/_/~/!/@/#/$/%/^/&/*/(/)/|/</>/?/:/;/"/'/./[/]/{/}/,/+/`/////=]){6,16}$/;
        if (validateReg.test(value)) {
            return true;
        }
        return false;
    },
    isDate: function(strValue) {
        var objRegExp = /^/d{4}(/-|//|/.)/d{1,2}/1/d{1,2}$/

        if (!objRegExp.test(strValue))
            return false;
        else {
            var arrayDate = strValue.split(RegExp.$1);
            var intDay = parseInt(arrayDate[2], 10);
            var intYear = parseInt(arrayDate[0], 10);
            var intMonth = parseInt(arrayDate[1], 10);
            if (intMonth > 12 || intMonth < 1) {
                return false;
            }
            var arrayLookup = { '1': 31, '3': 31, '4': 30, '5': 31, '6': 30, '7': 31,
                '8': 31, '9': 30, '10': 31, '11': 30, '12': 31
            }
            if (arrayLookup[parseInt(arrayDate[1])] != null) {
                if (intDay <= arrayLookup[parseInt(arrayDate[1])] && intDay != 0)
                    return true;
            }
            if (intMonth - 2 == 0) {
                var booLeapYear = (intYear % 4 == 0 && (intYear % 100 != 0 || intYear % 400 == 0));
                if (((booLeapYear && intDay <= 29) || (!booLeapYear && intDay <= 28)) && intDay != 0)
                    return true;
            }
        }
        return false;
    },
    isZip: function(value) {
        var validateReg = /^[0-9]{6}$/;
        return validateReg.test(value);
    },
    checkSpecialChar: function(value) {
        var validateReg = /([~!@#$%^&*////,./(/)]){6,16}$/;
        return validateReg.test(value);
    },
    CheckSpecialString: function(value) {
        var validateReg = /[/u0000-/u0008/u000B/u000C/u000E-/u001F/uD800-/uDFFF/uFFFE/uFFFF]/;
        return validateReg.test(value);
    },
    isTel: function(s) {
        var patrn = /^/d{3,4}-/d{7,8}(-/d{3,4})?$/
        if (!patrn.exec(s)) return false
        return true
    },

    isMobile: function(value) {
        var validateReg = /^1/d{10}$/;
        return validateReg.test(value);
    },
    getLength: function(value) {
        return value.replace(/[^/x00-/xff]/g, "**").length;
    },
    isLicence: function(value) {
        var validateReg = /^[A-Za-z]{10}[0-9]{10}$/;
        return validateReg.test(value);
    },
    isPersonalCard: function(value) {
        var validateReg = /(^/d{15}$)|(^/d{17}(/d|[A-Za-z]{1})$)/;
        return validateReg.test(value);
    },
    isOrganizationCodeCard: function(value) {
        var validateReg = /^[A-Za-z0-9]{9}$/;
        return validateReg.test(value);
    },
    isBankAccount: function(value) {
        var validateReg = /^[1-9]{1}[0-9]*$/;
        return validateReg.test(value);
    },
    MaxLength: function(field, maxlimit) {
        var j = field.value.replace(/[^/x00-/xff]/g, "**").length;
        var tempString = field.value;
        var tt = "";
        if (j > maxlimit) {
            for (var i = 0; i < maxlimit; i++) {
                if (tt.replace(/[^/x00-/xff]/g, "**").length < maxlimit)
                    tt = tempString.substr(0, i + 1);
                else
                    break;
            }
            if (tt.replace(/[^/x00-/xff]/g, "**").length > maxlimit) {
                tt = tt.substr(0, tt.length - 1);
                field.value = tt;
            }
            else {
                field.value = tt;
            }
        }
    }
};


var ValidateHelper = {
    validateStringValueIsEmpty: function(obj, normalMsg, warningMsg) {
        var jqueryObj = $(obj);
        ValidateHelper.clearMessage(obj);
        if ($.trim(jqueryObj.val()).length == 0) {
            ValidateHelper.warningMessage(jqueryObj, warningMsg);
            return false;
        }
        else {
            ValidateHelper.normalMessage(jqueryObj, normalMsg);
            return true;
        }
    },
    validateStringValueForEmail: function(obj, normalMsg, warningMsg) {
        var jqueryObj = $(obj);
        ValidateHelper.clearMessage(obj);
        if (!ValidateHelper.validateStringValueIsEmpty(jqueryObj, "通過", "不能為空")) {
            ValidateHelper.warningMessage(jqueryObj, "不能為空");
            return false;
        }
        if (!Validation.isEmail(jqueryObj.val())) {
            ValidateHelper.warningMessage(jqueryObj, warningMsg);
            return false;
        }
        else {
            ValidateHelper.normalMessage(jqueryObj, normalMsg);
            return true;
        }
    },
    validateStringValueForCardID: function(obj, normalMsg, warningMsg) {
        var jqueryObj = $(obj);
        ValidateHelper.clearMessage(obj);
        if (!ValidateHelper.validateStringValueIsEmpty(jqueryObj, "通過", "不能為空")) {
            ValidateHelper.warningMessage(jqueryObj, "不能為空");
            return false;
        }
        if (!Validation.isPersonalCard(jqueryObj.val())) {
            ValidateHelper.warningMessage(jqueryObj, warningMsg);
            return false;
        }
        else {
            ValidateHelper.normalMessage(jqueryObj, normalMsg);
            return true;
        }
    },
    normalMessage: function(jqueryObj, msg) {
        var emObj = $(jqueryObj.parent().find('em')[0]);
        emObj.empty().append(msg);
    },
    warningMessage: function(jqueryObj, msg) {
        ValidateHelper.clearMessage(jqueryObj);
        var emObj = $(jqueryObj.parent().find('em')[0]);
        var spanElement = "<span style='color:#FF4C31;float:left;height:23px;line-height:23px;padding:0 10px 0 35px;'>"
                + msg
                + "</span>";
        emObj.empty().append(spanElement);

    },
    clearMessage: function(jqueryObj) {
        var emObj = $(jqueryObj.parent().find('em')[0]);
        emObj.empty();
    },
    initInfo: function() {

        var userName = $('#email');
        var userPwd = $('#setPwd');
        if (!ValidateHelper.validateStringValueIsEmpty(userName, '通過', '不能為空')) {
            userName.focus();
            return null;
        }
        if (!ValidateHelper.validateStringValueIsEmpty(userPwd, '通過', '不能為空')) {
            userPwd.focus();
            return null;
        }

        var userInfo = {
            UserName: userName.val(),
            UserPwd: userPwd.val()
        };

        return userInfo;
    },

    post: function() {

        var userInfo = ValidateHelper.initInfo();
        if (userInfo == null) {
            return;
        }

        $.ajax({
            type: "post",
            dataType: "text",
            url: "Ajax/Module.aspx",
            timeout: 30000,
            data: { UserName: userInfo.UserName, UserPwd: userInfo.UserPwd },
            success: function(data) {
                alert(data.toString());
            }
        });
    }
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩大片在线观看视频| 亚洲色图欧美制服丝袜另类第一页| 欧美精品激情blacked18| 精品欧美国产一区二区三区| 亚洲肉体裸体xxxx137| 久久av中文字幕| 国产极品精品在线观看| 精品久久久香蕉免费精品视频| 色青青草原桃花久久综合| 欧美激情亚洲视频| 国产精品aaa| 国产69精品久久久| 亚洲一区二区日本| 最近2019中文字幕mv免费看| 日韩一区二区av| 国产精品海角社区在线观看| 久久好看免费视频| 久国内精品在线| 亚洲va欧美va在线观看| 国模精品一区二区三区色天香| 欧美www视频在线观看| 不用播放器成人网| 国产一区二区三区视频在线观看| 亚洲一区二区三区香蕉| 亚洲性xxxx| 久久久久免费视频| 亚洲综合日韩在线| 欧美视频在线看| 国产精品免费一区二区三区都可以| 亚洲理论电影网| 超碰91人人草人人干| 91系列在线观看| 高清欧美性猛交| 91精品视频播放| 国产亚洲激情视频在线| 久久福利视频网| 色一区av在线| 91av中文字幕| 亚洲精品综合久久中文字幕| 精品自拍视频在线观看| 国产福利视频一区| 一二美女精品欧洲| 亚洲人成网站免费播放| 一区二区中文字幕| 亚洲精选一区二区| 精品国产31久久久久久| 国产精品入口尤物| 欧美日韩在线免费观看| 国产一区二区在线免费视频| 欧美在线观看网址综合| 97精品在线视频| 亚洲人成毛片在线播放| 亚洲毛片在线看| 久久91亚洲人成电影网站| 91av在线网站| 欧美精品一区在线播放| 国产精品久久久久久久久免费看| 中文字幕免费精品一区| 亚洲精品电影网在线观看| 国产精品男人的天堂| 成人网在线视频| 亚洲乱码国产乱码精品精| 精品国产欧美一区二区三区成人| 国产91网红主播在线观看| 国产精品吊钟奶在线| 国产精品人人做人人爽| 日本免费一区二区三区视频观看| 丝袜一区二区三区| 欧美在线视频观看| 国产精品免费视频久久久| 欧美肥婆姓交大片| 欧美又大又粗又长| 国产精品丝袜视频| 蜜臀久久99精品久久久无需会员| 一区二区欧美久久| 这里只有精品久久| 亚洲深夜福利网站| 欧美成人午夜剧场免费观看| 欧美精品videos性欧美| 欧美一级电影在线| 亚洲欧美国产精品va在线观看| 精品国产一区二区三区久久狼5月| 中文字幕在线日韩| 中文字幕在线精品| 日韩一区视频在线| 欧美激情视频一区二区| 亚洲成人激情小说| 日本欧美黄网站| 日韩美女福利视频| 中文字幕无线精品亚洲乱码一区| 欧美精品18videos性欧美| 亚洲欧洲美洲在线综合| 日韩欧美一区视频| 国产97在线播放| 亚洲欧洲在线播放| 午夜精品美女自拍福到在线| 激情av一区二区| 久久国产精品电影| 亚洲免费一级电影| 国自产精品手机在线观看视频| 欧美黄网免费在线观看| 欧美壮男野外gaytube| 高清视频欧美一级| 精品久久久91| 欧美裸体xxxx极品少妇| 亚洲精品97久久| 日韩欧美在线视频日韩欧美在线视频| 欧美性猛交xxxx久久久| 欧美中文在线观看| 91成人国产在线观看| 欧美黑人视频一区| 操日韩av在线电影| 亚洲伊人成综合成人网| 成人免费网站在线看| 亚洲美女性生活视频| 欧美精品情趣视频| 国产精品久久久久久久av电影| www.99久久热国产日韩欧美.com| 日韩中文字幕视频在线| 国产综合久久久久| 久久精品99无色码中文字幕| 欧美亚洲国产成人精品| 成人在线免费观看视视频| 亚洲激情久久久| 国产精品黄色av| 欧美大胆a视频| 国产精品成人一区二区| xxxxxxxxx欧美| 中文字幕日韩电影| 久久激情五月丁香伊人| 中文欧美在线视频| 亚洲激情视频在线观看| 中文字幕亚洲天堂| 国产91色在线免费| 久久99精品国产99久久6尤物| 午夜精品久久久久久久99黑人| 日韩美女视频免费看| 91日本在线视频| 久久人人爽人人爽人人片亚洲| 国产亚洲aⅴaaaaaa毛片| 久久久999国产| 国内精品在线一区| 国产亚洲精品美女久久久| 97在线视频免费看| 国产精品一区二区av影院萌芽| 日韩精品高清在线观看| 中文字幕亚洲欧美日韩在线不卡| 日本成熟性欧美| 欧美一级视频免费在线观看| 国产精品福利无圣光在线一区| 日本久久精品视频| 91探花福利精品国产自产在线| 欧美激情xxxxx| 欧美成人免费视频| 亚洲系列中文字幕| 日韩精品中文在线观看| 国产午夜精品全部视频在线播放| 国产精品日韩欧美| 深夜福利国产精品| 亚洲国产第一页| 亚洲成人黄色网址| 国产成人精品久久久| 91精品视频专区| 国产在线精品一区免费香蕉|