es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Falta el valor de submit en FormData: ¿se obtiene sin SubmitEvent.submitter, tal vez?

Cuando escucho el evento “submit” de un formulario <form> y obtengo los datos del formulario con FormData, por ejemplo, para enviarlos a través de una solicitud XHR, los datos del botón de envío no están presentes:

<form>
  <input type="text" name="x" value="foo" />
  <input type="hidden" name="y" value="bar" />
  <button type="submit" name="submit1" value="bar">submit1</button>
  <input type="submit" name="submit2" value="submit2" />
</form>

FormData tendrá los valores de x e y, pero no los de submit1 o submit2. Pruébalo en un Pen. Debería Me gustaría que contenga uno de ellos, específicamente el que desencadenó el envío, similar a los datos que se enviarían a action.

Podría hacer algo usando onsubmit, así:

form.onsubmit = function (evt) {
  var fd = new FormData(form);
  fd.append(evt.submitter.name, evt.submitter.value);
  // procesar fd...
});

PERO SubmitEvent.submitter es bastante nuevo, especialmente no compatible con IE y solo es compatible con Safari TP al momento de escribir esto.

¿Existe alguna forma de incluir el botón de envío en FormData sin hacer un truco como escuchar los eventos de clic de todos los inputs del formulario y crear, por ejemplo, inputs ocultos con sus datos?


Después de la respuesta aceptada, implementé un “polyfill”:

document.querySelectorAll('form').forEach(function (form) {
  // es posible que la consulta no incluya los botones sin el atributo @type
  form.querySelectorAll('[type="submit"]').forEach(function (submit) {
    submit.addEventListener('click', function () {
      var input = document.createElement('input');
      input.setAttribute('type', 'hidden');
      input.setAttribute('name', this.name);
      input.setAttribute('value', this.value);
      this.form.appendChild(input);
    });
  });
});
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, no hay una forma integrada de obtener los datos del botón de enviar en FormData sin usar un método alternativo como el que se describe en la pregunta o el polyfill proporcionado en la respuesta aceptada.

    La propiedad SubmitEvent.submitter se introdujo bastante recientemente y no es compatible con todos los navegadores, por lo que confiar en ella puede no ser práctico en muchos casos.

    Una solución alternativa que se sugirió en la pregunta es escuchar los eventos de clic de todos los elementos de entrada del formulario y crear entradas ocultas con sus datos. Si bien esto puede funcionar, no es muy eficiente y puede producir comportamientos inesperados.

    Otra solución alternativa que se sugirió en la respuesta aceptada es utilizar un “polyfill” que escucha los eventos de clic de todos los botones de enviar en el formulario, crea entradas ocultas con sus datos y las añade al formulario antes de enviarlo. Este enfoque es más eficiente que el anterior y debería funcionar de manera confiable en la mayoría de los casos.

    En resumen, si bien sería bueno tener una solución integrada para este problema, utilizar un método alternativo como el descrito en la respuesta aceptada es actualmente la mejor opción.

Comments are closed.