2012-01-25 12 views
6

Używam wtyczki jQuery validation próbującej dodać reguły na podstawie atrybutów data-. Dodaję reguły min/maxlength na podstawie data-minlength lub data-maxlength. Oto niektóre próbki HTML:Dodawanie reguł sprawdzania poprawności jQuery na podstawie atrybutów danych w pętli

<form> 
    <input name="input1" data-maxlength="5" data-minlength="3" required> 
    <input name="input2" data-maxlength="5" required> 
    <input name="input3" data-minlength="3" required> 
    <button>Submit</button> 
</form> 

Robię to, aby dodać reguły i to działa dobrze:

$('input[data-minlength]').each(function(){ 
    if ($(this).data('minlength')) { 
     $(this).rules("add", { 
      minlength: $(this).data('minlength') 
     }); 
    } 
}); 

$('input[data-maxlength]').each(function(){ 
    if ($(this).data('maxlength')) { 
     $(this).rules("add", { 
      maxlength: $(this).data('maxlength') 
     }); 
    } 
}); 

Ale chciałem skrócić go, więc to próbowałem i nie działa:

['minlength', 'maxlength'].forEach(function(item){ 
    $('input[data-'+item+']').each(function(){ 
     if ($(this).data(item)) { 
      // alert(item) shows the correct rule name 
      $(this).rules("add", { 
       // Next line fails, but hardcoding a rule name works 
       item: $(this).data(item) 
      }); 
     } 
    }); 
}); 

Błąd jest taki, że $.validator.methods[method] jest niezdefiniowany. W jakiś sposób otrzymuję błędną nazwę metody, mimo że alert(item) mówi mi, że nazwa reguły jest poprawna.

Czy ktoś ma pojęcie, dlaczego lub alternatywne rozwiązanie mogę użyć, aby skrócić powtarzający się, działający kod powyżej?

Demo: http://jsfiddle.net/kaVKe/1/

Odpowiedz

6

To nie działa, ponieważ tworzysz literał obiektu z nową właściwością o nazwie item.

co z tym?

['minlength', 'maxlength'].forEach(function(item){ 
    $('input[data-'+item+']').each(function(){ 
     if ($(this).data(item)) { 
      // alert(item) shows the correct rule name 
      var options = {}; 
      options[item] = $(this).data(item); 

      $(this).rules("add", options); 
     } 
    }); 
}); 

Spowoduje to utworzenie obiektu opcji i dodanie odpowiedniej właściwości, której potrzebujesz.

+0

+1 Bo to były tylko sekundy ...;) – Yoshi

+0

Dzięki, wiedziałem, że to coś podstawowego. JavaScript nie jest moją mocną stroną, doceniam szybkie wyjaśnienie. –

3

Dlaczego nie można po prostu zrobić

$('input').each(function(){ 
    var max = $(this).data('maxlength'); 
    var min = $(this).data('minlength') 
    if (min) { 
     $(this).rules("add", { 
      minlength: min 
     }); 
    } 
    if (max) { 
     $(this).rules("add", { 
      maxlength: max 
     }); 
    } 
}); 

skrzypce tutaj http://jsfiddle.net/kaVKe/2/ Twój kod nie działa, myślę, ponieważ nie można użyć zmiennej o nazwie własności

// Next line fails, item is always interpreted as item, not as maxlength/minlength 
item: $(this).data(item) 
+0

Dzięki za obejście. Nie zapętli się przez każde wejście, niezależnie od tego, czy ma on atrybut, czy teraz jest znacznie wolniejszy niż przy użyciu bardziej szczegółowego selektora? Chyba przetestuję to i zobaczę. –

+0

@Madmartigan, który zależy od liczby wejść, to z pewnością może być, ale również wybór filtrowania wejść według atrybutu nie jest tak szybki ... można dodać stronę serwera klasy, gdy wejście ma co najmniej jeden z tych atrybutów i filtruje wejście przy użyciu klasy –

+0

Mam accepeted inną odpowiedź, ponieważ myślę, że to podkreśla mój błąd jaśniej, ale to może być faktycznie to, czego używam, ponieważ mam kilka innych "danych", które wymagają trochę finessing więc ostatecznie trzeba przechodzić przez kolejne wejścia. Równie dobrze może to zrobić raz. Wielkie dzięki. –

5

Spróbuj:

['minlength', 'maxlength'].forEach(function(item){ 
    $('input[data-'+item+']').each(function(){ 
     if ($(this).data(item)) { 
      var rule = {}; 
      rule[item] = $(this).data(item); 
      $(this).rules("add", rule); 
     } 
    }); 
}); 

Twoje rozwiązanie nie działa, ponieważ w obiekcie dosłownym zapisie nazwy właściwości nie będą interpretowane jako zmienne:

{ 
    item: ... // <-- this one 
} 
+1

Wielkie umysły myślą podobnie! – BNL

+0

Działa świetnie, dzięki. Wiedziałem, że to jakiś podstawowy javascript był moim problemem. –

Powiązane problemy