2013-01-18 13 views
5

używam bardzo ładny plugin sprawdzania bassistance dla wszystkich moich potrzeb walidacji formularza: http://bassistance.de/jquery-plugins/jquery-plugin-validation/jQuery Walidacja, ale dopiero po wstępnym poddaniu

A problemem spotykam: Komunikaty o błędach pojawiają się natychmiast, nawet wtedy, gdy użytkownik nie ma zakończono wypełnianie pola. W związku z tym: nieprawidłowy adres e-mail pojawia się, dopóki użytkownik nie zakończy pisania.

W dokumentacji here, jednym rozwiązaniem jest ustawienie opcji onkeyup na false powodującej wyświetlanie komunikatów o błędach tylko w kolorze onblur.

Jednak w mojej konfiguracji, spotykam dwa dodatkowe problemy (nie rozwiązany przez powyższego roztworu)

  1. Przy składaniu nieprawidłową formę, komunikaty o błędach nie są usuwane podczas korygowania im
  2. gdy funkcja autofill przeglądarki, automatycznie wypełnione pola pozostają oznaczone jako błędne.

Tak więc, moje pierwsze pytanie brzmiało: w jaki sposób mogę sprawić, by sprawdzanie poprawności Bassistance było uruchamiane dopiero po pierwszym przesłaniu ORAZ z jego domyślnymi ustawieniami?

Oto mój kod:

if($('#contact_form').length) { 
    $("#contact_form").validate({ 
     rules: { 
      first_name: { 
       required: true 
      }, 
      last_name: { 
       required: true 
      }, 
      message: { 
       required: true 
      }, 
      telephone: { 
       required: true 
      },    
      email: { 
       required: true, 
       email: true 
      }, 
      email_again: { 
       required: true, 
       email: true, 
       equalTo: "#email" 
      }, 
      norobot: { 
       required:true, 
       minlength:4, 
       maxlength:4, 
       number:true  
      } 
     } 
    }); 
} 

Proszę znaleźć pełną JavaScript tutaj: http://lad.chocolata.be/js/main.js

Oto przykład pracy z błędem z onkeyup zestaw do false: http://lad.chocolata.be/nl/contact

Po wysłaniu formularza w przypadku niektórych nieprawidłowych pól komunikaty o błędach nie są usuwane po ich poprawieniu.

Czego mi brakuje?

+0

Proszę podać swój kod w oryginalnym wpisie, abyśmy mogli ponownie go otworzyć. – Sparky

+0

Witam, pokornie nie zgadzam się z zamknięciem mojego pytania. Kod jest zbyt duży, aby opublikować go w całości tutaj, dlatego umieściłem linki do obu przykładów. Próbowałem odtworzyć to zachowanie w JSFiddle, ale nie mogę. Zgaduję, że istnieje konflikt między niektórymi z moich skryptów. Czy możesz obejrzeć załączone linki? Spróbuj przesłać formularz bez wypełniania czegokolwiek, następnie popraw pola: zobaczysz, że błędy nie zostały usunięte. W międzyczasie przerobię to pytanie, aby było bardziej jasne. – maartenmachiels

+0

Cała idea tej strony obejmuje również pomoc dla przyszłych czytelników, co nie może się zdarzyć, gdy linki zewnętrzne są martwe. Wszystko, co możesz zrobić, by stworzyć zwięzły przykład, byłoby pomocne w ponownym otwarciu. Nawet po prostu wzięcie mojego prostego jsFiddle i podzielenie go na twoje dwa przypadki byłoby lepsze. – Sparky

Odpowiedz

4

Cytat OP:„Tak, jasne i proste, moje pytanie brzmi: w jaki sposób mogę dokonać Bassistance walidacji ogień dopiero po pierwszym złożyć I z jego ustawień domyślnych stamtąd na out”

Ostrzeżenie dla czytelnika: Normalnie nazwać .validate()raz na DOM gotowy do inicjalizacji formularza. Poniższy kod wywołuje tylko .validate()po po naciśnięciu przycisku przesyłania ... w związku z tym nastąpi walidacja no, dopóki ten przycisk nie zostanie naciśnięty po raz pierwszy.

Nie ma potrzeby, aby dzwonić pod numer .validate() więcej niż raz, dlatego użyłem numeru jQuery one() event.

$(document).ready(function() { 

    $('#submit').one('click', function() { 
     $('#myform').validate({ 
      // your rules & options 
     }); 
    }); 

}); 

Demo pracy:

http://jsfiddle.net/hSDyP/

+0

Doskonała odpowiedź, Sparky. Jedno pytanie: próbowałem kliknąć przycisk przesyłania i próbowałem naciskać enter: oba przypadki działają. Czy mamy zatem wszystkie możliwe sytuacje? A może lepiej byłoby użyć programu obsługi zdarzeń onsubmit? – maartenmachiels

+0

@maartenmachiels, Zakładając, że JS jest włączony, wtedy powiedziałbym "tak", jesteś objęty. Unikałbym wszystkiego, co używa zdarzenia 'submit', ponieważ jest ono już obsługiwane przez własny' submitHandler 'wtyczki. Innymi słowy, tak naprawdę jeszcze nie "przesyłasz" w tym momencie, więc nie ma powodu, aby używać tego wydarzenia. – Sparky

+0

Zwycięzca bierze to wszystko :-) Dziękuję za twój wspaniały wkład. Bardzo doceniane! – maartenmachiels

-1

pisałem rodzajowe rozwiązanie, aby uniknąć stosowania valitation aż najpierw złożyć występuje. Wystarczy użyć tego kodu po tym skrypt „jquery.validate.js”:

(function($){ 

var _validate = $.fn.validate; 

$.fn.validate = function(){ 
    var result, args = Array.prototype.slice.apply(arguments); 
    this.each(function(){ 
     var $this = $(this), 
      lazyValidate = $this.data('lazy-validate'); 
     // Lazy validation has been initialized: just delegate 
     if(lazyValidate === true){ 
      result = _validate.apply($this, args); 
      return; 
     } 
     // Init, if not yet 
     if(!lazyValidate){ 
      // Create Lazy Form 
      lazyValidate = $('<form />')[0]; 
      $this.data('lazy-validate', lazyValidate); 
      // Add One-Time submit handlder 
      $this.one('submit.lazy-validate', function(){ 
       var $this = $(this); 
       // Apply validation options now 
       _validate.call($this, $(lazyValidate).data('validator').settings); 
       // Mark lazy validation has initialized 
       $this.data('lazy-validate', true); 
       // Test Valid 
       return $this.valid(); 
      }); 
     } 
     // Apply Method to Lazy Form 
     result = _validate.apply($(lazyValidate), args); 
    }); 
    return result === undefined ? this : result;   
}; 

})(jQuery); 

Należy pamiętać, że rozwiązanie to nie będzie działać, jeśli używasz metody w dziedzinie: zasady(), removeAttrs().

Wreszcie, myślę, że ta funkcjonalność powinna być zawarta w pluginach walidacji jako prosta opcja validate(); ale do tego wciąż będę używał tej sztuczki.

+0

To dość gadatliwe, IMO. Jaka jest przewaga nad zaakceptowaną odpowiedzią? – Sparky

Powiązane problemy