Настроить JQ Validate для принятия URL-адреса без http://префикса

57
4

Я использую Jquery Validate, и мне нужен специальный метод проверки.

Метод URL по умолчанию не принимает URL-адрес, если у него нет схемы. Мои пользователи будут предоставлять только URL-адрес, начинающийся с http://, поэтому я бы не стал их путать, набирая его каждый раз.

Я пытаюсь создать метод проверки, который будет использовать метод URL по умолчанию, чтобы проверить правильность URL-адреса. Если это не удается, я хочу добавить http://и запустить его снова. Вот что у меня есть до сих пор:

addCustomUrlValidator: function () {
$.validator.addMethod("short-url", function(value, element) {

if (value.length == 0) return true; // the field is optional

// attempt to validate with default URL method. Return true on valid.
// ...

// prepend http:// to value and attempt validation again. Return true on valid.
// ...

return false

}, jQuery.validator.format("Must be a valid URL format"));
}

спросил(а) 2015-04-01T08:26:00+03:00 4 года, 9 месяцев назад
1
Решение
47

Я использую Jquery Validate, и мне нужен специальный метод проверки.

См. .addMethod() метода .addMethod() для того, как мы это делаем.

Метод URL по умолчанию не принимает URL-адрес, если у него нет схемы. Мои пользователи будут предоставлять только URL-адрес, начинающийся с http://, поэтому я бы не стал их путать, набирая его каждый раз.

Я скопировал эту функцию из метода url по умолчанию внутри плагина и отредактировал регулярное выражение так, чтобы вам не нужна схема URI. (Я просто удалил (https?|s?ftp):\/\/ часть регулярного выражения.) Обратите внимание, что это новое правило называется my_url, и вы можете изменить его на все, что захотите.

jQuery.validator.addMethod('my_url', function( value, element ) {
// contributed by Scott Gonzalez: http://projects.scottsplayground.com/iri/
return this.optional( element ) || /^(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([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])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test( value );
}, 'Please enter a valid url without the "http".');

Если это не удается, я хочу добавить http:// и запустить его снова.

Манипулирование данными - это то, что вы должны делать на стороне сервера после отправки формы. Вы должны возвращать true или false из пользовательского метода, а не манипулировать любыми данными и программно заставлять одни и те же данные через одно и то же правило несколько раз. Либо пользователь ввел правильный формат, либо он не... пользователь затем повторяет попытку.

ответил(а) 2015-04-24T18:49:00+03:00 4 года, 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема