2012-11-30 12 views
22

Quando uso textarea.checkValidity() o textarea.validity.valid in javascript con un valore non valido entrambi restituiscono sempre true, cosa sto facendo male?Come convalidare la corrispondenza del modello nella textarea?

<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

Sembra [ 'textarea' non ha l'attributo' pattern'] (https: // developer.mozilla.org/en-US/docs/HTML/HTML_Elements/textarea?redirectlocale=en-US&redirectslug=HTML%2FElement%2Ftextarea), quindi è probabile che i browser lo ignorino. – Passerby

risposta

18

HTML5 <textarea> elemento non supporta l'attributo pattern.

Vedere MDN doc per gli attributi <textarea> consentiti.

Potrebbe essere necessario definire questa funzionalità da soli.

Oppure seguire la pratica tradizionale di HTML 4 di definire una funzione JavaScript/jQuery per farlo.

7

È possibile implementare da soli setCustomValidity(). In questo modo, this.checkValidity() risponderà a qualsiasi regola che si desidera applicare al proprio elemento. Non credo che this.validity.patternMismatch possa essere impostato manualmente, ma è possibile utilizzare invece la propria proprietà, se necessario.

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

Buona risposta e grazie per il violino. Mi ha aiutato! –

+0

Grazie, felice di poterti aiutare. :) –

5

Ciò consentirà l'attributo pattern su tutte le aree di testo nel DOM e innescare la validazione HTML5. Ci vuole anche in schemi conto che hanno la ^ o $ operatori e fa un incontro globale utilizzando la g bandiera Regex:

$(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

Sì, è più pulito. :) In effetti, l'attributo pattern negli input consente '^' e '$' nella regexp anche se sono impliciti. –

+0

La sostituzione di^e $ non funziona. Dovrebbe essere globale (con/g) espressioni regolari (con barre), non un'espressione regolare in una stringa: 'var patternRegex = new RegExp ('^' + pattern.replace (/^\^| \ $$/g, ' ') +' $ ',' g '); ' –

+0

Ho provato a far funzionare tutto questo su un violino cercando un indirizzo email su ogni riga. La cosa migliore che potrei fare aggiungo un modificatore m e poi corrisponderebbe se ci fosse un indirizzo email su QUALSIASI linea. Ancora non quello che volevo. Il primo esempio di Yann sopra funzionava correttamente. Come useresti questo metodo invece per risolvere il problema? Ecco il fiddle che ho creato: http://jsfiddle.net/da1hg19e/ –

Problemi correlati