Preskoči na glavno vsebino Preskoči na navigacijo po dokumentih
in English

Validacija

Zagotovite svojim uporabnikom dragocene in koristne povratne informacije s preverjanjem obrazca HTML5 prek privzetega vedenja brskalnika ali slogov po meri in JavaScripta.

Zavedamo se, da trenutno stili preverjanja po meri in opisi orodij na strani odjemalca niso dostopni, ker niso izpostavljeni podpornim tehnologijam. Medtem ko delamo na rešitvi, priporočamo uporabo možnosti na strani strežnika ali privzete metode preverjanja brskalnika.

Kako deluje

Tukaj je opisano, kako deluje preverjanje obrazca z Bootstrapom:

  • Preverjanje obrazca HTML se uporablja prek dveh psevdorazredov CSS :invalidin :valid. Velja za elemente <input>, <select>in .<textarea>
  • Bootstrap obsega :invalidin :validstile za nadrejeni .was-validatedrazred, običajno uporabljen za <form>. V nasprotnem primeru se vsako zahtevano polje brez vrednosti ob nalaganju strani prikaže kot neveljavno. Tako lahko izberete, kdaj jih želite aktivirati (običajno po poskusu oddaje obrazca).
  • Če želite ponastaviti videz obrazca (na primer v primeru dinamičnih oddaj obrazcev z uporabo AJAX), po oddaji znova odstranite .was-validatedrazred iz .<form>
  • Namesto psevdorazredov za preverjanje veljavnosti na strani strežnika.is-invalid se lahko uporabijo tudi .is-validrazredi . Ne potrebujejo nadrejenega razreda..was-validated
  • Zaradi omejitev delovanja CSS ne moremo (trenutno) uporabiti slogov za a <label>, ki je pred kontrolnikom obrazca v DOM, brez pomoči JavaScripta po meri.
  • Vsi sodobni brskalniki podpirajo API za preverjanje omejitev , niz metod JavaScript za preverjanje kontrolnikov obrazcev.
  • Sporočila s povratnimi informacijami lahko uporabljajo privzete nastavitve brskalnika (različne za vsak brskalnik in jih ni mogoče oblikovati prek CSS) ali naše sloge povratnih informacij po meri z dodatnima HTML in CSS.
  • setCustomValidityV JavaScriptu lahko zagotovite sporočila o veljavnosti po meri .

S tem v mislih razmislite o naslednjih predstavitvah za naše sloge preverjanja obrazcev po meri, izbirne razrede na strani strežnika in privzete nastavitve brskalnika.

Slogi po meri

Za sporočila o preverjanju obrazca Bootstrap po meri boste morali dodati novalidatelogični atribut v svoj <form>. To onemogoči privzete povratne informacije brskalnika, vendar še vedno omogoča dostop do API-jev za preverjanje obrazca v JavaScriptu. Poskusite oddati spodnji obrazec; naš JavaScript bo prestregel gumb za oddajo in vam posredoval povratne informacije. Ko boste poskušali oddati, boste videli sloge :invalidin uporabljene za vaše kontrolnike obrazca.:valid

Slogi povratnih informacij po meri uporabljajo barve po meri, obrobe, sloge ostrenja in ikone ozadja za boljše posredovanje povratnih informacij. Ikone ozadja za <select>s so na voljo samo z .form-selectin ne .form-control.

