I've just started learning jQuery and already love it, but my skills aren't enough yet to solve this probably simple problem for my work: I have 3 different forms with an input field immediately followed by submit button:
I would like to prevent form submission if the text input field or the textarea before the submit button is empty. I've stolen a snippet from the jQuery Ninja book:
$(function() {
$(':submit').click(function(e) {
$(':text').each(function() {
if ($(this).val().length == 0) {
$(this).css('border', '2px solid red');
}
});
e.preventDefault();
});
});
But it has following problems:
- It ignores the textarea in the last form, because
$(':text').each()
does not apply to it - It doesn't allow submitting any form - I guess I need to move
preventDefault()
under an "if" - I probably should better use
prev()
instead ofeach()
- If the user changes her mind and clicks another form, the previous form sh开发者_JS百科ould be cleared
Could someone help me please? Alex
UPDATE:
I've tried:
$(function() {
$(':submit').click(function(e) {
$(this).prev(function() {
if ($(this).val().length < 2) {
// would be good to clear border for
// each text and textarea here...
$(this).css('border', '2px solid red');
e.preventDefault();
}
});
});
});
but unfortunately get 2 warnings:
Warning: Unexpected token in attribute selector: '!'.
Warning: Unknown pseudo-class or pseudo-element 'submit'.
and the red border doesn't appear and the form is submitted when a button is clicked.
Also I've tried:
$(function() {
$('form').submit(function(e) {
$(':text, textarea').each(function() {
if ($(this).val().length < 2) {
$(this).css('border', '2px solid red');
e.preventDefault();
}
});
});
});
but the form is never submitted and all 3 text fields turn red instead of just one.
<script type="text/javascript" src="/jquery-1.4.4.min.js"></script>
<script type="text/javascript">
$(function() {
$(':submit').click(function(e) {
$(':text, textarea').each(function() {
if ($(this).val().length == 0) {
$(this).css('border', '2px solid red');
e.preventDefault();
}
});
});
});
</script>
You'll probably be ok with .each() :)
Code for click and enter the submit button
$(":input").bind("click keypress", function (evt) {
var keyCode = evt.which || evt.keyCode;
var sender = evt.target;
if (keyCode == 13 || sender.type == "submit") {
evt.preventDefault();
//add your validations here
}
and submit the form.
- Because
(':text') is equivalent to $('[type=text]')
so it doesn't include textarea. Change to$(':text, textarea')
. - Correct
No,
prev
doesn't loop over the collection,each
does. (prev
selects the previous sibling of the current element)Have a look a http://bassistance.de/jquery-plugins/jquery-plugin-validation/ , it is a great validation plugin.
精彩评论