orderproductForm
という名前のフォームと未定義の数の入力があります。
私はAjaxを介してページを呼び出し、orderproductForm
という形式のすべての入力を一緒に送信するようなjQuery.getやajax、あるいはそれに類するものを何でもしたいのです。
私は1つの方法はのような何かをすることだろうと思います
jQuery.get("myurl",
{action : document.orderproductForm.action.value,
cartproductid : document.orderproductForm.cartproductid.value,
productid : document.orderproductForm.productid.value,
...
しかし、私は正確にすべてのフォーム入力を知りません。すべてのフォーム入力を送信するだけの機能、機能、または何かありますか?
Ajax Form Plugin のajaxForm/ajaxSubmit関数、またはjQueryのシリアライズ関数を使用できます。
AjaxForm :
$("#theForm").ajaxForm({url: 'server.php', type: 'post'})
または
$("#theForm").ajaxSubmit({url: 'server.php', type: 'post'})
ajaxFormは送信ボタンが押されたときに送信します。 ajaxSubmitはすぐに送信します。
シリアライズ :
$.get('server.php?' + $('#theForm').serialize())
$.post('server.php', $('#theForm').serialize())
これは簡単な参照です。
// this is the id of the form
$("#idForm").submit(function(e) {
e.preventDefault(); // avoid to execute the actual submit of the form.
var form = $(this);
var url = form.attr('action');
$.ajax({
type: "POST",
url: url,
data: form.serialize(), // serializes the form's elements.
success: function(data)
{
alert(data); // show response from the php script.
}
});
});
お役に立てば幸いです。
Form要素で定義された属性を使ったもう一つの同様の解決策:
<form id="contactForm1" action="/your_url" method="post">
<!-- Form input fields here (do not forget your name attributes). -->
</form>
<script type="text/javascript">
var frm = $('#contactForm1');
frm.submit(function (e) {
e.preventDefault();
$.ajax({
type: frm.attr('method'),
url: frm.attr('action'),
data: frm.serialize(),
success: function (data) {
console.log('Submission was successful.');
console.log(data);
},
error: function (data) {
console.log('An error occurred.');
console.log(data);
},
});
});
</script>
注意すべき点がいくつかあります。
1.フォームを送信する方法はいくつかあります
したがって、ボタンクリックイベントではなく、 フォーム送信イベント にバインドする必要があります。これは私達のコードが現在そして未来のすべての装置と支援技術で働くことを保証するでしょう。
2.ハイジャック
ユーザーがJavaScriptを有効にしていない可能性があります。ここでは hijax パターンが適しています。ここではJavaScriptを使用してフォームを慎重に制御しますが、JavaScriptが失敗した場合は送信可能なままにします。
フォームからURLとメソッドを取得する必要があります。そのため、HTMLが変更されても、JavaScriptを更新する必要はありません。
3.目立たないJavaScript
event.preventDefault() の代わりに return false を使用すると、イベントが発生する可能性があるため、良い方法です。これにより、他のスクリプト、たとえばユーザーの操作を監視している可能性がある分析スクリプトなどをイベントに結び付けることができます。
速度
スクリプトをインラインで挿入するのではなく、理想的には外部スクリプトを使用するべきです。スクリプトタグを使用してページのヘッドセクションでこれにリンクするか、または速度を上げるためにページの下部にリンクすることができます。スクリプトは邪魔にならないように静かにユーザーエクスペリエンスを向上させるべきです。
コード
上記のすべてに同意し、submitイベントをキャッチしてAJAX(ハイジャックパターン)を介して処理したい場合は、次のようにします。
$(function() {
$('form.my_form').submit(function(event) {
event.preventDefault(); // Prevent the form from submitting via the browser
var form = $(this);
$.ajax({
type: form.attr('method'),
url: form.attr('action'),
data: form.serialize()
}).done(function(data) {
// Optionally alert the user of success here...
}).fail(function(data) {
// Optionally alert the user of an error here...
});
});
});
JavaScriptを使って好きなときにいつでも手動でフォーム送信を起動できます。
$(function() {
$('form.my_form').trigger('submit');
});
編集:
私は最近これをしなければならず、プラグインを書くことになった。
(function($) {
$.fn.autosubmit = function() {
this.submit(function(event) {
event.preventDefault();
var form = $(this);
$.ajax({
type: form.attr('method'),
url: form.attr('action'),
data: form.serialize()
}).done(function(data) {
// Optionally alert the user of success here...
}).fail(function(data) {
// Optionally alert the user of an error here...
});
});
return this;
}
})(jQuery)
あなたのformタグにdata-autosubmit属性を追加すれば、こうすることができます。
<form action="/blah" method="post" data-autosubmit>
<!-- Form goes here -->
</form>
$(function() {
$('form[data-autosubmit]').autosubmit();
});
FormData を使用することもできます(ただし、IEでは使用できません)。
var formData = new FormData(document.getElementsByName('yourForm')[0]);// yourForm: form selector
$.ajax({
type: "POST",
url: "yourURL",// where you wanna post
data: formData,
processData: false,
contentType: false,
error: function(jqXHR, textStatus, errorMessage) {
console.log(errorMessage); // Optional
},
success: function(data) {console.log(data)}
});
これが FormData の使い方です。
<form action="/my/ajax/url" class="my-form">
...
</form>
<script>
(function($){
$("body").on("submit", ".my-form", function(e){
e.preventDefault();
var form = $(e.target);
$.post( form.attr("action"), form.serialize(), function(res){
console.log(res);
});
});
)(jQuery);
</script>
Alfrekjv's answerの修正版です。
JavaScript
jQuery(document).submit(function(e){
var form = jQuery(e.target);
if(form.is("#form-id")){ // check if this is the form that you want (delete this check to apply this to all forms)
e.preventDefault();
jQuery.ajax({
type: "POST",
url: form.attr("action"),
data: form.serialize(), // serializes the form's elements.
success: function(data) {
console.log(data); // show response from the php script. (use the developer toolbar console, firefox firebug or chrome inspector console)
}
});
}
});
私はAlfrekjvの答えを編集したいのですが、それから大きく逸脱したので、これを別の答えとして投稿することにしました。
ファイルを送信しない、ボタンをサポートしない、たとえばボタンをクリックすると(送信ボタンを含む)フォームデータとして値を送信しますが、これはajaxリクエストなのでボタンクリックは送信されません。
ボタンをサポートするために、送信の代わりに実際のボタンクリックをキャプチャできます。
jQuery(document).click(function(e){
var self = jQuery(e.target);
if(self.is("#form-id input[type=submit], #form-id input[type=button], #form-id button")){
e.preventDefault();
var form = self.closest('form'), formdata = form.serialize();
//add the clicked button to the form data
if(self.attr('name')){
formdata += (formdata!=='')? '&':'';
formdata += self.attr('name') + '=' + ((self.is('button'))? self.html(): self.val());
}
jQuery.ajax({
type: "POST",
url: form.attr("action"),
data: formdata,
success: function(data) {
console.log(data);
}
});
}
});
サーバーサイドでは ajaxリクエストを検出することができます jqueryがphpのためにHTTP_X_REQUESTED_WITH
を設定するこのヘッダを使う
PHP
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
//is ajax
}
このコードはファイル入力でも動作します
$(document).on("submit", "form", function(event)
{
event.preventDefault();
$.ajax({
url: $(this).attr("action"),
type: $(this).attr("method"),
dataType: "JSON",
data: new FormData(this),
processData: false,
contentType: false,
success: function (data, status)
{
},
error: function (xhr, desc, err)
{
}
});
});
この答え by superluminary そして特に彼がラップした方法は jQuery プラグインの中の解決策です。それで superluminary のおかげで非常に役に立つ答えを得ることができます。私の場合は、プラグインが初期化されたときにオプションで success および error イベントハンドラを定義できるようにするプラグインが必要でした。
だからここに私が思い付いたものです:
;(function(defaults, $, undefined) {
var getSubmitHandler = function(onsubmit, success, error) {
return function(event) {
if (typeof onsubmit === 'function') {
onsubmit.call(this, event);
}
var form = $(this);
$.ajax({
type: form.attr('method'),
url: form.attr('action'),
data: form.serialize()
}).done(function() {
if (typeof success === 'function') {
success.apply(this, arguments);
}
}).fail(function() {
if (typeof error === 'function') {
error.apply(this, arguments);
}
});
event.preventDefault();
};
};
$.fn.extend({
// Usage:
// jQuery(selector).ajaxForm({
// onsubmit:function() {},
// success:function() {},
// error: function() {}
// });
ajaxForm : function(options) {
options = $.extend({}, defaults, options);
return $(this).each(function() {
$(this).submit(getSubmitHandler(options['onsubmit'], options['success'], options['error']));
});
}
});
})({}, jQuery);
このプラグインを使用すると、ページ上のHTMLフォームを非常に簡単に "ajaxify"し、ユーザーのフィードバックを実装するための onsubmit 、 success および error イベントハンドラを提供できます送信フォームのステータス。これにより、プラグインを次のように使用できます。
$('form').ajaxForm({
onsubmit: function(event) {
// User submitted the form
},
success: function(data, textStatus, jqXHR) {
// The form was successfully submitted
},
error: function(jqXHR, textStatus, errorThrown) {
// The submit action failed
}
});
success および error イベントハンドラは、 jQuery ajax メソッドの対応するイベントから受け取るのと同じ引数を受け取ります。
私は私のために以下を得ました:
formSubmit('#login-form', '/api/user/login', '/members/');
どこで
function formSubmit(form, url, target) {
$(form).submit(function(event) {
$.post(url, $(form).serialize())
.done(function(res) {
if (res.success) {
window.location = target;
}
else {
alert(res.error);
}
})
.fail(function(res) {
alert("Server Error: " + res.status + " " + res.statusText);
})
event.preventDefault();
});
}
これは、 'url'への投稿が{success: false, error:'my Error to display'}
の形式でajaxを返すことを想定しています。
好きなようにこれを変えることができます。そのスニペットを自由に使用してください。
jQuery AJAX送信フォーム 、ボタンをクリックしたときにフォームIDを使用してフォームを送信する
手順に従ってください
ステップ1 - フォームタグにはIDフィールドが必要です
<form method="post" class="form-horizontal" action="test/user/add" id="submitForm">
.....
</form>
クリックしようとしているボタン
<button>Save</button>
ステップ2 - submit eventはjQueryにあり、フォームの送信に役立ちます。以下のコードでは、HTML要素 name からJSONリクエストを準備しています。
$("#submitForm").submit(function(e) {
e.preventDefault();
var frm = $("#submitForm");
var data = {};
$.each(this, function(i, v){
var input = $(v);
data[input.attr("name")] = input.val();
delete data["undefined"];
});
$.ajax({
contentType:"application/json; charset=utf-8",
type:frm.attr("method"),
url:frm.attr("action"),
dataType:'json',
data:JSON.stringify(data),
success:function(data) {
alert(data.message);
}
});
});
ライブデモはリンクをクリックしてください
closest
の使用を検討
$('table+table form').closest('tr').filter(':not(:last-child)').submit(function (ev, frm) {
frm = $(ev.target).closest('form');
$.ajax({
type: frm.attr('method'),
url: frm.attr('action'),
data: frm.serialize(),
success: function (data) {
alert(data);
}
})
ev.preventDefault();
});
複数のフォームデータ送信を回避するには
フォームが再びサブミットされる前に、送信イベントのバインドを解除することを忘れないでください。Subit関数を複数回呼び出すことができます。何か忘れた、または検証エラーの可能性があります。
$("#idForm").unbind().submit( function(e) {
....
form 。serialize()を使用している場合は、各フォーム要素に次のような名前を付ける必要があります。
<input id="firstName" name="firstName" ...
そしてフォームは次のようにシリアル化されます。
firstName=Chris&lastName=Halcrow ...
あなたは以下のような送信機能でこれを使用することができます。
HTMLフォーム
<form class="form" action="" method="post">
<input type="text" name="name" id="name" >
<textarea name="text" id="message" placeholder="Write something to us"> </textarea>
<input type="button" onclick="return formSubmit();" value="Send">
</form>
jQuery関数:
<script>
function formSubmit(){
var name = document.getElementById("name").value;
var message = document.getElementById("message").value;
var dataString = 'name='+ name + '&message=' + message;
jQuery.ajax({
url: "submit.php",
data: dataString,
type: "POST",
success: function(data){
$("#myForm").html(data);
},
error: function (){}
});
return true;
}
</script>
より多くの詳細とサンプル訪問のために: http://www.spiderscode.com/simple-ajax-contact-form/ /
data
もオブジェクトになることができることをわかりやすく思い出してください。
$('form#foo').submit(function () {
$.ajax({
url: 'http://foo.bar/some-ajax-script',
type: 'POST',
dataType: 'json',
data: {
'foo': 'some-foo',
'bar': 'some-bar'
}
}).always(function (data) {
console.log(data);
});
return false;
});
これはOPの質問に対する答えではありません、
しかし、静的形式のDOMを使用できない場合は、このように試すこともできます。
var $form = $('<form/>').append(
$('<input/>', {name: 'username'}).val('John Doe'),
$('<input/>', {name: 'user_id'}).val('john.1234')
);
$.ajax({
url: 'api/user/search',
type: 'POST',
contentType: 'application/x-www-form-urlencoded',
data: $form.serialize(),
success: function(data, textStatus, jqXHR) {
console.info(data);
},
error: function(jqXHR, textStatus, errorThrown) {
var errorMessage = jqXHR.responseText;
if (errorMessage.length > 0) {
alert(errorMessage);
}
}
});