Looks good!
Looks good!
@
Please choose a username.
Please provide a valid city.
Please select a valid state.
Please provide a valid zip.
You must agree before submitting.
<form class="row g-3 needs-validation" novalidate>
  <div class="col-md-4">
    <label for="validationCustom01" class="form-label">First name</label>
    <input type="text" class="form-control" id="validationCustom01" value="Mark" required>
    <div class="valid-feedback">
      Looks good!
    </div>
  </div>
  <div class="col-md-4">
    <label for="validationCustom02" class="form-label">Last name</label>
    <input type="text" class="form-control" id="validationCustom02" value="Otto" required>
    <div class="valid-feedback">
      Looks good!
    </div>
  </div>
  <div class="col-md-4">
    <label for="validationCustomUsername" class="form-label">Username</label>
    <div class="input-group has-validation">
      <span class="input-group-text" id="inputGroupPrepend">@</span>
      <input type="text" class="form-control" id="validationCustomUsername" aria-describedby="inputGroupPrepend" required>
      <div class="invalid-feedback">
        Please choose a username.
      </div>
    </div>
  </div>
  <div class="col-md-6">
    <label for="validationCustom03" class="form-label">City</label>
    <input type="text" class="form-control" id="validationCustom03" required>
    <div class="invalid-feedback">
      Please provide a valid city.
    </div>
  </div>
  <div class="col-md-3">
    <label for="validationCustom04" class="form-label">State</label>
    <select class="form-select" id="validationCustom04" required>
      <option selected disabled value="">Choose...</option>
      <option>...</option>
    </select>
    <div class="invalid-feedback">
      Please select a valid state.
    </div>
  </div>
  <div class="col-md-3">
    <label for="validationCustom05" class="form-label">Zip</label>
    <input type="text" class="form-control" id="validationCustom05" required>
    <div class="invalid-feedback">
      Please provide a valid zip.
    </div>
  </div>
  <div class="col-12">
    <div class="form-check">
      <input class="form-check-input" type="checkbox" value="" id="invalidCheck" required>
      <label class="form-check-label" for="invalidCheck">
        Agree to terms and conditions
      </label>
      <div class="invalid-feedback">
        You must agree before submitting.
      </div>
    </div>
  </div>
  <div class="col-12">
    <button class="btn btn-primary" type="submit">Submit form</button>
  </div>
</form>
// Example starter JavaScript for disabling form submissions if there are invalid fields
(function () {
  'use strict'

  // Fetch all the forms we want to apply custom Bootstrap validation styles to
  var forms = document.querySelectorAll('.needs-validation')

  // Loop over them and prevent submission
  Array.prototype.slice.call(forms)
    .forEach(function (form) {
      form.addEventListener('submit', function (event) {
        if (!form.checkValidity()) {
          event.preventDefault()
          event.stopPropagation()
        }

        form.classList.add('was-validated')
      }, false)
    })
})()

Privzete nastavitve brskalnika

Vas ne zanimajo povratna sporočila preverjanja po meri ali pisanje JavaScripta za spreminjanje vedenja obrazcev? Vse v redu, lahko uporabite privzete nastavitve brskalnika. Poskusite oddati spodnji obrazec. Odvisno od vašega brskalnika in operacijskega sistema boste videli nekoliko drugačen slog povratnih informacij.

Čeprav teh slogov povratnih informacij ni mogoče oblikovati s CSS, lahko še vedno prilagodite besedilo povratnih informacij prek JavaScripta.

@
<form class="row g-3">
  <div class="col-md-4">
    <label for="validationDefault01" class="form-label">First name</label>
    <input type="text" class="form-control" id="validationDefault01" value="Mark" required>
  </div>
  <div class="col-md-4">
    <label for="validationDefault02" class="form-label">Last name</label>
    <input type="text" class="form-control" id="validationDefault02" value="Otto" required>
  </div>
  <div class="col-md-4">
    <label for="validationDefaultUsername" class="form-label">Username</label>
    <div class="input-group">
      <span class="input-group-text" id="inputGroupPrepend2">@</span>
      <input type="text" class="form-control" id="validationDefaultUsername"  aria-describedby="inputGroupPrepend2" required>
    </div>
  </div>
  <div class="col-md-6">
    <label for="validationDefault03" class="form-label">City</label>
    <input type="text" class="form-control" id="validationDefault03" required>
  </div>
  <div class="col-md-3">
    <label for="validationDefault04" class="form-label">State</label>
    <select class="form-select" id="validationDefault04" required>
      <option selected disabled value="">Choose...</option>
      <option>...</option>
    </select>
  </div>
  <div class="col-md-3">
    <label for="validationDefault05" class="form-label">Zip</label>
    <input type="text" class="form-control" id="validationDefault05" required>
  </div>
  <div class="col-12">
    <div class="form-check">
      <input class="form-check-input" type="checkbox" value="" id="invalidCheck2" required>
      <label class="form-check-label" for="invalidCheck2">
        Agree to terms and conditions
      </label>
    </div>
  </div>
  <div class="col-12">
    <button class="btn btn-primary" type="submit">Submit form</button>
  </div>
