我在一個html頁面上有兩種形式。使用jQuery,當提交第一個數據時,是否有可能將這兩個表單中的數據放入POST數據中?合併提交的兩種形式的值
回答
一種方法是複製所有的窗口2的輸入一旦數據驗證檢查成功,就會將其轉換爲form1。這假定你沒有做AJAX提交。
// new onsubmit function for form1
function form1_onsubmit()
{
if (!EntryCheck()) return false;
$('#form2 :input').not(':submit').clone().hide().appendTo('#form1');
return true;
}
如果你想迎合點擊提交兩次,可能是因爲從服務器提交失敗,我們需要在新的複製之前刪除任何複製輸入。
// new onsubmit function for form1
function form1_onsubmit()
{
$('#form1 :input[isacopy]').remove();
if (!EntryCheck()) return false;
$('#form2 :input').not(':submit').clone().hide().attr('isacopy','y').appendTo('#form1');
return true;
}
jQuery的序列化支持多種表單元素,所以這是可以做到的:
$('#form1, #form2').serialize();
而對於你的情況,你可以這樣做:
$('#form1').submit(function() {
var action = $(this).attr('action');
if (!EntryCheck()) return false;
$.ajax({
url : action,
type : 'POST',
data : $('#form1, #form2').serialize(),
success : function() {
window.location.replace(action);
}
});
return false;
});
我用下面的代碼在我的網站上提交兩個表單的數據。
的想法是,你使用serialize
,並結合數據和平衡,要在$.ajax
功能data
參數多種形式的數據得到。
。
// submits two forms simultaneously
function submit_forms(form1_id, form2_id)
{
var frm1_name = $("#" + form1_id).attr('name');
var frm2_name = $("#" + form2_id).attr('name');
if (frm1_name == frm2_name)
{
alert('The two forms can not have the same name !!');
}
else
{
var frm1_data = $("#" + form1_id).serialize();
var frm2_data = $("#" + form2_id).serialize();
if (frm1_data && frm2_data)
{
$("#div_busy").html('<strong>Processing...</strong><br /><img id="busy" src="./images/progress_bar.gif" border="0" style="display:none;" />');
$("#busy").fadeIn('slow');
$.ajax(
{
type: "POST",
url: "process_sticker_request.php",
data: frm1_data + "&" + frm2_data,
cache: false,
error: function()
{
$("#busy").hide('slow');
$("#div_busy").css({'color':'#ff0000', 'font-weight':'bold'});
$("#div_busy").html('Request Error!!');
},
success: function(response)
{
$("#div_busy").hide('slow');
$("#hdnFormsData").html(response);
// open popup now with retrieved data
window.open('', 'popup2', 'toolbars = 1, resizable=1, scrollbars=1, menubar=1');
document.getElementById("prt").action = 'win_sticker.php';
document.getElementById("prt").target = 'popup2';
document.getElementById("prt").submit();
// reset the action of the form
document.getElementById("prt").action = 'list_preview.php';
}
});
}
else
{
alert('Could not submit the forms !!');
}
}
}
雖然你的答案遠遠超出了OP的問題的範圍,但它確實幫助我看到你們如何取消AJAX請求的進度條,所以感謝那^^ – 2014-02-19 00:18:10
而其他的答案解決你問的問題,可能你爲什麼有2種獨立的形式,如果你想發送的每當用戶提交一個既形式的內容是值得考慮的。
如果您使用2種不同的表單直觀地將它們分開,更好的方法可能是使用CSS將元素放置在屏幕上,如您所願。這樣,您就不依賴Javascript的存在來確保您的表單正確填充。
鑑於我正在使用「formvalidator .net「驗證輸入是onBlur還是onSubmit,在驗證之後如何切換可見性? 我沒有真正看到一種將表格拆分爲2的方式,其中第一個提交驗證並顯示第二個表單,而最後一個提交所有數據。 – 2014-02-19 00:14:51
Lachlan Roche的解決方案僅複製元素,但不復制值。這會照顧值的爲好,可用於處理任何一種形式提交:
<script type="text/javascript">
var submitter = {
combine: function (form1, form2) {
$('#' + form1 + ' :input[isacopy]').remove();
$('#' + form2 + ' :input').not(':submit').not('textarea').not('select').each(function() { $(this).attr('value', $(this).val()); });
$('#' + form2 + ' textarea').each(function() { $(this).text($(this).val()); });
$('#' + form2 + ' select').each(function() { $('option[value!="' + $(this).val() + '"]', this).remove(); $('option[value="' + $(this).val() + '"]', this).attr('selected', 'selected'); });
$('#' + form2 + ' :input').not(':submit').clone().hide().attr('isacopy','y').appendTo('#' + form1);
return true;
}
};
</script>
而且你的表單標籤看起來是這樣的(注意傳遞給函數的形式IDS切換):
<form name="my_first_form" id="my_first_form" method="post" onsubmit="if (!submitter.combine('my_first_form', 'my_second_form')) { return false; }">
...
<form name="my_second_form" id="my_second_form" method="post" onsubmit="if (!submitter.combine('my_second_form', 'my_first_form')) { return false; }">
表單驗證可以適用於任何你喜歡的地方 - 如果你的驗證器是提交者對象的另一個函數,反之亦然,這將是最有意義的。
這應該是正確的答案! – Blackbam 2017-07-03 23:59:04
這是乾淨的JavaScript方法合併兩種形式。我使用Prototype和jQuery在POST請求上測試它,它可以工作。這是事情:
var data1 = document.getElementById('form1')。serialize();
注: 'form1中' 是形成id.You需要內<表格ID = 「form1中」> </FORM>
變種DATA2 =的document.getElementById( '窗口2')設置它。連載();
注: '窗口2' 是形成id.You需要內<表格ID = 「窗口2」 設置> </FORM>
現在你有兩個瓦爾和兩個串行化數據(數組)。您可以輕鬆地合併它們。你的表單將會有關聯。數組,當您嘗試使用concat函數時,可能會出現問題。
var mergeddata = data1 +'&'+ data2;
這就是它!您可以通過ajax調用輕鬆發送它們。例如(的Prototype.js):
新的Ajax.Request(URL,{ 方法: '後', 參數:mergeddata,....
乾杯, Kristijan
使用serialize
結合表單和提交使用Ajax一直工作,直到我添加一個「導出」按鈕(發送數據作爲Excel文件)。爲此,我需要做一個完整的回發,所以我最終選擇了這種方法。適當的合併技術,並修復了一些按鈕,選擇和textareas一路上的問題:
$("body").on("submit", ".combineForm", function() {
var frm = $(this);
var action = frm.attr("action");
var method = frm.attr("method");
var target = frm.data("updateTarget");
var combined = $(".combineForm");
//get the submit button that was clicked
var btn = $(this).find("button[type=submit]:focus");
var btnName = btn.attr("name");
var btnValue = btn.attr("value");
//create an in memory form to avoid changing the existing form
var f = $("<form action='" + action + "' method='" + method + "'/>")
//Browsers send the name and value of the clicked button but serialize, clone and our copy can't
//So add a hidden field to simulate browser behaviour
if (btnName)
f.append("<input name='" + btnName + "' type='hidden' value='" + btnValue + "' />")
if (btnValue === "export") {//exporting to a file needs full submit
//merge forms with class 'combineForm' by copying values into hidden inputs
// - cloning doesn't copy values of select or textareas
combined.find(":input").not("submit").each(function() {
var inp = $("<input name='"
+ $(this).attr("name")
+ "' type='hidden' value='"
+ $(this).val() + "' />")
f.append(inp);
});
f[0].submit();
return false;
}
//merge forms for ajax submit
var data = combined.serialize() + "&" + f.serialize();
$.ajax({
url: action,
type: 'POST',
data: data,
dataType: "html",
success: function (html) {
$(target).html(html);
}
});
return false;
});
另一種方法是你自己的數據合併到形式連載
var data = {};
data['key'] = 'value';
e.preventDefault();
$.ajax({
url : url,
dataType : 'json',
type : 'post',
data : $(this).serialize() + '&' + $.param(data),
success : function(data) {
},
error : function() {
}
});
$ .param({key:'value',anotherKey:'anotherValue'}) - $ .param可以接受的更直觀的示例。 – yuga 2017-11-10 11:58:37
- 1. 兩種形式提交值
- 2. 從一個提交的兩種形式的值提交按鈕
- 3. 兩種形式一提交
- 4. 提交兩種形式
- 5. 合併兩種形式codeigniter
- 6. 兩種形式,一種提交按鈕
- 7. 兩種形式之一提交 - 提交,延遲,提交
- 8. 兩種形式的HTML,只驗證提交的形式
- 9. 兩種形式,一是提交軌
- 10. 一種形式兩個提交按鈕
- 11. 兩種形式一個提交按鈕
- 12. 如何合併兩種形式
- 13. jQuery Ajax窗體兩種提交按鈕的一種形式
- 14. 我在頁面上有兩種形式,但提交按鈕提交這兩種形式
- 15. HTML |一種形式一種提交兩種行動
- 16. 提交多種形式
- 17. PHP - 多種形式,在提交時從兩者獲取值?
- 18. Laravel 4 - 兩種提交按鈕的一種形式,並提交由不同的行動處理
- 19. 從一種模式的兩種形式兩種形式在提交一張表格時生效
- 20. 提交form2輸入值取決於form1輸入值的兩種形式值
- 21. 通過複選框啓用多種形式並提交提交
- 22. 兩種提交按鈕的一種形式執行兩個不同的servlets
- 23. c# - 組合兩種形式
- 24. 以一種形式提交兩個不同的目的地
- 25. 提交ActionLink的一種形式mvc4
- 26. HTML兩種形式和兩個提交在同一頁上
- 27. Rails /常規HTML:如何提交兩種形式的內容?
- 28. 一種形式的兩個提交按鈕
- 29. Rails中提交兩種形式共享相同的PARAM
- 30. 兩種形式的列布局,提交按鈕之間對齊
謝謝!!! :D所有這些答案與ajax,這就是我所需要的,沒有ajax – max4ever 2011-07-13 09:48:06
這幾乎工作,然後我注意到,在克隆()的文檔中:「出於性能原因,某些表單元素的動態狀態(例如,用戶輸入到textarea中的數據以及對** select **進行的用戶選擇不會複製到克隆的元素中。克隆輸入元素時,元素的動態狀態(例如,輸入到文本輸入中的用戶數據和用戶選擇複選框)保留在克隆的元素中。「 – 2014-05-13 19:14:13
非常感謝。它也適用於我:) – Troubleshooter 2015-09-27 09:43:20