Mam formularz, w którym każde pole wprowadzania użytkownika ma włączoną obsługę AJAX i chciałbym wyłączyć wszystkie elementy formularza, gdy jeden z nich zostanie zmieniony - czy to możliwe?
8
Tak, to możliwe. Na przykład możesz dołączyć plik .js do formularza i rozszerzyć obiekt Drupal.ajax.
Każdy element, który może zainicjować przesłanie AJAX z formularza, ma własną instancję Drupal.ajax. Możesz go znaleźć w obiekcie globalnym Drupal.ajax
. I każdy przedmiot Drupal.ajax ma metody success
, error
, beforeSend
itd.
Oto prosty przykład wykazać ideę:
;(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);
To podejście może wydawać się trochę trudne, ale daje pełną kontrolę nad AJAX w twoich formularzach.
Innym sposobem jest użycie metod jQuery, takich jak .ajaxStart()
, ponieważ Drupal używa jQuery AJAX Framework.
Stworzyłem widżet, który może całkowicie wyłączyć lub zaprezentować widok tylko do odczytu treści na twojej stronie. Wyłącza wszystkie przyciski, kotwice, usuwa wszystkie zdarzenia kliknięcia itp. I może ponownie je wszystkie włączyć ponownie. Obsługuje nawet wszystkie widżety interfejsu użytkownika jQuery. Stworzyłem go dla aplikacji, którą napisałem w pracy. Możesz z niego korzystać.
Sprawdź to na ( http://www.dougestep.com/dme/jquery-disabler-widget ).
źródło
Możesz wyłączyć / włączyć niektóre elementy podczas aukcji za pomocą tego skryptu jQuery:
Jeśli dodasz klasę
ajax-disabling
do<form>
lub<div>
(lub dowolnego innego opakowania), wszystkie dane wejściowe zostaną wyłączone wewnątrz podczas ajax.Możesz bawić się selektorami i wyłączać również zaznaczenia i pola tekstowe.
Zobacz także https://drupal.stackexchange.com/a/76838/6309
Aktualizacja
Jeśli masz już wyłączone elementy w formularzu i chcesz je wyłączyć po ajax, użyj następnego kodu:
źródło