</form>

Strežniška stran

Priporočamo uporabo preverjanja na strani odjemalca, če pa potrebujete preverjanje na strani strežnika, lahko označite neveljavna in veljavna polja obrazca z .is-invalidin .is-valid. Upoštevajte, da .invalid-feedbackje podprt tudi s temi razredi.

Za neveljavna polja zagotovite, da je neveljavna povratna informacija/sporočilo o napaki povezano z ustreznim poljem obrazca z uporabo aria-describedby(ob upoštevanju, da ta atribut omogoča idsklicevanje na več kot enega, če polje že kaže na dodatno besedilo obrazca).

Če želite odpraviti težave z obrobnimi radiji , vnosne skupine zahtevajo dodaten .has-validationrazred.

Izgleda v redu!
Izgleda v redu!
@
Prosimo izberite uporabniško ime.
Navedite veljavno mesto.
Izberite veljavno državo.
Navedite veljavno poštno številko.
Pred oddajo se morate strinjati.
<form class="row g-3">
  <div class="col-md-4">
    <label for="validationServer01" class="form-label">First name</label>
    <input type="text" class="form-control is-valid" id="validationServer01" value="Mark" required>
    <div class="valid-feedback">
      Looks good!
    </div>
  </div>
  <div class="col-md-4">
    <label for="validationServer02" class="form-label">Last name</label>
    <input type="text" class="form-control is-valid" id="validationServer02" value="Otto" required>
    <div class="valid-feedback">
      Looks good!
    </div>
  </div>
  <div class="col-md-4">
    <label for="validationServerUsername" class="form-label">Username</label>
    <div class="input-group has-validation">
      <span class="input-group-text" id="inputGroupPrepend3">@</span>
      <input type="text" class="form-control is-invalid" id="validationServerUsername" aria-describedby="inputGroupPrepend3 validationServerUsernameFeedback" required>
      <div id="validationServerUsernameFeedback" class="invalid-feedback">
        Please choose a username.
      </div>
    </div>
  </div>
  <div class="col-md-6">
    <label for="validationServer03" class="form-label">City</label>
    <input type="text" class="form-control is-invalid" id="validationServer03" aria-describedby="validationServer03Feedback" required>
    <div id="validationServer03Feedback" class="invalid-feedback">
      Please provide a valid city.
    </div>
  </div>
  <div class="col-md-3">
    <label for="validationServer04" class="form-label">State</label>
    <select class="form-select is-invalid" id="validationServer04" aria-describedby="validationServer04Feedback" required>
      <option selected disabled value="">Choose...</option>
      <option>...</option>
    </select>
    <div id="validationServer04Feedback" class="invalid-feedback">
      Please select a valid state.
    </div>
  </div>
  <div class="col-md-3">
    <label for="validationServer05" class="form-label">Zip</label>
    <input type="text" class="form-control is-invalid" id="validationServer05" aria-describedby="validationServer05Feedback" required>
    <div id="validationServer05Feedback" class="invalid-feedback">
      Please provide a valid zip.
    </div>
  </div>
  <div class="col-12">
    <div class="form-check">
      <input class="form-check-input is-invalid" type="checkbox" value="" id="invalidCheck3" aria-describedby="invalidCheck3Feedback" required>
      <label class="form-check-label" for="invalidCheck3">
        Agree to terms and conditions
      </label>
      <div id="invalidCheck3Feedback" class="invalid-feedback">
        You must agree before submitting.
      </div>
    </div>
  </div>
  <div class="col-12">
    <button class="btn btn-primary" type="submit">Submit form</button>
  </div>
