I have a form that looks like this:
<form action="/vote/" method="post" class="vote_form">
<input type="hidden" name="question_id" value="10" />
<input type="image" src="vote_down.png" class="vote_down" name="submit" value="down" />
<input type="image" src="vote_up.png" class="vote_up" name="submit" value="up" />
</form>
When I bind to the form's submit ($("vote_form").submit()
), I don't seem to have access to which image the user clicked on. So I'm trying to bind to clicking on the image itself ($(".vote_down, .vote_up").click()
), which always submits the form, regardless of whether I try
- return false;
- event.stopPropogation(); or
- event.preventDefault();
because all of those are form events.
Should I attach my $.post() to the form.submit() event, and if so, how do I tell which input the user clicked on, or
Should I attach my $.post() to the image click, and if so, how do I prevent the form from submitting also.
Here is what my jQuery code looks like now:
$(".vote_up, .vote_down").click(function (event) {
$form = $(this).parent("form");
$.post($form.attr("action"), $form.find("input").serialize() + {
'submit': $(this).attr("value")
}, function (data) {
// do something with data
});
return false; // <--- This doesn't prevent form from submitting; what does!?
});
Based on Emmett's answer, my ideal fix for this was just to kill the form's submit with Javascript itself, like this:
And that totally worked.
For completeness, some of my JS code in the original post need a little love. For example, the way I was adding to the serialize function didn't seem to work. This did:
Here's my entire jQuery code:
I don't get how
return false
andpreventDefault
failed to do their job. Maybe try replacing the image buttons with linked images:You can always ensure that a form does not submit by binding to the submit event, e.g.:
Another solution is to use a hidden field, and have the onclick event update its value. This gives you access from javascript, as well as on the server where the hidden field will get posted.
You can trigger the form submit on the click of the images. This will work with the preventDefault().
Without resorting to the Form plugin (which you should use) you should be handling the submit event instead. The code would stay pretty close to the original: