2012-05-28 24 views
7

Tôi đang tạo biểu mẫu liên hệ và tôi cần trợ giúp với trình xác thực jQuery.Trả về giá trị true/false của hàm javascript và sau đó thực hiện các công cụ dựa trên đó

function contactform() { 
    $("form #submit").on("click", function() { 
     $("form input").removeClass("error"); 
     validator(); 
     // 3rd action goes here 
    }); 
}); 

validator() kiểm tra xem nếu có đầu vào được để trống, và nếu như vậy nó sẽ thêm một lớp lỗi với nó:

function validator() { 
    $("form input").each(function() { 
     var value = $(this).val(); 
     if (value.length <= 0) { 
      $(this).addClass("error"); 
      return false; 
     } 
    }); 
}); 

Bây giờ, đối với các hành động thứ 3 trong contactform() tôi muốn nói rằng nếu validator() = true (nghĩa là không có đầu vào nào trống), sau đó tiếp tục đến mã tiếp theo.

Tôi dường như không thể trả lại giá trị của validator(). Có ai biết cách tốt nhất để làm điều này?

Trả lời

7

Dưới đây là một giải pháp sử dụng filter phương pháp:

function validator() { 
    return $("form input").filter(function() { 
     return $.trim(this.value).length == 0; 
    }).addClass("error").length == 0; 
}); 

function contactform() { 
    ... 
    if (validator()) { 
     // it's OK 
    } else { 
     // there are errors 
    } 
} 

CẬP NHẬT: awesomely cập nhật với the help của @am_not_i_am. Cảm ơn!

+1

Nếu bạn chuỗi '.addClass (" error ")' vào cuối '.filter', thì bạn chỉ có thể làm' return $ .trim ($ (this) .value()). Length == 0' phía trong. –

+1

... nhưng +1 vì tôi thích phương pháp '.filter'. –

+1

+1 vì tôi cũng giống như hàm 'filter()', nếu chỉ có ở đó có thêm một thingy bằng nhau khi kiểm tra không? – adeneo

3
function validator() { 
    var result = true; 
    $("form input").removeClass("error"); 
    $('form input').each(function() { 
      if(!$.trim(this.value)) { 
      $(this).addClass('.error'); 
      result = false; 
      } 
    }); 
    return result; 
} 


function contactform() { 
    $("form #submit").on("click", function() { 
     if(validator()) { // pass the validation 

     } else { // fail validation 

     } 
     // 3rd action goes here 
    }); 
}); 
+0

Bạn đã đánh bại tôi sau 10 giây! :) – Hidde

+0

Vâng, anh ấy thực sự rất nhanh! Bất kỳ lý do nào thì phương thức trim là cao hơn phương thức .val()? Ngoài ra, không 'nếu (giá trị)' khá nhiều có nghĩa là "nếu giá trị là không có gì"? Trong hàm xác thực thứ 2 của bạn, khi nào nó thực thi? Tôi có trình duyệt xác thực gọi hành động() để chạy - tôi dường như không thể tìm ra nó trên máy của bạn. – izolate

+1

Hmm ... '.filter()' của bạn không thực hiện bất kỳ bộ lọc nào. Hay chính xác hơn, nó sẽ lọc bộ lọc xuống mọi lúc, nhưng không làm gì với kết quả. Theo cách của nó, nó thực sự không khác với '.each()'. –

4

Vấn đề bạn gặp phải là bạn có chức năng lồng nhau và đóng, ngăn bạn trực tiếp trả lại giá trị.

Something như thế nên làm các trick:

function validator() { 
    var result=true; 
    $("form input").each(function() { 
     var value = $(this).val(); 
     if (value.length <= 0) { 
      $(this).addClass("error"); 
      result = false; 
     } 
    }); 
    return result; 
}); 
+0

Câu trả lời của bạn là gần nhất với tôi và do đó là người duy nhất ở đây mà tôi hiểu, vì vậy cảm ơn vì điều đó. – izolate

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