</form>

Podprti elementi

Slogi preverjanja so na voljo za naslednje kontrolnike obrazca in komponente:

  • <input>s in <textarea>s z .form-control(vključno z največ enim .form-controlv vnosnih skupinah)
  • <select>s s.form-select
  • .form-checks
Prosimo, vnesite sporočilo v besedilno polje.
Primer neveljavne povratne informacije
Več primerov neveljavnih povratnih informacij
Primer neveljavne povratne informacije o izbiri
Primer neveljavne povratne informacije o datoteki obrazca
<form class="was-validated">
  <div class="mb-3">
    <label for="validationTextarea" class="form-label">Textarea</label>
    <textarea class="form-control is-invalid" id="validationTextarea" placeholder="Required example textarea" required></textarea>
    <div class="invalid-feedback">
      Please enter a message in the textarea.
    </div>
  </div>

  <div class="form-check mb-3">
    <input type="checkbox" class="form-check-input" id="validationFormCheck1" required>
    <label class="form-check-label" for="validationFormCheck1">Check this checkbox</label>
    <div class="invalid-feedback">Example invalid feedback text</div>
  </div>

  <div class="form-check">
    <input type="radio" class="form-check-input" id="validationFormCheck2" name="radio-stacked" required>
    <label class="form-check-label" for="validationFormCheck2">Toggle this radio</label>
  </div>
  <div class="form-check mb-3">
    <input type="radio" class="form-check-input" id="validationFormCheck3" name="radio-stacked" required>
    <label class="form-check-label" for="validationFormCheck3">Or toggle this other radio</label>
    <div class="invalid-feedback">More example invalid feedback text</div>
  </div>

  <div class="mb-3">
    <select class="form-select" required aria-label="select example">
      <option value="">Open this select menu</option>
      <option value="1">One</option>
      <option value="2">Two</option>
      <option value="3">Three</option>
    </select>
    <div class="invalid-feedback">Example invalid select feedback</div>
  </div>

  <div class="mb-3">
    <input type="file" class="form-control" aria-label="file example" required>
    <div class="invalid-feedback">Example invalid form file feedback</div>
  </div>

  <div class="mb-3">
    <button class="btn btn-primary" type="submit" disabled>Submit form</button>
  </div>
</form>

Namigi orodij

Če postavitev vašega obrazca to omogoča, lahko zamenjate .{valid|invalid}-feedbackrazrede za .{valid|invalid}-tooltiprazrede, da prikažete povratne informacije o preverjanju v oblikovanem opisu orodja. Prepričajte se, da je prisoten nadrejeni position: relativeelement za pozicioniranje namigov orodij. V spodnjem primeru naši razredi stolpcev to že imajo, vendar bo vaš projekt morda zahteval alternativno nastavitev.

