tags:

views:

149

answers:

2

I'm trying to use the jQuery forms plugin to dynamically submit a form on change.

It's definitely working, but everytime a user changes an input value, it does the .post, runs my success "alert()" and then repeats, over and over, until I refresh the page to stop the loop. Here's the code:

<!DOCTYPE html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>AJAX Form Test Suite</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"&gt;&lt;/script&gt;
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js"&gt;&lt;/script&gt;
<script src="_scripts/jquery.form.js"></script>
<script>
    $(document).ready(function() {
    var options = { 
        success:       alertYes // post-submit callback 
    }; 

    // binding to each input's change event 
    $('#mainForm input').change(function() { 

        $(this).parent().ajaxSubmit(options); 

        return false; 
    });

    //success callback function
    function alertYes()  {      
        alert('You did it!'); 
    } 
});
</script>
</head>

<body>
<div id="ajaxMessage">
<h1>This is a suite AJAX form</h1>
<form id="mainForm" action="saveForm.php" method="post">
    <ul class="nolist">
    <li class="label"><label>Name</label></li>
    <li class="input"><input type="text" name="name" value="Eric Roberts" /></li>
    <li class="label"><label>Email</label></li>
    <li class="input"><input type="text" name="email" value="[email protected]" /></li>
    <li class="label"><input type="submit" name="submit" value="DO IT" /></li>
    </ul>
</form>
</div>
</body>
</html>

What am I doing wrong to make it continually loop like that? I'm assuming it's something where when the .post returns, after the alert, it blurs an input again which resubmits the ajax call, over and over, but I don't know why it would do that?

Thanks.

+1  A: 

Any chance I can persuade you to bind to the .change event on inputs instead? That would probably solve this, and you'll avoid a lot of unneeded submits. Right now if someone tabs in and then out of a form (without changing anything) it'll submit, which is a pointless submit. .Change is probably closer to what you're looking to do anyway.

Parrots
Thanks, that's true. I was worried that .change would submit the form on each changing keystroke, but that's not the case is it?
Jason Rhodes
Nope, that would be the keyup or keydown event. From jQuery docs: The change event fires when a control loses the input focus and its value has been modified since gaining focus.
Parrots
Fantastic. Thanks again.
Jason Rhodes
+4  A: 

I believe your alert() call is causing the blur() event of the form to trigger, thus making the form resubmit.


update

If you're using Firebug, you can use the following javascript:

console.debug('my message goes here');

to emit messages to the Firebug console. I typically wrap it in a call like this:

function status(msg)
{
  if(console)
    console.debug('# '+msg);
  }
}

and then call status('my message here...') within my javascript to emit any debugging/trace messages that I require. By wrapping it in a function as I've done above, you ensure that the code will still work when running in a browser that hasn't defined the console object, (IE or any browser that doesn't have Firebug installed).

David Lively
Yes sir, that was it. I didn't realize alert() made blur() trigger. I don't need the alert, was just using it to test, so easy fix. Thanks!
Jason Rhodes