2012-01-25 29 views
6

Tôi đang sử dụng plugin jQuery validation cố gắng thêm quy tắc dựa trên thuộc tính data-. Tôi đang thêm quy tắc min/maxlength dựa trên data-minlength hoặc data-maxlength. Dưới đây là một số mẫu HTML:Thêm quy tắc xác thực jQuery dựa trên thuộc tính dữ liệu trong vòng lặp

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

tôi đang làm điều này để thêm các quy tắc và nó làm việc tốt:

$('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') 
     }); 
    } 
}); 

Nhưng tôi muốn để rút ngắn nó lên, vì vậy tôi cố gắng này và nó không làm việc:

['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) 
      }); 
     } 
    }); 
}); 

Lỗi này là do $.validator.methods[method] không xác định. Bằng cách nào đó nó nhận được tên phương thức sai được truyền cho nó, mặc dù alert(item) cho tôi biết tên quy tắc là chính xác.

Có ai có bất kỳ ý tưởng nào tại sao hoặc có giải pháp thay thế mà tôi có thể sử dụng để rút ngắn mã làm việc lặp đi lặp lại ở trên không?

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

Trả lời

6

Nó không hoạt động vì bạn đang tạo một đối tượng theo nghĩa đen với thuộc tính mới được gọi là mục.

làm thế nào về điều này?

['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); 
     } 
    }); 
}); 

Điều này tạo ra một đối tượng tùy chọn và thêm thuộc tính thích hợp bạn cần.

+0

+1 Vì nó chỉ là giây ...;) – Yoshi

+0

Cảm ơn, tôi biết đó là điều cơ bản. Javascript không phải là điểm mạnh của tôi, tôi đánh giá cao sự giải thích nhanh chóng. –

3

Tại sao bạn không chỉ đơn giản là làm

$('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 
     }); 
    } 
}); 

fiddle đây http://jsfiddle.net/kaVKe/2/ Mã của bạn không làm việc tôi nghĩ rằng vì bạn không thể sử dụng một biến cho một tên thuộc tính

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

Cảm ơn workaround. Sẽ không lặp qua tất cả các đầu vào bất kể nó có thuộc tính hay bây giờ chậm hơn nhiều so với sử dụng một bộ chọn cụ thể hơn? Tôi đoán tôi sẽ kiểm tra nó ra và xem. –

+0

@Madmartigan phụ thuộc vào số lượng đầu vào, chắc chắn có thể, nhưng cũng chọn lọc đầu vào theo thuộc tính không phải là nhanh ... bạn có thể thêm phía máy chủ lớp khi đầu vào hase ít nhất một trong các thuộc tính đó và lọc đầu vào bằng cách sử dụng lớp –

+0

Tôi đã đưa ra một câu trả lời khác vì tôi nghĩ nó làm nổi bật sai lầm của tôi rõ ràng hơn, nhưng điều này có thể thực sự là những gì tôi sử dụng, bởi vì tôi có một vài quy tắc 'data-' khác cần một chút finessing. cần phải chu kỳ thông qua nhiều đầu vào hơn. Cũng có thể làm điều đó một lần. Cảm ơn rất nhiều. –

5

Hãy thử:

['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); 
     } 
    }); 
}); 

giải pháp của bạn không làm việc vì trong ký hiệu literal đối tượng, tên thuộc tính sẽ không được hiểu là biến:

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

Tâm trí tuyệt vời nghĩ như nhau! – BNL

+0

Hoạt động tuyệt vời, cảm ơn. Tôi biết đó là một số javascript tiểu học đó là vấn đề của tôi. –

Các vấn đề liên quan