Tengo un formulario donde cada campo de entrada del usuario está habilitado para AJAX, y me gustaría deshabilitar todos los elementos del formulario cuando se cambia uno de ellos, ¿es posible?
8
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 ).
fuente
Puede deshabilitar / habilitar algunos elementos durante ajax usando este script jQuery:
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:
fuente