Looks good!
Looks good!
@
Please choose a unique and valid username.
Please provide a valid city.
Please select a valid state.
Please provide a valid zip.
<form class="row g-3 needs-validation" novalidate>
  <div class="col-md-4 position-relative">
    <label for="validationTooltip01" class="form-label">First name</label>
    <input type="text" class="form-control" id="validationTooltip01" value="Mark" required>
    <div class="valid-tooltip">
      Looks good!
    </div>
  </div>
  <div class="col-md-4 position-relative">
    <label for="validationTooltip02" class="form-label">Last name</label>
    <input type="text" class="form-control" id="validationTooltip02" value="Otto" required>
    <div class="valid-tooltip">
      Looks good!
    </div>
  </div>
  <div class="col-md-4 position-relative">
    <label for="validationTooltipUsername" class="form-label">Username</label>
    <div class="input-group has-validation">
      <span class="input-group-text" id="validationTooltipUsernamePrepend">@</span>
      <input type="text" class="form-control" id="validationTooltipUsername" aria-describedby="validationTooltipUsernamePrepend" required>
      <div class="invalid-tooltip">
        Please choose a unique and valid username.
      </div>
    </div>
  </div>
  <div class="col-md-6 position-relative">
    <label for="validationTooltip03" class="form-label">City</label>
    <input type="text" class="form-control" id="validationTooltip03" required>
    <div class="invalid-tooltip">
      Please provide a valid city.
    </div>
  </div>
  <div class="col-md-3 position-relative">
    <label for="validationTooltip04" class="form-label">State</label>
    <select class="form-select" id="validationTooltip04" required>
      <option selected disabled value="">Choose...</option>
      <option>...</option>
    </select>
    <div class="invalid-tooltip">
      Please select a valid state.
    </div>
  </div>
  <div class="col-md-3 position-relative">
    <label for="validationTooltip05" class="form-label">Zip</label>
    <input type="text" class="form-control" id="validationTooltip05" required>
    <div class="invalid-tooltip">
      Please provide a valid zip.
    </div>
  </div>
  <div class="col-12">
    <button class="btn btn-primary" type="submit">Submit form</button>
  </div>
</form>

Sass

Spremenljivke

$form-feedback-margin-top:          $form-text-margin-top;
$form-feedback-font-size:           $form-text-font-size;
$form-feedback-font-style:          $form-text-font-style;
$form-feedback-valid-color:         $success;
$form-feedback-invalid-color:       $danger;

$form-feedback-icon-valid-color:    $form-feedback-valid-color;
$form-feedback-icon-valid:          url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'><path fill='#{$form-feedback-icon-valid-color}' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/></svg>");
$form-feedback-icon-invalid-color:  $form-feedback-invalid-color;
$form-feedback-icon-invalid:        url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='#{$form-feedback-icon-invalid-color}'><circle cx='6' cy='6' r='4.5'/><path stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/><circle cx='6' cy='8.2' r='.6' fill='#{$form-feedback-icon-invalid-color}' stroke='none'/></svg>");

Mixins

Dva mixina sta združena prek naše zanke , da ustvarita naše sloge povratnih informacij za preverjanje obrazca.

@mixin form-validation-state-selector($state) {
  @if ($state == "valid" or $state == "invalid") {
    .was-validated #{if(&, "&", "")}:#{$state},
    #{if(&, "&", "")}.is-#{$state} {
      @content;
    }
  } @else {
    #{if(&, "&", "")}.is-#{$state} {
      @content;
    }
  }
}

