2012-11-30 17 views
22

Kiedy używam textarea.checkValidity() lub textarea.validity.valid w javascript z niepoprawną wartością, obie zwracają true, co robię źle?Jak sprawdzić poprawność dopasowywania wzorca w obszarze tekstowym?

<textarea name="test" pattern="[a-z]{1,30}(,[a-z]{1,30})*" id="test"></textarea>​ 

jQuery('#test').on('keyup', function() { 
    jQuery(this).parent().append('<p>' + this.checkValidity() + ' ' + 
    this.validity.patternMismatch + '</p>'); 
}); 

http://jsfiddle.net/Riesling/jbtRU/9/

+8

Wydaje [ 'textarea' nie mamy atrybut pattern''] (https: // developer.mozilla.org/en-US/docs/HTML/HTML_Elements/textarea?redirectlocale=en-US&redirectslug=HTML%2FElement%2Ftextarea), więc prawdopodobnie przeglądarki go zignorują. – Passerby

Odpowiedz

18

HTML5 <textarea> element nie obsługuje atrybutu pattern.

Zobacz atrybuty MDN doc dla dozwolonych <textarea>.

Może zajść potrzeba samodzielnego zdefiniowania tej funkcji.

Lub wykonaj tradycyjną praktykę HTML 4 definiowania funkcji JavaScript/jQuery, aby to zrobić.

7

Możesz to zaimplementować samodzielnie, korzystając z setCustomValidity(). W ten sposób, this.checkValidity() odpowie na dowolną regułę, którą chcesz zastosować do swojego elementu. Nie sądzę, aby this.validity.patternMismatch można było ustawić ręcznie, ale w razie potrzeby można użyć własnej właściwości.

http://jsfiddle.net/yanndinendal/jbtRU/22/

$('#test').keyup(validateTextarea); 

function validateTextarea() { 
    var errorMsg = "Please match the format requested."; 
    var textarea = this; 
    var pattern = new RegExp('^' + $(textarea).attr('pattern') + '$'); 
    // check each line of text 
    $.each($(this).val().split("\n"), function() { 
     // check if the line matches the pattern 
     var hasError = !this.match(pattern); 
     if (typeof textarea.setCustomValidity === 'function') { 
      textarea.setCustomValidity(hasError ? errorMsg : ''); 
     } else { 
      // Not supported by the browser, fallback to manual error display... 
      $(textarea).toggleClass('error', !!hasError); 
      $(textarea).toggleClass('ok', !hasError); 
      if (hasError) { 
       $(textarea).attr('title', errorMsg); 
      } else { 
       $(textarea).removeAttr('title'); 
      } 
     } 
     return !hasError; 
    }); 
} 
+2

Dobra odpowiedź i dzięki za skrzypce. Pomogło mi to! –

+0

Dzięki, cieszę się, że mogłem pomóc. :) –

5

pozwoli to atrybut pattern na wszystkie pola tekstowe w DOM i wyzwalać walidacji HTML5. Bierze także pod uwagę wzorów, które mają ^ lub $ operatorów i robi mecz Global używając g Regex flag

$(document).ready(function() { 
    var errorMessage = "Please match the requested format."; 

    $(this).find("textarea").on("input change propertychange", function() { 

     var pattern = $(this).attr("pattern"); 

     if(typeof pattern !== typeof undefined && pattern !== false) 
     { 
      var patternRegex = new RegExp("^" + pattern.replace(/^\^|\$$/g, '') + "$", "g"); 

      hasError = !$(this).val().match(patternRegex); 

      if (typeof this.setCustomValidity === "function") 
      { 
       this.setCustomValidity(hasError ? errorMessage : ""); 
      } 
      else 
      { 
       $(this).toggleClass("error", !!hasError); 
       $(this).toggleClass("ok", !hasError); 

       if (hasError) 
       { 
        $(this).attr("title", errorMessage); 
       } 
       else 
       { 
        $(this).removeAttr("title"); 
       } 
      } 
     } 

    }); 
}); 
+1

Tak, to jest czystsze. :) Rzeczywiście, atrybut pattern na wejściach zezwala na '^' i '$' w wyrażeniu regularnym, mimo że są one niejawne. –

+0

Zamienniki^i $ nie działają. Powinien to być globalny (z/g) regexp (z ukośnikami), a nie wyrażenie regularne w łańcuchu: 'var patternRegex = new RegExp ('^' + pattern.replace (/^\^| \ $$/g, ' ') +' $ ',' g '); ' –

+0

Próbowałem zmusić to do pracy na skrzypcach szukających adresu e-mail w każdym wierszu. Najlepsze, co mogłem zrobić, to dodać modyfikator m, a następnie pasowałoby, gdyby w KAŻDEJ linii był adres e-mail. Wciąż nie tego chciałem. Pierwszy przykład Yanna powyżej działał poprawnie. W jaki sposób użyłbyś tej metody, aby rozwiązać problem? Oto skrzypce, które stworzyłem: http://jsfiddle.net/da1hg19e/ –

Powiązane problemy