Запустити стандартну перевірку HTML5 (форму) без використання кнопки подати?


77

Хто знає, як я можу запустити стандартну перевірку HTML5 у формі, не використовуючи кнопку подати? (JavaScript або jQuery).

Я не хочу надсилати POST/GETзапит, лише виконую перевірку.


Відповіді:


23

Прийнята відповідь на це питання, здається, є тим, що ви шукаєте.

Короткий підсумок: у обробнику подій для надсилання телефонуйте event.preventDefault().


30
Це не вирішило це для мене. Використовуючи Chrome 27, і коли я заважаю за замовчуванням, він також пропускає перевірку HTML5
Еріх

31

Після деяких досліджень я придумав такий код, який повинен бути відповіддю на ваше запитання. (Принаймні це спрацювало у мене)

Спочатку скористайтеся цим фрагментом коду. У $(document).readyпереконується код виконується , коли форма завантажується в DOM:

$(document).ready(function()
{
    $('#theIdOfMyForm').submit(function(event){
        if(!this.checkValidity())
        {
            event.preventDefault();
        }
    });
});

Тоді просто зателефонуйте $('#theIdOfMyForm').submit();своєму коду.

ОНОВЛЕННЯ

Якщо ви дійсно хочете показати, яке поле користувач помилився у формі, додайте наступний код після event.preventDefault();

$('#theIdOfMyForm :input:visible[required="required"]').each(function()
{
    if(!this.validity.valid)
    {
        $(this).focus();
        // break
        return false;
    }
});

Це дасть фокус на першому недійсному введенні.


