Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
<input type="text" name="email" class="js-validate js-validate-email"/>
<input type="text" name="email" data-js-validators='email required'>
function createField() {
var members = new Array('required', 'regexp');
for(var i = 0; i < arguments.length; i++) {
this[members[i]] = arguments[i];
}
}
function createField (required, regexp) {
if (required != null) this.required = required;
if (regexp != null) this.regexp = regexp;
}
createField.prototype.regexp = /^[A-z0-9-_+. ,@]{1,}$/ig;
createField.prototype.valid = false;
createField.prototype.required = true;
createField.prototype.nullify = function() {
this.valid = false;
};
// =>
createField.prototype = {
regexp : /^[A-z0-9-_+. ,@]{1,}$/ig,
valid : false,
required : true,
nullify : function() {
this.valid = false;
}
};
createField
— это ведь класс, который создаётся с помощью оператора new
.var field = createField();
var field = new Field();
new createField
— это тавтология{}
var single = new Array();
single['name'] = ...
var single = {
name : new Field(),
email : new Field(true, /^[A-z0-9._-]+@[A-z0-9.-]+\.[A-z]{2,4}$/),
sex : new Field(true, /male$/ig)
};
single
мне тоже непонятно. Тут, кажется, больше подошло бы userRegistrationForm
Singleton
" — моветон. Вот вы назвали так форму свою. А потом в другом месте у вас ещё один синглтон рулит запросами. Он тоже назовётся Singleton
? А ещё один — рулит вводом с клавиатуры — тоже Singleton
? Три Singleton делают совершенно разные вещи createField.prototype.valid = false;
createField.prototype.required = true;
new Array
и делайте явное объявление входных переменных в функцию :)var Field = function (required, regexp) {
this.required = (typeof required === 'undefined') ? true : !!required;
this.regexp = regexp || /^[A-z0-9-_+. ,@]{1,}$/ig;
this.valid = false;
};
Field.prototype.reset = function () {
this.valid = false;
return this;
};
(typeof required === 'undefined')
отлично заменяется на required == null
. По логике вполне подходит, т.к. если передали null, то хотели сделать значение по-умолчанию. Очень удобно.required == null
не подходит, если бы undefined было бы объявлено в глобальном замыкании как это сделано в jQuery, тогда я бы сделал вот так required === undefined
. Другое дело если мы пропускаем переменную required и у меня будет false, хотя ожидаем true, но для стиля JavaScript это не подходит — лучше переделать конструктор и отправить хэш {regexp: /.*/gi}
в качестве единственного параметра.Опытным путем я заметил, что когда применяется функция RegExp.test(), то сначала она возвращает результат ожидаемый, а потом прямо противоположный.
lastIndex
устанавливается в его позицию и в следующий раз ищется начиная с этой позиции. Если не находится — lastIndex
устанавливается в нуль. Самый простой способ бороться с этим — сбрасывать lastIndex
:var i, log = console.log,
re = /male$/ig,
string = '123male';
log( re.lastIndex ); // 0
log( re.test(string) ); // true
log( re.lastIndex ); // 7
log( re.test(string) ); // false
log( re.lastIndex ); // 0
log( re.test(string) ); // true
log( re.lastIndex ); // 7
re.lastIndex = 0;
log( re.test(string) ); // true
Валидация форм в JavaScript ч.1