jquery - llenar - ¿Cómo puedo desactivar un botón de envío de formulario de Drupal cuando se hace clic para evitar el doble envío?
habilitar y deshabilitar botones en jquery (4)
Suena como una simple pregunta. He añadido un poco de magia jQuery:
$("#edit-save").click(function(event) {
$(this).attr("disabled", "true");
});
Sin embargo, una vez que esto esté en su lugar, mi manejador de envío de formularios no recibe una llamada.
Esta es una forma personalizada en mi propia ruta definida en hook_menu:
$items[''my_form''] = array(
''title'' => ''My form'',
''page callback'' => ''drupal_get_form'',
''page arguments'' => array(''mymod_myform''),
''type'' => MENU_CALLBACK,
);
En el formulario, tengo un botón de enviar y un botón de cancelar:
$form[''cancel''] = array(
''#type'' => ''submit'',
''#value'' => t(''Cancel''),
);
$form[''save''] = array(
''#type'' => ''submit'',
''#value'' => t(''Save''),
);
y defino mi propio controlador de envío:
$form[''#submit''][] = ''mymod_myform_submit'';
He puesto un poco de código de rastreo en la función drupal_get_form () para oler la variable $ _POST cuando se envía el formulario. Cuando la magia jQuery está desactivada, la variable $ _POST incluye un parámetro "op":
Array
(
[op] = Save
[form_build_id] => form-6e74c87390e3fc48d0bebd2f5193315b
[form_token] => 33db6e34c0350e33c48861a63a38d45f
[form_id] => dh_seo_workload_item_form
)
pero si habilito la magia de jQuery para deshabilitar el botón de enviar después de que se ha hecho clic en él, el parámetro "op" ya no está incluido en la matriz $ _POST, por lo que Drupal cree que el formulario no se ha enviado.
He visto la pregunta en Prevenir la doble presentación de formularios en jQuery , pero me preocupa que esto parezca una solución realmente hacky, y debería haber una manera mejor.
Creo que el hecho de que esté vinculando al evento click del botón significa que el botón se desactiva antes de que el evento click pueda aparecer en el formulario y causar un envío.
Nuestro equipo descubrió que deshabilitar el botón de enviar casi siempre crea problemas para Internet Explorer. Hicimos un pequeño complemento para resolver el problema; ver el código aquí: https://.com/a/4473801/4376
Lo arreglé esta tarde de esta manera y pude obtener la información del formulario enviada sin problema:
$("#id_of_button").click(function() {
var submit = $(this);
setTimeout(function(){
submit.attr(''disabled'',''disabled'')
},1);
});
O puede hacer esto, como una adición de línea única en el nivel de matriz de formulario de PHP ...
$form[''submit''] = array(
''#type'' => ''submit'',
''#value'' => t(''Save''),
''#attributes'' => array(
''onclick'' => ''javascript:var s=this;setTimeout(function(){s.value="Saving...";s.disabled=true;},1);'',
),
);
Simplemente oculte su botón de enviar ( display:none
), y muestre otro botón que ya esté deshabilitado. Creo que es menos hacky que el resto de soluciones para este problema. Por lo general, solo tengo 2 botones en mi página, uno visible y el otro no, y al hacer clic en, simplemente cambiarlos.
El problema se debe a que los botones deshabilitados no activan la devolución de datos.