Объединение методов проверки в плагине проверки jQuery с "или" вместо "и" - PullRequest
2 голосов
/ 29 июня 2010

В плагине jQuery Validation есть несколько методов, которые делают одно и то же, но для разных локалей, например, dateISO и dateDE, которые оба проверяют форматирование даты. Как мне скомбинировать их так, чтобы элемент ввода принимал либо ?

Допустим, у меня есть <input type="text" name="dateInput" id="dateInput" /> в моей форме, и я хочу, чтобы пользователи могли вводить только даты в этом поле. Однако я хочу разрешить использование нескольких различных форматов даты - например, пользователь должен иметь возможность ввести или дату ISO или дату в формате, соответствующем немецким правилам даты. *

Если я сделаю

rules: { dateInput: { required: true, dateISO: true, dateDE: true } }

форма никогда не будет действительной, поскольку оба формата даты будут обязательными, и это требование никогда не будет выполнено. Есть ли способ объединить их как «или», а не как «и», без необходимости писать собственный метод проверки?

И если я должен написать свой собственный, как мне сделать его как можно более общим?

Ответы [ 2 ]

5 голосов
/ 29 июня 2010

Хотя вы можете комбинировать регулярные выражения, как это делает Рейгель, вы также можете просто вызывать эти методы напрямую (в случае их изменения!), Например так:

$.validator.addMethod("dateISODE", function(value, element) { 
    return $.validator.methods.dateISO.apply(this, arguments) 
        || $.validator.methods.date.apply(this, arguments); 
}, "Please enter a valid ISO or German date");

Теперь у меня есть date вместо dateDE здесь, потому что в более новых версиях плагина dateDE был удален . Теперь он находится в файле локализации , который просто переопределяет метод date. Если вы используете старую версию, это нормально, просто придерживайтесь dateDE.

Вы можете попробовать демо здесь


Обновление для комментариев: Более общая форма будет выглядеть следующим образом:

$.validator.addMethod("oneOf", function(value, element, params) {
  for(p in params) {
    if(params.hasOwnProperty(p) && 
       $.validator.methods[p].apply(this, [value, element, params[p]]))
      return true;
  }
  return false;
}, "Please enter a valid date");

Правила будут выглядеть так:

$("form").validate({
  rules: {
    dateFieldName: { oneOf: { dateISO:true, date:true } }
  }
});

Вы можете попробовать демо здесь , для этого нужно любое количество функций валидатора и их запуск, по крайней мере, один должен вернуть true, чтобы это было успешно.

0 голосов
/ 29 июня 2010
dateISO: function(value, element) {
     return this.optional(element) || /^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(value);
},
dateDE: function(value, element) {
     return this.optional(element) || /^\d\d?\.\d\d?\.\d\d\d?\d?$/.test(value);
}

источник

давайте скомбинируем ...:)

jQuery.validator.addMethod("dateISOorDE", function(value, element) { 
    return this.optional(element) || /^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(value) || /^\d\d?\.\d\d?\.\d\d\d?\d?$/.test(value); 
}, "Please specify the correct date");
...