Tengo dos formularios en una página html. Usando jQuery, ¿es posible que los datos de ambos formularios entren en los datos POST cuando se envía el primero?Fusionar valores de dos formularios en enviar
Respuesta
Un método consiste en copiar todas las entradas de Form2 en form1 una vez que la verificación de validación de datos tiene éxito. Esto supone que no estás haciendo un envío de AJAX.
// new onsubmit function for form1
function form1_onsubmit()
{
if (!EntryCheck()) return false;
$('#form2 :input').not(':submit').clone().hide().appendTo('#form1');
return true;
}
Si quería atender a golpear presentará dos veces, posiblemente debido a submit fracaso desde el servidor, se necesitaría para eliminar cualquier entrada copiados antes de copiarlos en otros nuevos.
// 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 serializar es compatible con varios elementos de formulario, por lo que es posible hacer:
$('#form1, #form2').serialize();
Y para su caso, usted puede hacer:
$('#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;
});
Utilicé a continuación el código para enviar los datos de dos formularios en mi sitio web.
La idea es que se llega a los datos múltiples formas usando serialize
y combinar esos datos e igualar a que data
parámetro de la función $.ajax
.
.
// 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 !!');
}
}
}
Aunque su respuesta va más allá del alcance de la pregunta del OP, sí me ayudó a ver cómo ustedes logran la barra de progreso de la solicitud AJAX, así que gracias ^^ –
Mientras que las otras respuestas frente a la pregunta que hizo, puede valer la pena considerar por qué tienes 2 formas separadas, si desea enviar el contenido de ambos formas cada vez que el usuario envía una.
Si está utilizando 2 formularios diferentes para separarlos visualmente, un mejor enfoque puede ser usar CSS para colocar los elementos en la pantalla como lo desee. De esta forma, no confía en la presencia de Javascript para asegurarse de que sus formularios estén llenos correctamente.
Dado que estoy usando "formvalidator" .net "que valida las entradas ya sea en Blur o onSubmit, ¿cómo harías para alternar la visibilidad después de la validación? Realmente no vi una forma más allá de dividir el formulario en 2, donde el primer envío valida y muestra el segundo formulario, mientras que el último envía todos los datos. –
La solución de Roche Lachlan solo copia los elementos, pero no los valores. Esto se encargará de los valores así, y se puede utilizar para manejar cualquiera de las formas de presentación:
<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>
Y (se conmutan cuenta de los identificadores de forma pasados a la función) sus etiquetas de formulario sería algo como:
<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; }">
La validación de formulario puede encajar allí donde lo desee; tendría más sentido si su validador fuera otra función del objeto del remitente, o viceversa.
¡Esta debería ser la respuesta correcta! – Blackbam
este es el enfoque de javascript para combinar dos formularios. Lo pruebo en solicitud POST con Prototype y jQuery y funciona. Esta es la cosa:
var data1 = document.getElementById ('form1'). Serialize();
NOTA: '' es formulario1 forman id.You necesidad de establecer un plazo de < form id = "Form1"> </form>
var datos2 = document.getElementById ('') formulario2.publicar por fascículos();
NOTA: '' es formulario2 forman id.You necesidad de establecer un plazo de < forma id = "Form2"> </form>
Ahora usted tiene dos vars y dos datos serializados (arrays). Puedes fusionarlos fácilmente. Su formulario tendrá una assoc. array y puede obtener un problema cuando intente utilizar la función concat.
var mergeddata = data1 + '&' + data2;
Esto es todo! Puedes enviarlos fácilmente a través de una llamada jaja. Por ejemplo (Prototype.js):
nuevo Ajax.Request (url, { método: 'post', parámetros: mergeddata, ....
Cheers, Kristijan
Uso de serialize
combinar formularios y enviarlos usando ajax me funcionaba hasta que agregué un botón de "exportación" (para enviar datos como un archivo de Excel). Para eso tuve que hacer una devolución de datos completa. Así que terminé con este método. Escoge el técnica de fusión adecuada, y corrige algunos de los problemas con botones, selecciones y áreas de texto en el camino:
$("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;
});
Otra manera de combinar sus propios datos en forma de serializar
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'}) - un ejemplo más visual de lo que $ .param puede aceptar. – yuga
- 1. fusionar dos matrices (claves y valores) en un objeto
- 2. ¿Cómo usar dos formularios y enviar una vez?
- 3. Fusionar dos enteros en Python
- 4. Fusionar dos listas
- 5. Android fusionar dos imágenes
- 6. php fusionar dos matrices
- 7. fusionar dos expresiones regulares
- 8. fusionar y actualizar dos listas en C#
- 9. MVC asp.net: Enviar formularios múltiples
- 10. Cómo fusionar dos listas IQueryable
- 11. Cómo fusionar dos objetos java.util.Properties?
- 12. Evitar el envío de formularios duplicados en Asp.net MVC haciendo clic en enviar dos veces
- 13. JSF: Ejecutar valores de formularios múltiples
- 14. Fusionar dos archivos XML en Java
- 15. Cómo fusionar dos XmlDocuments en C#
- 16. ¿Cómo "fusionar" dos URI en Java?
- 17. fusionar dos componentes de la lista
- 18. Comunicar entre dos formularios de Windows en C#
- 19. C# fusionar dos objetos juntos en el tiempo de ejecución
- 20. ¿Cómo procesar dos formularios en una vista?
- 21. Fusionar dos objetos JSON mediante programación
- 22. ¿Cómo puedo fusionar dos tablas MySQL?
- 23. Cómo puedo fusionar dos árboles binarios
- 24. Uso de curl para enviar/recuperar resultados de formularios
- 25. Concatenar/fusionar/unir dos árboles AVL
- 26. ¿Extender una función - fusionar dos funciones?
- 27. Comparar (y fusionar) dos proyectos VS C#
- 28. ¿Qué alternativa tengo para enviar botones feos en formularios html?
- 29. ¿Cómo puedo fusionar dos mapas en la misma lista?
- 30. En Mercurial, ¿puedo fusionar solo algunos archivos entre dos ramas?
gracias! : D todas estas respuestas con ajax, eso es lo que necesitaba, no ajax – max4ever
Esto casi funcionó, entonces noté que en la documentación para 'clone()': "Por razones de rendimiento, el estado dinámico de ciertos elementos del formulario (p. Ej., Usuario) los datos escritos en textarea y las selecciones de usuario hechas a ** select **) no se copian en los elementos clonados. Al clonar elementos de entrada, el estado dinámico del elemento (por ejemplo, datos de usuario ingresados en entradas de texto y selecciones casilla de verificación) se conserva en los elementos clonados ". –
Muchas gracias. También funcionó para mí :) – Troubleshooter