次のようなフォームがあります。
_<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>
_
フォームの送信($("vote_form").submit()
)にバインドすると、ユーザーがクリックした画像にアクセスできないようです。だから私は画像自体をクリックすることにバインドしようとしています($(".vote_down, .vote_up").click()
)、私がしようとするかどうかに関係なく、常にフォームを送信します
これらはすべてフォームイベントだからです。
$ .post()をform.submit()イベントにアタッチする必要があります。アタッチする場合、ユーザーがクリックした入力をどのように通知するか、または
$ .post()を画像のクリックに添付する必要があります。添付する場合は、フォームが送信されないようにする方法を教えてください。
これが私のjQueryコードが今どのように見えるかです:
_$(".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!?
});
_
エメットの答えに基づいて、これに対する私の理想的な修正は、次のように、Javascript自体でフォームの送信を殺すことでした:
$(".vote_form").submit(function() { return false; });
そして、それは完全に機能しました。
完全を期すために、元の投稿にある私のJSコードの一部には少しの愛が必要です。たとえば、serialize関数に追加する方法が機能していないようです。これはしました:
$form.serialize() + "&submit="+ $(this).attr("value")
これが私のjQueryコード全体です:
$(".vote_form").submit(function() { return false; });
$(".vote_up, .vote_down").click(function(event) {
$form = $(this).parent("form");
$.post($form.attr("action"), $form.serialize() + "&submit="+ $(this).attr("value"), function(data) {
// do something with response (data)
});
});
別の解決策は、非表示フィールドを使用して、onclickイベントでその値を更新することです。これにより、JavaScriptだけでなく、非表示フィールドが投稿されるサーバーからもアクセスできます。
画像をクリックするだけでフォーム送信をトリガーできます。これはpreventDefault()で機能します。
var vote;
$(".vote_up, .vote_down").click(function(event) {
vote = $(this).attr("class");
$(".vote_form").trigger("submit");
});
$(".vote_form").submit(function(event) {
$form = $(this);
$.post($form.attr("action"), $form.serialize() + "&submit="+ vote, function(data) {
// do something with response (data)
});
event.preventDefault();
});
方法がわかりませんreturn false
とpreventDefault
は仕事に失敗しました。画像ボタンをリンクされた画像に置き換えてみてください:
<a href="#" class="vote_down"><img src="vote_down.png"/></a>
$('#vote_form > a').click(function(e) {
e.preventDefault();
//one way to know which image was clicked
alert($(this).attr('class'));
$.post(...
});
送信イベントにバインドすることで、フォームが送信されないようにすることができます。例:
$('#vote_form').submit(function() {
return false;
});
また、ajaxを介してフォームを送信するためのあらゆる種類の素晴らしいツールとして、jquery From Pluginを試すこともできます。
Onsubmit = "return false;"を追加してみてくださいフォームに送信し、JavaScriptを使用してフォームを送信します。
<form action="/vote/" method="post" name="vote_form" class="vote_form" onsubmit="return false;">
<input type="hidden" name="question_id" value="10" />
<input type="image" src="vote_down.png" class="vote_down" name="submit" value="down" onclick="imageClicked(this)"/>
<input type="image" src="vote_up.png" class="vote_up" name="submit" value="up" onclick="imageClicked(this)"/>
</form>
<script>
function imageClicked(img) {
alert(img.className);
document.forms["vote_form"].submit();
}
</script>
Formプラグイン(使用する必要があります)に頼らずに、代わりに送信イベントを処理する必要があります。コードは元のコードにかなり近いままです。
$("form").submit(function()) {
$.post($(this).attr("action"), $(this).serialize(), function(data) {
// work with the response
});
return false;
});
var form = jQuery('#myform');
var data = form.serialize();
// add the button to the form data
var btn = jQuery('button[name=mybuttonname]').attr('value');
data += '&yourpostname=' + btn;
var ajax = jQuery.ajax({
url: url,
type: 'POST',
data: data,
statusCode: {
404: function () {
alert("page not found");
}
}
});
... rest of your code ...