Отключить проверку элементов формы HTML5

337

В моих формах я хотел бы использовать новые типы форм HTML5, например <input type="url" /> (больше информации о типах здесь).

Проблема заключается в том, что Chrome хочет быть очень полезным и проверять эти элементы для меня, за исключением того, что он засасывает его. Если он не выполняет встроенную проверку, нет никакого сообщения или указания, кроме элемента, получающего фокус. Я предварительно заполняю элементы URL с помощью "http://", поэтому моя собственная проверка проверяет только эти значения как пустые строки, однако Chrome отклоняет это. Если бы я мог изменить свои правила проверки, это тоже сработало бы.

Я знаю, что могу просто вернуться к использованию type="text", но я хочу, чтобы улучшенные улучшения использовались в этих новых типах предложений (например: он автоматически переключается на пользовательскую раскладку клавиатуры на мобильных устройствах):

Изображение 365

Итак, есть способ отключить или настроить автоматическую проверку?

  • 7
    inputmode спецификация HTML 5.1 упоминает атрибут inputmode , который - если я правильно понимаю, что я прочитал - может использоваться для указания того, какой тип клавиатуры следует предлагать пользователю при взаимодействии с полем, без каких-либо правил валидации. В какой-то момент в будущем использование атрибута inputmode вместо атрибута type , вероятно, будет правильным решением этой проблемы, но пока нет.
  • 0
    @MarkAmery Несмотря на то, что не было бы слишком трудно получить будущее сейчас: $('[inputmode]').each(function () { this.attr({type: this.attr('inputmode'), novalidate: true}) });
Показать ещё 3 комментария
Теги:
validation
forms
input

9 ответов

646
Лучший ответ

Если вы хотите отключить проверку на стороне клиента для формы в HTML5, добавьте атрибут novalidate в элемент формы. Пример:

<form method="post" action="/foo" novalidate>...</form>

См. http://www.w3.org/TR/html5/forms.html#attr-fs-novalidate

  • 78
    novalidate="novalidate" и novalidate="" является допустимым синтаксисом.
  • 6
    @bassim Правильный синтаксис, но слишком многословный - зачем печатать больше, чем нужно?
Показать ещё 11 комментариев
27

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

Я использую jquery с этим HTML.

// suppress "invalid" events on URL inputs
$('input[type="url"]').bind('invalid', function() {
  alert('invalid');
  return false;
});

document.forms[0].onsubmit = function () {
  alert('form submitted');
};
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form>
  <input type="url" value="http://" />
  <button type="submit">Submit</button>
</form>

Я не тестировал это в других браузерах.

  • 0
    Отлично - завтра попробую и дам знать, как все будет. Благодарю.
  • 0
    Вот Это Да! Мне было очень тяжело смотреть, куда пропало мое событие отправки. Спасибо, сэр!
Показать ещё 4 комментария
16

Я просто хотел добавить, что использование атрибута novalidate в вашей форме будет препятствовать отправке браузером формы. Браузер по-прежнему оценивает данные и добавляет: действительные и: недопустимые псевдоклассы.

