2010-10-08 36 views
5

Tôi đang cố gắng thực hiện những việc sau: Tôi có một biểu mẫu được xác thực bằng Plugin Xác thực jQuery. Có một trường có một vài quy tắc:Xác thực jQuery: một cuộc gọi lại được kích hoạt bởi một quy tắc nhất định?

  var validator = $("#myForm").validate({ 
       rules: { 
        emailForRequest: { 
         required: true, 
         email: true, 
         remote: "'emailcheck.php" 
        } 
       } , 
... 

Bây giờ, khi một trong các quy tắc bị hỏng, chính xác hơn quy tắc từ xa, tôi muốn kích hoạt thêm một số mã. Vì vậy, nếu quy tắc từ xa trả về lỗi và nhãn lỗi xuất hiện bên cạnh trường emailForRequest, tôi cần một cuộc gọi lại thực hiện một số việc khác trong nền.

Tóm tắt: tôi có thể xem quy tắc nào kích hoạt lỗi, xem mã theo ý tôi hay không và đính kèm thực hiện một hàm bổ sung cho nó?


EDIT Ok, nhờ vào câu trả lời của Liam và đọc tốt hơn về hướng dẫn tôi đến đây:

 rules: { 
      emailForRequest: { 
       required: true, 
       email: true, 
       remote: { 
        url: "'emailcheck.php" , 
        type: "post" , 
        complete: function(data){ 
         if(data.responseText != "true") { 
          alert("Sorry mate, this email address was registered but never activated!"); 
         } 
        } 
       } 
      } 
     } , ... 

Nhưng có một vấn đề vẫn còn. kịch bản emailcheck.php có thể trả lại 3 kết quả khác nhau, một trong số đó là đúng và 2 khác là ngôn ngữ phụ thuộc. Vì vậy, tôi muốn gửi một đối tượng json như là phản ứng với một var cho loại lỗi (giống nhau trong tất cả các ngôn ngữ) và một var với thông điệp (dịch). Vì vậy, trong chức năng hoàn chỉnh của tôi sau đó tôi có thể làm một kiểm tra về loại lỗi và trả lời theo đó. Đủ dễ dàng, ngoại trừ nó sẽ vít lên các lỗi tiêu chuẩn xác nhận đó là nghĩa vụ phải xuất hiện bên cạnh lĩnh vực của tôi và tôi đã không tìm thấy một giải pháp cho điều đó được nêu ra.

+0

Tôi rất muốn xem giải pháp cho điều này! – Patricia

+0

Bạn có thể cho chúng tôi biết nơi bạn tìm thấy hướng dẫn nâng cao, chi tiết tùy chọn emailForRequest, v.v. –

+0

Hey Liam, điều chắc chắn và bạn đặt tôi đi đúng hướng bằng cách này! Đây là URL nơi tôi tìm thấy hướng dẫn: http://docs.jquery.com/Plugins/Validation – Peter

Trả lời

0

Nhờ FreekOne và ý tưởng về tiền tố của tôi, tôi đã đưa ra giải pháp khả thi. Tôi nói là hoàn toàn khả thi, vì tôi không hài lòng với sự sạch sẽ của nó. Vì tôi không biết chính xác điều gì sẽ xảy ra trong trình xác thực và tinkering xung quanh với dataFilter và chức năng thành công của cuộc gọi ajax làm gián đoạn hoạt động bình thường của trình xác thực, tôi đã đến giải pháp sau với tiền tố "ẩn":

var validator = $("#myForm").validate({ 
       rules: { 
        emailForRequest: { 
         required: true, 
         email: true, 
         remote: { 
          url: "emailcheck.php" , 
          type: "post" , 
          complete: function(data){ 
           if(data.responseText != true) { 
            if(data.responseText.search(/validationErrorTag/) > 0 && 
             data.responseText.search(/inactive/) > 0) { 
             inactiveFunctionality(); 
            } 
           } 
          } 
         } 
        } 
       } ,... 

Trong khi kiểm tra email.php trả về một json mã hóa đúng nếu tất cả mọi thứ sẽ kiểm tra ra hoặc json mã hóa thông báo lỗi như

<span class="validationErrorTag">inactive</span>This address is not yet activated. 

Cuối cùng, tôi có một mục trong tập tin css của tôi để đảm bảo rằng các tiền tố không hiển thị:

.validationErrorTag { 
    display: none; 
} 

Như tôi đã nói, nó hoạt động và tôi sẽ sử dụng nó ngay bây giờ, nhưng làm việc với các tiền tố html ẩn để nhận ra thông báo lỗi có vẻ hơi thô đối với tôi. Vì vậy, nếu ai biết một giải pháp tốt hơn, xin vui lòng cho tôi biết.

1

Bây giờ tôi đã có thời gian thích hợp để đi qua sử dụng, thử này

var validator = $("#myForm").validate({ 
      rules: 
       { 
       emailForRequest: 
       { 
        required: true, 
        email: true, 
        remote: "emailcheck.php" 
       } 
      }, 
      messages: 
      { 
       emailForRequest: 
       { 
       remote: jQuery.format("{0}") 
       } 
      } 

     }); 
+0

Thật lạ, câu trả lời của bạn đã biến mất trong một giây và bây giờ tôi có thể truy cập lại. Xem chỉnh sửa câu hỏi ban đầu của tôi để xem những gì tôi đã có cho đến nay. – Peter

+0

Tôi đã chỉnh sửa câu trả lời của mình, điều đó sẽ thực hiện thủ thuật. Nếu bạn trả về true false từ php của bạn, nó sẽ hiển thị thông báo mặc định, nhưng nếu bạn trả về một chuỗi nó sẽ hiển thị chuỗi. –

+0

Hey Liam, trả về chuỗi lỗi không bao giờ là một vấn đề, đó là hành vi mặc định của trình xác thực. Vấn đề là ở đâu đó trong quá trình tôi cần phải nhận ra, mã khôn ngoan, lỗi nào được ném mà không phụ thuộc vào chuỗi, vì chính chuỗi đó biến đổi theo ngôn ngữ. Dù sao, cảm ơn vì đã suy nghĩ với tôi. Tôi tìm thấy một giải pháp mà tôi sẽ đổ vào một câu trả lời trong một phút. – Peter

1

jquery.validate.js - dòng 941:

success: function(response) { 
    validator.settings.messages[element.name].remote = previous.originalMessage; 
    var valid = response === true; 
    if (valid) { 
    .... 

Tôi nghĩ bạn có thể khá dễ dàng chèn của riêng bạn chức năng ở đây. Bạn có cả đáp ứng và tên phần tử có sẵn, vì vậy việc nhắm mục tiêu một phần tử có tên cụ thể sẽ khá dễ dàng. Nếu bạn không muốn sửa đổi bản thân tập lệnh (nghĩa là nó được tải từ máy chủ CDN), bạn có thể viết quy tắc xác thực từ xa của riêng mình dựa trên quy tắc ban đầu.

Khác với điều đó, AFAIK, không có hàm/phương thức tích hợp nào trả về tên của quy tắc không xác thực.

CẬP NHẬT

Một cách giải quyết cho việc tìm kiếm cả hai quy tắc và các yếu tố đó kích hoạt nó sẽ được xử lý nó tất cả trong errorPlacement chức năng:

... 
}, 
errorPlacement: function(error, element) { 
    error.insertBefore(element); // default positioning 

    if ((error == 'your error message') && (element.attr('id') == 'your_targets_id')) { 
     // your function 
    } 
}, 
... 

Hope this helps.

+0

Hey FreekOne, cảm ơn cho đầu vào. Tôi rất gần với một giải pháp dựa trên earliers của Liam (và biến mất?) Trả lời và gần với những gì bạn đề nghị nhưng ở một vị trí khác. Kiểm tra chỉnh sửa câu hỏi ban đầu của tôi. – Peter

+0

Vui lòng xem câu trả lời cập nhật của tôi. Về cơ bản bạn có thể xác định quy tắc bằng thông báo lỗi và phần tử theo ID của nó. Tôi đã không thử nghiệm nó, nhưng nó sẽ làm việc. –

+0

Chúc mừng bạn đời!Nhưng tôi có một vấn đề ở đây, tôi không thể sử dụng lỗi == 'thông báo lỗi của bạn' bởi vì tôi không biết thông báo lỗi (ngôn ngữ của nó phụ thuộc và có thể thay đổi bởi khách hàng của chúng tôi). Nhưng đó là một quỹ đạo thú vị nhất! – Peter

6

Không chắc chắn nếu chuỗi này vẫn mở, nhưng tôi đã có thể giải quyết vấn đề này với cuộc gọi addMethod và sử dụng một mảng để theo dõi thông báo lỗi cho phần tử biểu mẫu đó.

Đây là mã

//phone 
var phoneStatus = null; 
$.validator 
.addMethod(
    'validatePhone', 
    function() 
    { 
     $.ajax({ 
      url: /path/to/script, 
      async: false, 
      dataType: 'json', 
      data:{ formDataHere}, 
      success: function(data) 
      { 
       errorMessages['validatePhone'] = data.message; 
       phoneStatus = data.status; 
      }, 
      complete: function(){}, 
      error: function(){} 
     }); 
     return phoneStatus; 
    }, 
    function() 
    { 
     return errorMessages['validatePhone']; 
    } 
); 
+0

Điều này sẽ không trả về giá trị của 'phoneStatus' ngay lập tức và do đó phá vỡ xác nhận? – Moss

+0

Dòng khóa là 'async: false'. Điều này sẽ đợi cho đến khi cuộc gọi kết thúc, sau đó xử lý các hàm gọi lại, và sau đó câu lệnh 'return phoneStatus;' được thực hiện. –

0
var validator = $("#myForm").validate({ 
    rules: { 
     emailForRequest: { 
       required: true, 
       email: true, 
       remote: { 
        url: "emailcheck.php" , 
        type: "post" , 
        complete: function(data){ 
         if(data.responseText != true) { 
          var type = data.responseText.split('|'); 
          if(type[0]=='inactive') { 
             inactiveFunctionality(); 
// type[1] contains your message, display it using any method! e.g. $('#id').html(type[1]); or sooo! 
            } 
           } 
          } 
         } 
        } 
       } 

* OR **

bạn có thể sử dụng json! chỉ cần gửi văn bản trả lời ở định dạng json và kiểm tra ở đây dựa trên "." truy cập tài sản.

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