【问题标题】:Make object method code DRY for same events使相同事件的对象方法代码干燥
【发布时间】:2018-04-05 03:30:53
【问题描述】:

所以我有这段代码,其中对象中的方法只是重复每个方法的块。

我如何才能“参数化”该方法,所以只使用一次。

我已经尝试了许多努力将这些方法重写为一个带有“模式”参数的可重用块,但根据我输入的内容会得到很多不同的错误

代码如下:

function applyRegexValidation(){
    validator = {
        email: /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,
        postcode: /^(GIR 0AA)|((([A-PR-UWYZ][0-9][0-9]?)|(([A-PR-UWYZ][A-HK-Y][0-9][0-9]?)|(([A-PR-UWYZ]][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY])))) ?[0-9][ABD-HJLNP-UW-Z]{2})$/i,
        dob: /^(0[1-9]|1\d|2\d|3[01])\/(0[1-9]|1[0-2])\/(19|20)\d{2}$/,
        companyReg: /^[OSCLIPRN]{2}[0-9]{6}|[0-9]{8}$/,
        phone: /^[0-9]{11,18}$/,
        text: /^[a-zA-Z ]*$/
    };

var RegexCheck = {
    email: function () {
        var isEmpty, pattern, result, elem = this.value;
        isEmpty = !elem;
        pattern = validator.email;
        result = pattern.test(elem);
        if (result === false || isEmpty) {
            $(this).closest('div').removeClass('has-success');
            $(this).closest('div').addClass("has-feedback has-error");
            $(this).attr("data-valid", "false");
        }
        else {
            $(this).closest('div').removeClass('has-error');
            $(this).closest('div').addClass("has-feedback has-success");
            $(this).attr("data-valid", "true");
        }
    },
    postcode: function () {
        var isEmpty, pattern, result, elem = this.value;
        isEmpty = !elem;
        pattern = validator.postcode;
        result = pattern.test(elem);
        if (result === false || isEmpty) {
            $(this).closest('div').removeClass('has-success');
            $(this).closest('div').addClass("has-feedback has-error");
            $(this).attr("data-valid", "false");
        }
        else {
            $(this).closest('div').removeClass('has-error');
            $(this).closest('div').addClass("has-feedback has-success");
            $(this).attr("data-valid", "true");
        }
    },
    dob: function () {
        var isEmpty, pattern, result, elem = this.value;
        isEmpty = !elem;
        pattern = validator.dob;
        result = pattern.test(elem);
        if (result === false || isEmpty) {
            $(this).closest('div').removeClass('has-success');
            $(this).closest('div').addClass("has-feedback has-error");
            $(this).attr("data-valid", "false");
        }
        else {
            $(this).closest('div').removeClass('has-error');
            $(this).closest('div').addClass("has-feedback has-success");
            $(this).attr("data-valid", "true");
        }
    },
    companyReg: function () {
        var isEmpty, pattern, result, elem = this.value;
        isEmpty = !elem;
        pattern = validator.companyReg;
        result = pattern.test(elem);
        if (result === false || isEmpty) {
            $(this).closest('div').removeClass('has-success');
            $(this).closest('div').addClass("has-feedback has-error");
            $(this).attr("data-valid", "false");
        }
        else {
            $(this).closest('div').removeClass('has-error');
            $(this).closest('div').addClass("has-feedback has-success");
            $(this).attr("data-valid", "true");
        }
    },
    phone: function () {
        var isEmpty, pattern, result, elem = this.value;
        isEmpty = !elem;
        pattern = validator.phone;
        result = pattern.test(elem);
        if (result === false || isEmpty) {
            $(this).closest('div').removeClass('has-success');
            $(this).closest('div').addClass("has-feedback has-error");
            $(this).attr("data-valid", "false");
        }
        else {
            $(this).closest('div').removeClass('has-error');
            $(this).closest('div').addClass("has-feedback has-success");
            $(this).attr("data-valid", "true");
        }
    }
};
$('form [type=email]').on('input blur', RegexCheck.email);
$('form [type=tel]').on('input blur', RegexCheck.phone);

$('form [bf-datatype=dob]').on('input blur', RegexCheck.dob);
$('form [bf-datatype=companyReg]').on('input blur', RegexCheck.companyReg);
$('form [bf-datatype=postcode]').on('input blur', RegexCheck.postcode);
}

【问题讨论】:

  • 是否应该改为进行代码审查?

标签: javascript jquery object methods dry


【解决方案1】:

可能是这样的:

function applyRegexValidation() {
    validator = {
        email: /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,
        postcode: /^(GIR 0AA)|((([A-PR-UWYZ][0-9][0-9]?)|(([A-PR-UWYZ][A-HK-Y][0-9][0-9]?)|(([A-PR-UWYZ]][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY])))) ?[0-9][ABD-HJLNP-UW-Z]{2})$/i,
        dob: /^(0[1-9]|1\d|2\d|3[01])\/(0[1-9]|1[0-2])\/(19|20)\d{2}$/,
        companyReg: /^[OSCLIPRN]{2}[0-9]{6}|[0-9]{8}$/,
        phone: /^[0-9]{11,18}$/,
        text: /^[a-zA-Z ]*$/
    };

    function RegexCheck() {
        var isEmpty, pattern, result, classesToRemove, classesToAdd, dataValid, elem = this.value;
        isEmpty = !elem;
        // "$(this).prop('type')" works for 'type=*', for the 'bf-datatype=*' find a way to get a key to search in 'validator'
        pattern = validator[$(this).prop('type')];
        result = pattern.test(elem);
        dataValid = (result !== false && !isEmpty);

        classesToRemove = dataValid ? 'has-error' : 'has-success';
        classesToAdd = dataValid ? 'has-feedback has-success' : 'has-feedback has-error';

        $(this).closest('div')
            .removeClass(classesToRemove)
            .addClass(classesToAdd)
            .attr("data-valid", dataValid);
    }

    $('form').on('input blur', RegexCheck);
}

【讨论】:

  • 完美!我只需将 .prop 更改为 .attr,但我看到了你所做的,而我自己却看不到。非常感谢:)
猜你喜欢
  • 1970-01-01
  • 2014-01-15
  • 2019-01-26
  • 1970-01-01
  • 1970-01-01
  • 2014-12-13
  • 1970-01-01
  • 1970-01-01
  • 2013-09-16
相关资源
最近更新 更多