Deseamos compartir contigo la mejor solución que encontramos on line. Nuestro deseo es que te resulte útil y si puedes aportar algo que nos pueda ayudar a crecer hazlo con total libertad.
Solución:
Si está utilizando únicamente solicitudes ajax, puede usar jsf.ajax.addOnEvent
controlador de la API JSF JavaScript para esto. El siguiente ejemplo se aplicará a todos los botones de type="submit"
.
function handleDisableButton(data)
if (data.source.type != "submit")
return;
switch (data.status)
case "begin":
data.source.disabled = true;
break;
case "complete":
data.source.disabled = false;
break;
jsf.ajax.addOnEvent(handleDisableButton);
Alternativamente, si necesita esto solo en botones específicos, use el onevent
attribute de
.
Si también necesita aplicar esto en solicitudes sincrónicas, debe tener en cuenta que cuando deshabilita un botón durante onclick
entonces el botón name=value
pair no se enviará como parámetro de solicitud y, por lo tanto, JSF no podrá identificar la acción e invocarla. Por lo tanto, solo debe deshabilitarlo después la solicitud POST ha sido enviada por el navegador. No hay un controlador de eventos DOM para esto, necesitaría usar el setTimeout()
pirateo que deshabilita el botón ~ 50 ms después de hacer clic.
Esto es sólo bastante frágil. Puede ser demasiado corto en clientes lentos. Tendría que aumentar el tiempo de espera o dirigirse a otra solución.
Dicho esto, tenga en cuenta que esto solo evita envíos dobles cuando se envía desde una página web. Esto no evita envíos dobles por parte de clientes HTTP programáticos como URLConnection
, Apache HttpClient, Jsoup, etc. Si desea imponer la unicidad en el modelo de datos, entonces no debe evitar los envíos dobles, sino las inserciones dobles. Esto se puede lograr fácilmente en SQL poniendo un UNIQUE
restricción en la(s) columna(s) de interés.
Ver también:
- Implementación pura de Java/JSF para prevención de doble envío
- ¿Cómo manejar múltiples envíos antes de que se muestre la respuesta?
Me encontré con esta pregunta, teniendo el mismo problema. La solución no funcionó para mí: después de un breve vistazo a primefaces.js, supongo que ya no usan jsf.ajax allí.
así que tuve que resolver algo yo mismo y aquí está mi solución, para las personas que tampoco pueden usar la de la respuesta de BalusC:
// we override the default send function of
// primeFaces here, so we can disable a button after a click
// and enable it again after
var primeFacesOriginalSendFunction = PrimeFaces.ajax.AjaxUtils.send;
PrimeFaces.ajax.AjaxUtils.send = function(cfg)
var callSource = '';
// if not string, the caller is a process - in this case we do not interfere
if(typeof(cfg.source) == 'string')
callSource = jQuery('#' + cfg.source);
callSource.attr('disabled', 'disabled');
// in each case call original send
primeFacesOriginalSendFunction(cfg);
// if we disabled the button - enable it again
if(callSource != '')
callSource.attr('disabled', 'enabled');
;
Puede usar oyentes ‘onclick’ y ‘oncomplete’. Cuando el usuario haga clic en el botón, desactívelo. Cuando se complete la acción, habilite.
Si tienes alguna cuestión o capacidad de arreglar nuestro artículo eres capaz de dejar una interpretación y con deseo lo leeremos.