1. 程式人生 > >jquery表單驗證外掛

jquery表單驗證外掛

jquery表單驗證外掛

	 <form id="submit_form" action="/" method="post">
<input name="headPersonPhone" class="easyui-textbox" data-options="required:true,validType:['telOrMobile','maxLength[11]']" style="width: 285px;" >
     </form>
var $submit_form = $("#submit_form");

    $("#btnAdd").click(function () {
        if ($submit_form.form("validate")) {
            var url = "security/installtrain/add";
            if (key && key != ""){
                url = "security/installtrain/upd";
            }
            var flag=true;
            var paras = $submit_form.serialize();
            if(flag){
                $.post(url, paras, function (data) {
                    if (data.code == 0) {
                        if(data.data != null) {
                            key = data.data["trainId"];
                            $("input[name='trainId']").val(key);
                        }
                        $Core.UI.message.success("儲存成功!");
                        //關閉視窗
                    }
                    else {
                        $Core.UI.message.error(data.msg);
                    }
                });
           	    $('#btnAdd').attr('disabled',"true");
                flag = false;
            }
        }
    });




(function ($) { /*** 統一設定datagrid 的一些預設引數*/

   var rules = {
        //  只允許輸入英文字母或數字
        engNum: {
            validator: function (value) {
                return /^[0-9a-zA-Z]*$/.test(value);
            },
            message: '請輸入英文字母或數字'
        },
        //  只允許漢字、英文字母或數字
        chsEngNum: {
            validator: function (value, param) {
                return /^([\u4E00-\uFA29]|[\uE7C7-\uE7F3]|[a-zA-Z0-9])*$/.test(value);
            },
            message: '只允許漢字、英文字母或數字。'
        },
        //  只允許漢字、英文字母、數字及下劃線
        code: {
            validator: function (value, param) {
                return /^[\u0391-\uFFE5\w]+$/.test(value);
            },
            message: '只允許漢字、英文字母、數字及下劃線.'
        },
        //  驗證是否為合法的使用者名稱
        name: {
            validator: function (value) { return value.isUserName(); },
            message: "使用者名稱不合法(字母開頭,允許6-16位元組,允許字母數字下劃線)"
        },
        //  指定字元最小長度
        minLength: {
            validator: function (value, param) { return $.string.trim(value).length >= param[0]; },
            message: "最少輸入 {0} 個字元."
        },
        //  指定字元最大長度
        maxLength: {
            validator: function (value, param) { return $.string.trim(value).length <= param[0]; },
            message: "最多輸入 {0} 個字元."
        },
        //  必須包含指定的內容
        contains: {
            validator: function (value, param) { return $.string.contains(value, param[0]); },
            message: "輸入的內容必須包含 {0}."
        },
        //  以指定的字元開頭
        startsWith: {
            validator: function (value, param) { return $.string.startsWith(value, param[0]); },
            message: "輸入的內容必須以 {0} 作為起始字元."
        },
        //  以指定的字元結束
        endsWith: {
            validator: function (value, param) { return $.string.endsWith(value, param[0]); },
            message: "輸入的內容必須以 {0} 作為起始字元."
        },
        //  長日期時間(yyyy-MM-dd hh:mm:ss)格式
        longDate: {
            validator: function (value) { return $.string.isLongDate(value); },
            message: "輸入的內容必須是長日期時間(yyyy-MM-dd hh:mm:ss)格式."
        },
        //  短日期(yyyy-MM-dd)格式
        shortDate: {
            validator: function (value) { return $.string.isShortDate(value); },
            message: "輸入的內容必須是短日期(yyyy-MM-dd)格式."
        },
        //  長日期時間(yyyy-MM-dd hh:mm:ss)或短日期(yyyy-MM-dd)格式
        date: {
            validator: function (value) { return $.string.isDate(value); },
            message: "輸入的內容必須是長日期時間(yyyy-MM-dd hh:mm:ss)或短日期(yyyy-MM-dd)格式."
        },
        //  電話號碼(中國)格式
        tel: {
            validator: function (value) { return $.string.isTel(value); },
            message: "輸入的內容必須是電話號碼(中國)格式."
        },
        //  行動電話號碼(中國)格式
        mobile: {
            validator: function (value) { return $.string.isMobile(value); },
            message: "輸入的內容必須是行動電話號碼(中國)格式."
        },
        //  電話號碼(中國)或行動電話號碼(中國)格式
        telOrMobile: {
            validator: function (value) { return $.string.isTelOrMobile(value); },
            message: "輸入的內容必須是電話號碼(中國)或行動電話號碼(中國)格式."
        },
        //  傳真號碼(中國)格式
        fax: {
            validator: function (value) { return $.string.isFax(value); },
            message: "輸入的內容必須是傳真號碼(中國)格式."
        },
        //  郵政編碼(中國)格式
        zipCode: {
            validator: function (value) { return $.string.isZipCode(value); },
            message: "輸入的內容必須是郵政編碼(中國)格式."
        },
        //  必須包含中文漢字
        existChinese: {
            validator: function (value) { return $.string.existChinese(value); },
            message: "輸入的內容必須是包含中文漢字."
        },
        //  必須是純中文漢字
        chinese: {
            validator: function (value) { return $.string.isChinese(value); },
            message: "輸入的內容必須是純中文漢字."
        },
        //  必須是純英文字母
        english: {
            validator: function (value) { return $.string.isEnglish(value); },
            message: "輸入的內容必須是純英文字母."
        },
        //  必須是合法的檔名(不能包含字元 \\/:*?\"<>|)
        fileName: {
            validator: function (value) { return $.string.isFileName(value); },
            message: "輸入的內容必須是合法的檔名(不能包含字元 \\/:*?\"<>|)."
        },
        //  必須是正確的 IP地址v4 格式
        ip: {
            validator: function (value) { return $.string.isIPv4(value); },
            message: "輸入的內容必須是正確的 IP地址v4 格式."
        },
        //  必須是正確的 url 格式
        url: {
            validator: function (value) { return $.string.isUrl(value); },
            message: "輸入的內容必須是正確的 url 格式."
        },
        //  必須是正確的 IP地址v4 或 url 格式
        ipurl: {
            validator: function (value) { return $.string.isUrlOrIPv4(value); },
            message: "輸入的內容必須是正確的 IP地址v4 或 url 格式."
        },
        //  必須是正確的貨幣金額(阿拉伯數字表示法)格式
        currency: {
            validator: function (value) { return $.string.isCurrency(value); },
            message: "輸入的內容必須是正確的貨幣金額(阿拉伯數字表示法)格式."
        },
        //  必須是正確 QQ 號碼格式
        qq: {
            validator: function (value) { return $.string.isQQ(value); },
            message: "輸入的內容必須是正確 QQ 號碼格式."
        },
        //  必須是正確 MSN 賬戶名格式
        msn: {
            validator: function (value) { return $.string.isMSN(value); },
            message: "輸入的內容必須是正確 MSN 賬戶名格式."
        },
        unNormal: {
            validator: function (value) { return $.string.isUnNormal(value); },
            message: "輸入的內容必須是不包含空格和非法字元Z."
        },
        //  必須是合法的汽車車牌號碼格式
        carNo: {
            validator: function (value) { return $.string.isCarNo(value); },
            message: "輸入的內容必須是合法的汽車車牌號碼格式."
        },
        //  必須是合法的汽車發動機序列號格式
        carEngineNo: {
            validator: function (value) { return $.string.isCarEngineNo(value); },
            message: "輸入的內容必須是合法的汽車發動機序列號格式."
        },
        //  必須是合法的身份證號碼(中國)格式
        idCard: {
            validator: function (value) { return $.string.isIDCard(value); },
            message: "輸入的內容必須是合法的身份證號碼(中國)格式."
        },
        //  必須是合法的整數格式
        integer: {
            validator: function (value) { return $.string.isInteger(value); },
            message: "輸入的內容必須是合法的整數格式."
        },
        //  必須是合法的整數格式且值介於 {0} 與 {1} 之間
        integerRange: {
            validator: function (value, param) {
                return $.string.isInteger(value) &&
                    ((param[0] || value >= param[0]) && (param[1] || value <= param[1]));
            },
            message: "輸入的內容必須是合法的整數格式且值介於 {0} 與 {1} 之間."
        },
        //  必須是指定型別的數字格式
        numeric: {
            validator: function (value, param) { return $.string.isNumeric(value, param ? param[0] : undefined); },
            message: "輸入的內容必須是指定型別的數字格式."
        },
        //  必須是指定型別的數字格式且介於 {0} 與 {1} 之間
        numericRange: {
            validator: function (value, param) {
                return $.string.isNumeric(value, param ? param[2] : undefined) &&
                    ((param[0] || value >= param[0]) && (param[1] || value <= param[1]));
            },
            message: "輸入的內容必須是指定型別的數字格式且介於 {0} 與 {1} 之間."
        },
        //  必須是正確的 顏色(#FFFFFF形式) 格式
        color: {
            validator: function (value) { return $.string.isColor(value); },
            message: "輸入的內容必須是正確的 顏色(#FFFFFF形式) 格式."
        },
        //  必須是安全的密碼字元(由字元和數字組成,至少 6 位)格式
        password: {
            validator: function (value) { return $.string.isSafePassword(value); },
            message: "輸入的內容必須是安全的密碼字元(由字元和數字組成,至少 6 位)格式."
        },
        //  輸入的字元必須是指定的內容相同
        equals: {
            validator: function (value, param) {
                var val = param[0], type = param[1];
                if (type) {
                    switch (String(type).toLowerCase()) {
                        case "jquery":
                        case "dom":
                            val = $(val).val();
                            break;
                        case "id":
                            val = $("#" + val).val();
                            break;
                        case "string":
                        default:
                            break;
                    }
                }
                return value === val;
            },
            message: "輸入的內容不匹配."
        },
        // 時間驗證
        //@author ren
        /* start */
        endToStart: {
            validator: function (value, param) {
                return value > $("#" + param[0] + " input[name='" + param[1] + "']").val(); //結束時間>開始時間
            },
            message: '結束時間應晚於起始時間'
        }
    };
    $.extend($.fn.validatebox.defaults.rules, rules);
})(jQuery);
(function (window, $, undefined) {

//  定義 字串物件(String) 擴充套件物件基元
coreString = function () { return String.apply(this, arguments); },

coreString.fn = coreString.prototype = {};

coreNullable.String = new String();

//  定義 jQuery 擴充套件物件基元
coreJquery = function () { return $.apply(this, arguments); },

coreJquery.fn = coreJquery.prototype = {};

coreJquery.string = coreString;


    //  判斷傳入的物件是否是一個字串。
    coreString.isString = coreUtil.isString;

    //  判斷傳入的字串是否為Null或者為空字串。
    coreString.isNullOrEmpty = function (str) { return str === undefined || str === null || str === ""; };
    coreString.prototype.isNullOrEmpty = function () { return coreString.isNullOrEmpty(this); };

    //  判斷傳入的字串是否為Null或者為空字串或者全是空格。
    coreString.isNullOrWhiteSpace = function (str) { return coreString.isNullOrEmpty(str) || coreString.trim(String(str)) === ""; };
    coreString.prototype.isNullOrWhiteSpace = function () { return coreString.isNullOrWhiteSpace(this); };

    //  判斷傳入的字串是否為 HTML 程式碼段。
    coreString.isHtmlText = function (str) {
        str = coreString.isNullOrEmpty(str) ? "" : String(str);
        return str.length >= 3 && str.charAt(0) === "<" && str.charAt(str.length - 1) === ">";
    };
    coreString.prototype.isHtmlText = function () { return coreString.isHtmlText(this); };

    //  用新字串替換與給定字串匹配的所有子串;該方法將返回源字串處理後的一個副本,而不會改變源字串的值。
    coreString.replaceAll = function (str, substr, replacement, ignoreCase) {
        if (!substr || substr == replacement) { return str; }
        //var regexp = coreUtil.isRegExp(substr) ? substr : new RegExp(String(substr), ignoreCase ? "gm" : "igm");
        //return str.replace(regexp, replacement);
        str = coreString.isNullOrEmpty(str) ? "" : String(str);
        var length = str.length, i = 0;
        while (str.indexOf(substr) > -1 && i++ < length) { str = str.replace(substr, replacement); }
        return str;
    };
    coreString.prototype.replaceAll = function (substr, replacement) { return coreString.replaceAll(this, substr, replacement); };

    //  格式化字串,類似於 .NET 中的 string.format 函式功能
    //  使用方法:coreString.format('字串{0}字串{1}字串','第一個變數','第二個變數','第三個變數', ...'第 N 個變數');
    //  該方法將返回源字串處理後的一個副本,而不會改變源字串的值。
    coreString.format = function (str, arg1, arg2, arg3, argn) {
        str = coreString.isNullOrEmpty(str) ? "" : String(str);
        var isArray = coreUtil.likeArray(arg1),
            data = (isArray && !coreUtil.isString(arg1)) || coreUtil.isObject(arg1) ? arg1 : coreArray.range(arguments, 1);
        if (isArray) {
            for (var i = 0; i < data.length; i++) {
                value = data[i] ? data[i] : "";
                str = str.replace(new RegExp("\\{" + i + "}", "gm"), value);
            }
        } else {
            for (var key in data) {
                var value = proxy.call(data, key);
                value = (value == null || value == undefined) ? "" : value;
                str = str.replace(new RegExp("\\{" + key + "}", "gm"), value);
            }
        }
        function proxy(key) { try { return eval("this[\"" + key + "\"]"); } catch (ex) { return ""; } }
        return str;
    };
    coreString.prototype.format = function (arg1, arg2, arg3, argn) {
        arguments = coreArray.insert(arguments, 0, this);
        return coreString.format.apply(this, arguments);
    };

    //  獲取字串包含非 ASCII 碼字元(例如中文、日文、俄文等)的 byte 位元組長度。
    coreString.getByteLen = function (str) {
        str = coreString.isNullOrEmpty(str) ? "" : String(str);
        var bytelen = 0, i = 0, length = str.length, cc = document.charset;
        if (!cc) { cc = "utf-8"; }
        cc = cc.toLowerCase();
        var s = cc == "iso-8859-1" ? 5 : 2;
        for (; i < length; i++) {
            bytelen += str.charCodeAt(i) > 255 ? s : 1;
        }
        return bytelen;
    };
    coreString.prototype.getByteLen = function () { return coreString.getByteLen(this); };

    //  判斷當前字串物件是否包含指定的字串內容。
    coreString.contains = function (str, val) {
        str = coreString.isNullOrEmpty(str) ? "" : String(str);
        return String(str).indexOf(val) > -1;
    };
    coreString.prototype.contains = function (val) { return coreString.contains(this, val); };

    //  字串反轉;該方法將返回源字串處理後的一個副本,而不會改變源字串的值。
    coreString.reverse = function (str) {
        var charArray = [];
        str = coreString.isNullOrEmpty(str) ? "" : String(str);
        for (var i = str.length - 1; i > -1; i--) { charArray.push(str[i]); }
        return charArray.join("");
    };
    coreString.prototype.reverse = function () { return coreString.reverse(this); };

    //  去除字串左邊的空格;該方法將返回源字串處理後的一個副本,而不會改變源字串的值。
    coreString.ltrim = function (str) {
        str = coreString.isNullOrEmpty(str) ? "" : String(str);
        return str.replace(/(^\s*)/g, "");
    };
    coreString.prototype.ltrim = function () { return coreString.ltrim(this); };

    //  去除字串右邊的空格;該方法將返回源字串處理後的一個副本,而不會改變源字串的值。
    coreString.rtrim = function () {
        str = coreString.isNullOrEmpty(str) ? "" : String(str);
        return str.replace(/(\s*$)/g, "");
    };
    coreString.prototype.rtrim = function () { return coreString.rtrim(this); };

    //  去除字串左右兩邊的空格;該方法將返回源字串處理後的一個副本,而不會改變源字串的值。
    coreString.trim = coreString.trim ? coreString.trim : coreUtil.trim;
    coreString.prototype.trim = function () { return coreString.trim(this); };

    //  返回一個新字串,該字串通過在此例項中的字元左側填充空格或指定字元來來達到指定的總長度,從而使這些字元右對齊。
    coreString.padLeft = function (str, len, paddingChar) {
        str = coreString.isNullOrEmpty(str) ? "" : String(str);
        paddingChar = coreString.isNullOrEmpty(paddingChar) || !paddingChar.length ? " " : paddingChar;
        len = coreUtil.isNumeric(len) ? len : str.length;
        if (str.length < len) { for (; str.length < len; str = paddingChar + str) { } }
        return str;
    };
    coreString.prototype.padLeft = function (len, paddingChar) { return coreString.padLeft(this, len, paddingChar); };

    //  返回一個新字串,該字串通過在此字串中的字元右側填充空格或指定字元來達到指定的總長度,從而使這些字元左對齊
    coreString.padRight = function (str, len, paddingChar) {
        str = coreString.isNullOrEmpty(str) ? "" : String(str);
        paddingChar = coreString.isNullOrEmpty(paddingChar) || !paddingChar.length ? " " : paddingChar;
        len = coreUtil.isNumeric(len) ? len : str.length;
        if (str.length < len) { for (; str.length < len; str += paddingChar) { } }
        return str;
    };
    coreString.prototype.padRight = function (len, paddingChar) { return coreString.padRight(this, len, paddingChar); };

    //  返回字串中的的字元,注意從 0 開始。
    coreString.mid = function (str, start, len) {
        if (!start) { start = 0; }
        if (!len) { len = 0; }
        str = coreString.isNullOrEmpty(str) ? "" : String(str);
        return str.substr(start, len);
    };
    coreString.prototype.mid = function (start, len) { return coreString.mid(this, start, len); };

    //  計算字串的列印長度。
    coreString.lengthOfPrint = function (str) {
        str = coreString.isNullOrEmpty(str) ? "" : String(str);
        return str.replace(/[^\x00-\xff]/g, "**").length;
    };
    coreString.prototype.lengthOfPrint = function () { return coreString.lengthOfPrint(this); };

    //  判斷當前 String 物件是否以指定的字串開頭。
    coreString.startsWith = function (str, val) {
        str = coreString.isNullOrEmpty(str) ? "" : String(str);
        return str.substr(0, val.length) == val;
    };
    coreString.prototype.startsWith = function (val) { return coreString.startsWith(this, val); };

    //  判斷當前 String 物件是否以指定的字串結尾。
    coreString.endsWith = function (str, val) {
        str = coreString.isNullOrEmpty(str) ? "" : String(str);
        return str.substr(str.length - val.length) == val;
    };
    coreString.prototype.endsWith = function (val) { return coreString.endsWith(this, val); };

    //  擷取當前字串左邊的指定長度內容。
    coreString.left = function (str, len) {
        str = coreString.isNullOrEmpty(str) ? "" : String(str);
        if (!coreUtil.isNumeric(len)) { len = parseInt(len, 10); }
        if (len < 0 || len > str.length) { len = str.length; }
        return str.substr(0, len);
    };
    coreString.prototype.left = function (len) { return coreString.left(this, len); };

    //  擷取當前字串右邊的指定長度內容。
    coreString.right = function (str, len) {
        str = coreString.isNullOrEmpty(str) ? "" : String(str);
        if (!coreUtil.isNumeric(len)) { len = parseInt(len, 10); }
        if (len < 0 || len > str.length) { len = str.length; }
        return str.substring(str.length - len, str.length);
    };
    coreString.prototype.right = function (len) { return coreString.right(this, len); };

    //  擷取當前字串左邊的指定位元組長度內容。
    coreString.leftBytes = function (str, len) {
        str = coreString.isNullOrEmpty(str) ? "" : String(str);
        if (!coreUtil.isNumeric(len)) { len = parseInt(len, 10); }
        var length = coreString.getByteLen(str), i = 0, bytelen = 0, cc = document.charset;
        if (!cc) { cc = "utf-8"; }
        cc = cc.toLowerCase();
        var s = cc == "iso-8859-1" ? 5 : 2;
        if (len < 0 || len > length) { len = length; }
        for (; i < str.length; i++) {
            bytelen += str.charCodeAt(i) > 255 ? s : 1;
            if (bytelen == len) { break; }
            if (bytelen > len) { i--; break; }
        }
        return coreString.left(str, i + 1);
    };
    coreString.prototype.leftBytes = function (len) { return coreString.leftBytes(this, len); };

    //  擷取當前字串右邊的指定位元組長度內容。
    coreString.rightBytes = function (str, len) {
        str = coreString.isNullOrEmpty(str) ? "" : String(str);
        if (!coreUtil.isNumeric(len)) { len = parseInt(len, 10); }
        var length = coreString.getByteLen(str), i = 0, bytelen = 0, cc = document.charset;
        if (!cc) { cc = "utf-8"; }
        cc = cc.toLowerCase();
        var s = cc == "iso-8859-1" ? 5 : 2;
        if (len < 0 || len > length) { len = length; }
        for (; i < str.length; i++) {
            bytelen += str.charCodeAt(str.length - 1 - i) > 255 ? s : 1;
            if (bytelen == len) { break; }
            if (bytelen > len) { i--; break; }
        }
        return coreString.right(str, i + 1);
    };
    coreString.prototype.rightBytes = function (len) { return coreString.rightBytes(this, len); };

    //  判斷當前 String 物件是否是正確的長日期格式。
    coreString.isLongDate = function (str) {
        str = coreString.isNullOrEmpty(str) ? "" : String(str);
        var r = str.replace(/(^\s*)|(\s*$)/g, "").match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/);
        if (r == null) { return false; }
        var d = new Date(r[1], r[3] - 1, r[4], r[5], r[6], r[7]);
        return (d.getFullYear() == r[1] && (d.getMonth() + 1) == r[3] && d.getDate() == r[4] && d.getHours() == r[5] && d.getMinutes() == r[6] && d.getSeconds() == r[7]);
    };
    coreString.prototype.isLongDate = function () { return coreString.isLongDate(this); };

    //  判斷當前 String 物件是否是正確的段日期格式。
    coreString.isShortDate = function (str) {
        str = coreString.isNullOrEmpty(str) ? "" : String(str);
        var r = str.replace(/(^\s*)|(\s*$)/g, "").match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/);
        if (r == null) { return false; }
        var d = new Date(r[1], r[3] - 1, r[4]);
        return (d.getFullYear() == r[1] && (d.getMonth() + 1) == r[3] && d.getDate() == r[4]);
    };
    coreString.prototype.isShortDate = function () { return coreString.isShortDate(this); };

    //  判斷當前 String 物件是否是正確的日期格式。
    coreString.isDate = function (str) {
        return coreString.isLongDate(str) || coreString.isShortDate(str);
    };
    coreString.prototype.isDate = function () { return coreString.isDate(this); };

    //  判斷當前 String 物件是否是正確的電話號碼格式(中國)。
    coreString.isTel = function (str) {
        str = coreString.isNullOrEmpty(str) ? "" : String(str);
        return /^((\(\d{2,3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$/i.test(str);
    };
    coreString.prototype.isTel = function () { return coreString.isTel(this); };

    //  判斷當前 String 物件是否是正確的手機號碼格式(中國)。
    coreString.isMobile = function (str) {
        str = coreString.isNullOrEmpty(str) ? "" : String(str);
        return /^(13|14|15|17|18)\d{9}$/i.test(str);
    };
    coreString.prototype.isMobile = function () { return coreString.isMobile(this); };

    //  判斷當前 String 物件是否是正確的電話號碼或者手機號碼格式(中國)
    coreString.isTelOrMobile = function (str) {
        return coreString.isTel(str) || coreString.isMobile(str);
    };
    coreString.prototype.isTelOrMobile = function () { return coreString.isTelOrMobile(this); };

    //  判斷當前 String 物件是否是正確的傳真號碼格式
    coreString.isFax = function (str) {
        str = coreString.isNullOrEmpty(str) ? "" : String(str);
        return /^((\(\d{2,3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$/i.test(str);
    };
    coreString.prototype.isFax = function () { return coreString.isFax(this); };

    //  判斷當前 String 物件是否是正確的 電子郵箱地址(Email) 格式。
    coreString.isEmail = function (str) {
        str = coreString.isNullOrEmpty(str) ? "" : String(str);
        return /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(str);
    };

})(window, jQuery);