1
Функція jQuery .each змінилася (?) З моменту розміщення цієї відповіді. Зараз він має дві дещо заплутані перестановки. .Each, використаний вище, більше не працюватиме. Я б використав: var $ list = $ (f) .find (': input: visible [required = "required"]'); $ .each ($ list, function (idx, el) {
jomofrodo

видаліть! з твердження if. Це для мене це порушує.
Нік Рес

23

Ви можете використовувати reportValidity , однак він поки не підтримує браузер. Він працює в Chrome, Opera та Firefox, але не в IE, а також в Edge чи Safari:

var myform = $("#my-form")[0];
if (!myform.checkValidity()) {
    if (myform.reportValidity) {
        myform.reportValidity();
    } else {
        //warn IE users somehow
    }
}

( checkValidity має кращу підтримку, але не працює на IE <10.)


2
Через рік це підтримується в останній версії всіх чотирьох основних браузерів відповідно до Can I Use: caniuse.com/#feat=constraint-validation
Mark Amery

11

Вам потрібно подати форму, щоб перевірка html5 запрацювала. Є спосіб обійти це, щоб отримати те, що ви хочете. Подивіться код:

<body>
    <h1>Validation Example</h1><br />
    <h2>Insert just 1 digit<h2>
    <form id="form" onsubmit="return false">
        <label>Input<input type="text" pattern="[0-9]" id="input" /></label> 
        <input type="submit" class="hide" id="inputButton">         
    </form>
</body>

Дивіться приклад тут

Примітка: використання form.submit () не працювало для мене. Тож я створив приховану кнопку надсилання, яка запускається при клавіатурі. Не питайте мене чому. Можливо, хтось міг би це пояснити.


4

Це моя реалізація рішення, запропонованого @mhm, де я відкинув використання jQuery.

Змінна formId містить ідентифікатор форми, а msg - це об’єкт із повідомленнями мого додатка.

Ця реалізація намагається повідомити користувача власними повідомленнями про помилки HTML 5, якщо це неможливо, то попереджає про загальне повідомлення про помилку.

Якщо помилок немає, я подаю форму.

let applyForm = document.getElementById(formId);

if (!applyForm.checkValidity()) {
  if (applyForm.reportValidity) {
    applyForm.reportValidity();
  } else {
    alert(msg.ieErrorForm);
  }
} else {
  applyForm.submit();
}

2

Коротка відповідь, ні, немає можливості "запустити" функціональність за замовчуванням міхура html5 вбудованого перед подачею форми, ви можете checkValidity()на певних входах, але знову не працює так, як хотілося б. Якщо запобігти запобіганню за замовчуванням, якщо ви все одно хочете надіслати форму після завершення перевірки, ви все одно можете обробити цей стиль, виконавши наступне:

Зверніть увагу, що у формах, для яких ви не хочете застосовувати стилі перевірки css, ви можете просто додати novalidateатрибут до форми.

HTML:

<form name="login" id="loginForm" method="POST">
    <input type="email" name="username" placeholder="Email">
    <input type="password" name="password" placeholder="Password">
    <input type="submit" value="LOG IN" class="hero left clearBoth">
</form>

Якщо ви не використовуєте SCSS, я настійно рекомендую вивчити його, він набагато більш керований, простий у написанні та менш заплутаний. Примітка: У прикладі скрипки у мене є точний css, який буде скомпільовано. Я також включив приклад стилю бульбашок.

SCSS:

form:not([novalidate])            {
  input, textarea                 {
    &:required                    {background: transparent url('/../../images/icons/red_asterisk.png') no-repeat 98% center;}
    &:required:valid              {background: transparent url('/../../images/icons/valid.png') no-repeat 98% center; @include box-shadow(0 0 5px #5cd053);border-color: #28921f;}
    &:not(:focus):valid           {box-shadow: none;border: 1px solid $g4;}
    &:focus:invalid               {background: transparent url('/../../images/icons/invalid.png') no-repeat 98% center;  @include box-shadow(0 0 5px #d45252); border-color: #b03535}  
  }
}
span.formHintBubble {position:absolute; background:$g7; margin-top:50px;@include borderRadius(10px); padding:5px 40px 5px 10px; color:white; @include opacity(0.9); @include box-shadow(1px 1px 6px 1px rgba(0,0,0,0.2));
  &:after {
     @include triangle(30px, $g7, up); content: " "; margin-bottom:27px; left:25px;
  }
  .cross {background:black; border:1px solid $g3; @include borderRadius(10px); width:15px; height:15px; color:#fff; display:block; line-height:15px; position:absolute; right:5px; top:50%; margin-top:-7.5px; padding:0; text-align:center; font-size:10px; cursor:pointer;}
}

JAVASCRIPT:

Тут ми можемо зробити щось забавне, щоб використовувати повідомлення за замовчуванням і успадковувати їх у вашому власному "міхурі" або вікні повідомлення про помилку.

var form    = $('form');
var item    = form.find(':invalid').first();
var node    = item.get(0);                       
var pos     = item.position();                
var message = node.validationMessage || 'Invalid value.'; 
var bubble  = $('<span/>').html('<span class="formHintBubble" style="left: ' + pos.left  + 'px; top:' + pos.top + 'px;">' + message + '<div class="cross">X</div></span>').contents();        
bubble.insertAfter(item); 

ДЕМО:

http://jsfiddle.net/shannonhochkins/wJkVS/

Насолоджуйтесь, і я сподіваюся, що я допомагаю іншим у перевірці форми HTML5, оскільки це неймовірно, і йому потрібно потрапити туди!

Шеннон


1

form.submit () не працює, оскільки перевірка HTML5 виконується перед поданням форми. Коли ви натискаєте кнопку подати, спрацьовує перевірка HTML5, а потім форма передається, якщо перевірка була успішною.


1

Я думаю, що це простіше:

$('submit').click(function(e){
if (e.isValid())
   e.preventDefault();
//your code.
}

це зупинить подання, доки форма не буде дійсною.


1

Як зазначено в інших відповідях, використовуйте event.preventDefault (), щоб запобігти надсиланню форми.

Щоб перевірити форму, перш ніж я написав невелику функцію jQuery, ви можете використовувати (зверніть увагу, що елементу потрібен ідентифікатор!)

(function( $ ){
    $.fn.isValid = function() {
        return document.getElementById(this[0].id).checkValidity();
    };
})( jQuery );

приклад використання

 $('#submitBtn').click( function(e){

        if ($('#registerForm').isValid()){
            // do the request
        } else {
            e.preventDefault();
        }
    });

0

я використовував

objectName.addEventListener('click', function() {
event.preventDefault();
}

але його помилка шоу " подія невизначена ", тому в цьому випадку використовуйте параметр події типу

objectName.addEventListener('click', function(event) {
event.preventDefault();
}

зараз це працює нормально


0

Я знаю, що це стара тема, але коли існує дуже складний (особливо асинхронний) процес перевірки, існує просте обхідне рішення:

<form id="form1">
<input type="button" onclick="javascript:submitIfVeryComplexValidationIsOk()" />
<input type="submit" id="form1_submit_hidden" style="display:none" />
</form>
...
<script>
function submitIfVeryComplexValidationIsOk() {
    var form1 = document.forms['form1']
    if (!form1.checkValidity()) {
        $("#form1_submit_hidden").click()
        return
    }

    if (checkForVeryComplexValidation() === 'Ok') {
         form1.submit()
    } else {
         alert('form is invalid')
    }
}
</script>

2
Розміщення однієї і тієї ж відповіді на різні запитання - це не гарна ідея. Ви опублікували відповідь точно таку ж, як і тут . Якщо ви вважаєте, що обидва запитання, на які ви опублікували відповідь, однакові, то ви можете опублікувати цю відповідь на одне питання, а інше запитання позначити як дублікат першого ...
EhsanT

0

Спробуйте HTMLFormElement.reportValidity (), де ця функція буде викликати перевірки вводу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.