私はorderproductForm
という名前のフォームを持っており、入力数は未定義です。
jQuery.getやajaxなどを使って、Ajaxでページを呼び出し、フォームorderproductForm
のすべての入力内容を送信したいと思います。
ひとつの方法としては、次のようなものが考えられます。
jQuery.get("myurl",
{action : document.orderproductForm.action.value,
cartproductid : document.orderproductForm.cartproductid.value,
productid : document.orderproductForm.productid.value,
...
しかし、私はすべてのフォーム入力を正確に把握していません。すべてのフォーム入力を送信するような機能、関数などはありますか?
これは簡単な参考資料です。
// 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.
}
});
});
ご参考になれば幸いです。
Ajax Form Plugin]1のajaxForm/ajaxSubmit関数や、jQueryのserialize関数を使用することができます。
AjaxForm。
$("#theForm").ajaxForm({url: 'server.php', type: 'post'})
または
$("#theForm").ajaxSubmit({url: 'server.php', type: 'post'})
ajaxFormは送信ボタンが押されたときに送信します。ajaxSubmitは即座に送信します。
Serialize。
$.get('server.php?' + $('#theForm').serialize())
$.post('server.php', $('#theForm').serialize())
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.Hijax
ユーザーはJavaScriptを有効にしていない可能性があります。 ここでは hijax パターンが良いでしょう。ここでは JavaScript を使ってフォームを優しく制御しますが、JavaScript が失敗した場合は送信可能なままにしておきます。
HTMLが変更されても、JavaScriptを更新する必要はありません。
3. 邪魔にならないJavaScript。
return false の代わりに event.preventDefault() を使用することは、イベントをバブルアップさせることができるので、良い習慣です。 これにより、ユーザーのインタラクションを監視している分析スクリプトなど、他のスクリプトをイベントに関連付けることができます。
スピード
スクリプトをインラインで挿入するのではなく、外部スクリプトを使用するのが理想的です。 ページのヘッドセクションでスクリプトタグを使用してリンクするか、スピードを上げるためにページの下部にリンクします。 スクリプトは、邪魔にならないように、静かにユーザーエクスペリエンスを向上させるべきです。
コード
上記のすべてに同意して、submitイベントをキャッチしてAJAX(hijaxパターン)で処理したいと仮定すると、次のようなことができます。
$(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)
フォームタグに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][1]の使い方はこんな感じです。
[1]: https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest/FormData/Using_FormData_Objects
<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](https://stackoverflow.com/users/804978/alfrekjv)の回答の修正版です。
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さんの回答を編集したかったのですが、あまりにも逸脱していたので、これを別の回答として投稿することにしました。
ファイルを送信しない、ボタンをサポートしない、例えばボタンをクリックすると(送信ボタンを含む)その値をフォームデータとして送信しますが、これはアジャックスリクエストなので、ボタンクリックは送信されません。
ボタンをサポートするためには、送信の代わりに実際のボタンクリックをキャプチャすることができます。
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);
}
});
}
});
サーバ側では、jqueryが HTTP_X_REQUESTED_WITH
を設定したこのヘッダで ajaxリクエストを検出 することができます。
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)
{
}
});
});
私は[superluminary][2]の[この回答][1]がとても好きで、特に彼が解決策をjQueryプラグインに包んだ方法が好きでした。 superluminary][2]さんの回答に感謝します。 しかし、私の場合は、プラグインが初期化されたときにオプションによって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". ページ上のhtmlフォームと、フォーム送信のステータスのユーザーへのフィードバックを実装するための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
}
});
ccessとerrorイベント・ハンドラは、jQuery ajaxメソッドの対応するイベントから受け取るのと同じ引数を受け取ることに注意してください。
[1]: https://stackoverflow.com/a/16419406/649497 [2]: https://stackoverflow.com/users/687677/superluminary
以下のようなものをもらった。
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 submit formは、ボタンをクリックした時にフォームIDを使ってフォームを送信するだけのものです。
手順に従ってください。
ステップ 1 - フォームタグには ID フィールドが必要です。
<form method="post" class="form-horizontal" action="test/user/add" id="submitForm">
.....
</form>
クリックするボタン
<button>Save</button>
ステップ2 - submitイベントは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);
}
});
});
ライブデモのために以下のリンクをクリックしてください
jQuery AJAXを使ってフォームを投稿する方法][1
[1]:
使うことを考える
$('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();
});
以下のような送信関数で使用することができます。
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/
これは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);
}
}
});
ただ、data
はオブジェクトにもなりうるということを思い出してください。
$('form#foo').submit(function () {)
$.ajax({)
url.
http://foo.bar/some-ajax-script'.
タイプを指定します。
タイプ: POST'。
データタイプ。
のようになります。
data: {
のようになります。
そのような場合には、そのようなデータは必要ありません。
バーのようなものです。
のようになります。
}
}).always(function (data) {
console.log(data).
});
falseを返します。
});
これは jQuery
に関連した質問であることはわかっていますが、最近では JS ES6 を使うことでより簡単になりました。
純粋な javascript
の答えはないので、シンプルで純粋な javascript
のソリューションを追加してみようと思いました。
これはネットワークリクエストを実装する現代的な方法です。
あなたの場合、すでにフォーム要素があるので、それを使ってリクエストを構築することができます。
const form = document.forms["orderproductForm"];
const formInputs = form.getElementsByTagName("input");
let formData = new FormData();
for (let input of formInputs) {
formData.append(input.name, input.value);
}
fetch(form.action,
{
method: form.method,
body: formData
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.log(error.message))
.finally(() => console.log("Done"));