将对象发送给带有无参数的函数

时间:2016-03-31 22:02:39

标签: javascript prototype

如何将参数发送给函数。 上面的选项在构造函数中起作用:

selectors[i].onblur = this.validation;

但是如果在函数Valid我调用选择器[i] .validation,上面的解决方案将无效。有人知道,如何用参数调用选择器[i] .validation ??

如有任何帮助,我将非常感激。

链接到演示: http://codepen.io/anon/pen/YqryVr

我的js课程:

var Validator = (function () {
    var errorClassName = "error";
    var selectors;
    var regexMap;
    function Validator(id, regexObject) {      
        if (id === void 0) { id = "form"; }
        regexMap = regexObject.getMap();

        selectors = document.getElementById(id).elements;
        for (i = 0; i < selectors.length; ++i) {   
            selectors[i].onblur = this.validation;
        }
    };

    Validator.prototype.setErrorClassName = function (className) { 
        errorClassName = className;
    };

    Validator.prototype.addClass = function (selector) {
        if(selector.className.indexOf(errorClassName) < 1)
            selector.className += " " + errorClassName;
    };

    Validator.prototype.removeClass = function (selector) {
        selector.className = selector.className.replace(errorClassName, '');
    };


     Validator.prototype.validation = function () { 

        alert('this.type: ' + this.type);

        switch(this.type) {
            case 'textarea':
            case 'text':
                if(this.dataset.regex in regexMap) this.dataset.regex = regexMap[this.dataset.regex];
                var pattern = new RegExp(this.dataset.regex);

                if(this.value.length !== 0 && pattern.test(this.value)) {
                    Validator.prototype.removeClass(this);
                    return true;
                } else {
                    Validator.prototype.addClass(this);
                    return false;
                }
            break;
            case 'select-one':
                if(this.value.length === 0) {
                    Validator.prototype.addClass(this);
                    return false;
                } else { 
                    Validator.prototype.removeClass(this);
                     return true;
                }
            break;    
        }

        return true;
    };

    Validator.prototype.valid = function () {

        for (i = 0; i < selectors.length; ++i) {
           selectors[i].validation;
        }
        return true;
    };
    return Validator;
}());

var SelectorAttribute = (function () {
    function SelectorAttribute(name, regex) {
        this.name = name;
        this.regex = regex;
    }

    SelectorAttribute.prototype.toString = function () {
        return "name: " + this.name + ", regex = " + this.regex;
    };

    return SelectorAttribute;
}());

var StandardRegexPatterns = (function () {
    var map = {};
    function StandardRegexPatterns() {
        map['zip-code-poland'] = '^[0-9]{2}-[0-9]{3}$';
        map['phone-number-poland'] = '^[0-9]{9}$';
        map['digits'] = '^[0-9]+$';
        map['alpha'] = '^[a-zA-z]+$';
        map['email'] = '^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@([a-z0-9_][-a-z0-9_]*(\.[-a-z0-9_]+)*\.(aero|arpa|biz|com|coop|edu|gov|info|int|mil|museum|name|net|org|pro|travel|mobi|[a-z][a-z])|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,5})?';
        map['login'] = '^[a-z0-9_-\.]{3,21}$';
        map['ip-address'] = '^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$';
        map['url-address'] = '^((http[s]?|ftp):\/)?\/?([^:\/\s]+)((\/\w+)*\/)([\w\-\.]+[^#?\s]+)(.*)?(#[\w\-]+)?$';
    }

    StandardRegexPatterns.prototype.getMap = function () {
        return map;
    };

    return StandardRegexPatterns;
}());



$( document ).ready(function() {
    var validator = new Validator('form', new StandardRegexPatterns());
    validator.setErrorClassName("error");


   //var pattern = new StandardRegexPatterns();
   // alert(Object.keys(pattern.getMap()));
    $("button").on('click', function(){
        alert(validator.valid());
      });
});

1 个答案:

答案 0 :(得分:0)

您可以使用以下内容:

functionname.apply(this, [arguments]);

functionname.call(this, argument1, argument2);

如果你没有参数,你可以省略它们。

我通常只是这样做:

funcitonname.apply(this, Arguments);

如果我已经在函数中调用此方法,那么我可以继续functionname()的参数。

Learn more about apply

Learn more about call