Я нашел это, потому что допустимые и недопустимые псевдоклассы являются частью таблицы стилей HTML5, которую я использовал. Я просто удалил записи в файле CSS, связанные с псевдоклассами. Если кто-нибудь найдет другое решение, сообщите мне.

  • 0
    Как назывались записи?
  • 0
    Ха-ха - я не знаю больше извините. Это было 3 года назад. :(
Показать ещё 1 комментарий
12

Вместо того, чтобы пытаться завершить проверку браузера, вы можете поместить http:// в качестве текста-заполнителя. Это с самой страницы, которую вы связали:

Текст заполнителя

Первым улучшением HTML5 в веб-формах является возможность установки текста заполнителя в поле ввода. Текст-заполнитель отображается внутри поля ввода, пока поле пусто и не сфокусировано. Как только вы нажмете (или вкладку) на поле ввода, текст заполнителя исчезнет.

Вероятно, вы видели текст заполнителя раньше. Например, Mozilla Firefox 3.5 теперь содержит текст заполнителя в строке местоположения, в которой говорится "Поиск в закладках и истории":

Изображение 5026

Когда вы нажимаете (или на табуляцию) на строку местоположения, текст-заполнитель исчезает:

Изображение 5027

Как ни странно, Firefox 3.5 не поддерживает добавление текста-заполнителя в собственные веб-формы. Cest la vie.

Поддержка держателя

IE  FIREFOX SAFARI  CHROME  OPERA   IPHONE  ANDROID
·   3.7+    4.0+    4.0+    ·       ·       ·

Вот как вы можете включить текст заполнителя в свои собственные веб-формы:

<form>
  <input name="q" placeholder="Search Bookmarks and History">
  <input type="submit" value="Search">
</form>

Браузеры, которые не поддерживают атрибут placeholder, просто игнорируют его. Нет вреда, не фол. Посмотрите, поддерживает ли ваш браузер текст заполнителя.

Это было бы не совсем то же самое, поскольку он не обеспечивал бы эту "отправную точку" для пользователя, но, по крайней мере, на полпути.

  • 3
    +1 за совет, но это не будет решением для меня, к сожалению. Я до сих пор не хочу никакой проверки, главным образом потому, что UX для него так беден.
9

Лучшим решением является использование текстового ввода и добавление атрибута inputmode = "url" для предоставления возможностей клавиатуры. Для этой цели была разработана спецификация HTML5. Если вы сохраните type = "url" , вы получите проверку синтаксиса, которая не полезна в каждом случае (лучше проверить, возвращает ли она ошибку 404 вместо синтаксиса, который является довольно разрешительным и не очень помогает).

У вас также есть возможность переопределить шаблон по умолчанию с шаблоном атрибута = "https?://.+", например, чтобы быть более разрешительным.

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

Использование jQuery для отключения проверки также является плохим решением, поскольку оно должно работать без JavaScript.

В моем случае я помещаю элемент select с двумя параметрами (http://или https://) до ввода URL-адреса, потому что мне нужны только сайты (и нет ftp://или другие вещи). Таким образом, я избегаю вводить этот странный префикс (самое большое сожаление Тима Бернерса-Ли и, возможно, главный источник ошибок синтаксиса URL-адреса), и я использую простой текстовый ввод с inputmode = "url" с заполнителями (без HTTP). Я использую jQuery и серверную сторону script для проверки реального существования веб-сайта (нет 404) и для удаления префикса HTTP, если он вставлен (я не могу использовать шаблон, например pattern = "^ ((? Http).) * $", чтобы предотвратить установку префикса, потому что я считаю, что лучше быть более разрешительным)

7

Я нашел решение для Chrome с CSS следующим селектором, не минуя встроенную форму проверки, которая может быть очень полезной.

form input::-webkit-validation-bubble-message, 
form select::-webkit-validation-bubble-message,
form textarea::-webkit-validation-bubble-message {
    display:none;
} 

Таким образом, вы также можете настроить свое сообщение...

Я получаю решение на этой странице: http://trac.webkit.org/wiki/Styling%20Form%20Controls

  • 0
    это определенно делает свое дело
  • 1
    Это не работает в последней версии Chrome (29), интересно, если это из-за мигания
0

Просто используйте novalidate в своей форме.

<form name="myForm" role="form" novalidate class="form-horizontal" ng-hide="formMain">

Ура!!!

0

Вы можете установить простое расширение chrome и просто отключить проверку на лету https://chrome.google.com/webstore/detail/html5-form-validation-err/dcpagcgkpeflhhampddilklcnjdjlmlb/related

по умолчанию все будет работать по умолчанию, но вы сможете отключить проверку html5 одним щелчком мыши по значку расширения на панели инструментов

0

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

window.submittingForm = false;
$('input[novalidate]').bind('invalid', function(e) {
    if(!window.submittingForm){
        window.submittingForm = true;
        $(e.target.form).submit();
        setTimeout(function(){window.submittingForm = false;}, 100);
    }
    e.preventDefault();
    return false;
});

Ещё вопросы

Сообщество Overcoder
Наверх
Меню