Respuestas:
Si es posible. Por ejemplo, puede adjuntar un archivo .js a su formulario y extender el objeto Drupal.ajax.
Cada elemento que puede iniciar el envío de AJAX desde un formulario tiene su propia instancia de Drupal.ajax. Puedes encontrarlo en el objeto global Drupal.ajax. Y cada objeto tiene Drupal.ajax los métodos success, error, beforeSendetc.
Aquí está un ejemplo sencillo para demostrar la idea:
;(function($) {
Drupal.testAjax = {
// Our form
form_id: 'node-type-form' //Yes, I tested on my extended node creation form
};
Drupal.behaviors.testAjax = {
attach: function(context, settings) {
// We extend Drupal.ajax objects for all AJAX elements in our form
for (ajax_el in settings.ajax) {
if (Drupal.ajax[ajax_el].element.form) {
if (Drupal.ajax[ajax_el].element.form.id === Drupal.testAjax.form_id) {
Drupal.ajax[ajax_el].beforeSubmit = Drupal.testAjax.beforeSubmit;
Drupal.ajax[ajax_el].success = Drupal.testAjax.success;
Drupal.ajax[ajax_el].error = Drupal.testAjax.error;
}
}
}
}
};
// Disable form
Drupal.testAjax.beforeSubmit = function (form_values, form, options) {
$(form[0].elements).not(':disabled')
.addClass('test-ajax-disabled')
.attr('disabled', true);
}
// Enable form
Drupal.testAjax.enableForm = function(form) {
$(form).find('.test-ajax-disabled')
.removeClass('test-ajax-disabled')
.attr('disabled', false);
}
Drupal.testAjax.success = function (response, status) {
Drupal.testAjax.enableForm(this.element.form);
// Call original method with main functionality
Drupal.ajax.prototype.success.call(this, response, status);
}
Drupal.testAjax.error = function (response, uri) {
Drupal.testAjax.enableForm(this.element.form);
// Call original method with main functionality
Drupal.ajax.prototype.error.call(this, response, uri);
}
})(jQuery);
Este enfoque puede parecer un poco difícil, pero le da control total sobre AJAX en sus formularios.
Otra forma es usar métodos jQuery como .ajaxStart(), porque Drupal usa jQuery AJAX Framework.
Creé un widget que puede deshabilitar por completo o presentar una vista de solo lectura del contenido de su página. Deshabilita todos los botones, anclas, elimina todos los eventos de clic, etc., y puede volver a habilitarlos nuevamente. Incluso es compatible con todos los widgets de jQuery UI también. Lo creé para una aplicación que escribí en el trabajo. Eres libre de usarlo.
Compruébelo en ( http://www.dougestep.com/dme/jquery-disabler-widget ).
Puede deshabilitar / habilitar algunos elementos durante ajax usando este script jQuery:
// Disable elements on ajax call.
$(document)
.ajaxStart(function() {
if ($('.ajax-disabling').length) {
// Disable elements.
$(".ajax-disabling input").attr("disabled", "disabled");
}
})
.ajaxComplete(function() {
if ($('.ajax-disabling').length) {
// Enable elements.
$(".ajax-disabling input").removeAttr("disabled");
}
});
Si va a agregar clase ajax-disablingal <form>o <div>(o cualquier otro contenedor) todas las entradas se deshabilitarán dentro durante ajax.
Puede jugar con selectores y deshabilitar también selecciones y áreas de texto.
Ver también https://drupal.stackexchange.com/a/76838/6309
Actualizar
Si ya ha deshabilitado elementos en el formulario y desea mantenerlos deshabilitados después de ajax, use el siguiente código:
// Disable form elements on ajax call.
$(document)
.ajaxStart(function() {
if ($('.ajax-disabling').length) {
// Disable elements.
$('.ajax-disabling input, .ajax-disabling select').each(function(){
if($(this).attr('disabled') !== 'disabled') {
$(this).addClass('ajax-form-disabled');
$(this).attr('disabled', 'disabled');
}
});
}
})
.ajaxComplete(function() {
if ($('.ajax-disabling').length) {
// Enable elements.
$('.ajax-disabling input, .ajax-disabling select').each(function(){
if($(this).hasClass('ajax-form-disabled')) {
$(this).removeClass('ajax-form-disabled');
$(this).removeAttr('disabled');
}
});
}
});