@mixin form-validation-state(
  $state,
  $color,
  $icon,
  $tooltip-color: color-contrast($color),
  $tooltip-bg-color: rgba($color, $form-feedback-tooltip-opacity),
  $focus-box-shadow: 0 0 $input-btn-focus-blur $input-focus-width rgba($color, $input-btn-focus-color-opacity)
) {
  .#{$state}-feedback {
    display: none;
    width: 100%;
    margin-top: $form-feedback-margin-top;
    @include font-size($form-feedback-font-size);
    font-style: $form-feedback-font-style;
    color: $color;
  }

  .#{$state}-tooltip {
    position: absolute;
    top: 100%;
    z-index: 5;
    display: none;
    max-width: 100%; // Contain to parent when possible
    padding: $form-feedback-tooltip-padding-y $form-feedback-tooltip-padding-x;
    margin-top: .1rem;
    @include font-size($form-feedback-tooltip-font-size);
    line-height: $form-feedback-tooltip-line-height;
    color: $tooltip-color;
    background-color: $tooltip-bg-color;
    @include border-radius($form-feedback-tooltip-border-radius);
  }

  @include form-validation-state-selector($state) {
    ~ .#{$state}-feedback,
    ~ .#{$state}-tooltip {
      display: block;
    }
  }

  .form-control {
    @include form-validation-state-selector($state) {
      border-color: $color;

      @if $enable-validation-icons {
        padding-right: $input-height-inner;
        background-image: escape-svg($icon);
        background-repeat: no-repeat;
        background-position: right $input-height-inner-quarter center;
        background-size: $input-height-inner-half $input-height-inner-half;
      }

      &:focus {
        border-color: $color;
        box-shadow: $focus-box-shadow;
      }
    }
  }

  // stylelint-disable-next-line selector-no-qualifying-type
  textarea.form-control {
    @include form-validation-state-selector($state) {
      @if $enable-validation-icons {
        padding-right: $input-height-inner;
        background-position: top $input-height-inner-quarter right $input-height-inner-quarter;
      }
    }
  }

  .form-select {
    @include form-validation-state-selector($state) {
      border-color: $color;

      @if $enable-validation-icons {
        &:not([multiple]):not([size]),
        &:not([multiple])[size="1"] {
          padding-right: $form-select-feedback-icon-padding-end;
          background-image: escape-svg($form-select-indicator), escape-svg($icon);
          background-position: $form-select-bg-position, $form-select-feedback-icon-position;
          background-size: $form-select-bg-size, $form-select-feedback-icon-size;
        }
      }

      &:focus {
        border-color: $color;
        box-shadow: $focus-box-shadow;
      }
    }
  }

  .form-check-input {
    @include form-validation-state-selector($state) {
      border-color: $color;

      &:checked {
        background-color: $color;
      }

      &:focus {
        box-shadow: $focus-box-shadow;
      }

      ~ .form-check-label {
        color: $color;
      }
    }
  }
  .form-check-inline .form-check-input {
    ~ .#{$state}-feedback {
      margin-left: .5em;
    }
  }

  .input-group .form-control,
  .input-group .form-select {
    @include form-validation-state-selector($state) {
      @if $state == "valid" {
        z-index: 1;
      } @else if $state == "invalid" {
        z-index: 2;
      }
      &:focus {
        z-index: 3;
      }
    }
  }
}

Zemljevid

To je validacijski zemljevid Sass iz _variables.scss. Preglasite ali razširite to, da ustvarite drugačna ali dodatna stanja.

$form-validation-states: (
  "valid": (
    "color": $form-feedback-valid-color,
    "icon": $form-feedback-icon-valid
  ),
  "invalid": (
    "color": $form-feedback-invalid-color,
    "icon": $form-feedback-icon-invalid
  )
);

Zemljevidi $form-validation-stateslahko vsebujejo tri neobvezne parametre za preglasitev namigov orodij in slogov fokusa.

Zanka

Uporablja se za ponavljanje $form-validation-statesvrednosti zemljevida za ustvarjanje naših slogov preverjanja. Vse spremembe zgornjega zemljevida Sass se bodo odražale v vašem prevedenem CSS prek te zanke.

@each $state, $data in $form-validation-states {
  @include form-validation-state($state, $data...);
}

Prilagajanje

Stanja preverjanja je mogoče prilagoditi prek Sass z $form-validation-stateszemljevidom. Ta zemljevid Sass, ki se nahaja v naši _variables.scssdatoteki, je način, kako ustvarimo privzeta stanja valid/ invalidstanja preverjanja. Vključen je ugnezdeni zemljevid za prilagajanje barve, ikone, barve opisa orodja in sence fokusa vsakega stanja. Medtem ko brskalniki ne podpirajo nobenih drugih stanj, lahko tisti, ki uporabljajo sloge po meri, enostavno dodajo bolj zapletene povratne informacije obrazca.

Upoštevajte, da ne priporočamo prilagajanja $form-validation-statesvrednosti, ne da bi spremenili tudi form-validation-statemixin .