ปิดการใช้งานองค์ประกอบแบบฟอร์มทั้งหมดเมื่อทำ AJAX


8

ฉันมีฟอร์มที่เปิดใช้งาน AJAX ทุกฟิลด์ป้อนข้อมูลผู้ใช้และฉันต้องการปิดการใช้งานองค์ประกอบทั้งหมดของฟอร์มเมื่อมีการเปลี่ยนแปลงอย่างใดอย่างหนึ่ง - เป็นไปได้หรือไม่

คำตอบ:


12

ใช่มันเป็นไปได้ ตัวอย่างเช่นคุณสามารถแนบไฟล์. js กับแบบฟอร์มของคุณและขยายวัตถุ Drupal.ajax
ทุกองค์ประกอบที่สามารถเริ่มส่ง AJAX จากแบบฟอร์มมีตัวอย่างของ Drupal.ajax Drupal.ajaxคุณสามารถค้นหาได้ในวัตถุโลก และวัตถุทุก Drupal.ajax มีวิธีการsuccess, error, beforeSendฯลฯ
นี่คือตัวอย่างง่ายๆที่จะแสดงให้เห็นถึงความคิดที่:

;(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);

วิธีนี้อาจดูยากไปหน่อย แต่ก็ช่วยให้คุณสามารถควบคุม AJAX ในแบบฟอร์มของคุณได้อย่างเต็มที่
อีกวิธีหนึ่งคือการใช้วิธีการ jQuery เช่น.ajaxStart()Drupal ใช้ jQuery AJAX Framework


ท้ายที่สุดฉันไม่ต้องการคุณสมบัตินี้ในเว็บไซต์ของฉันและข้อ จำกัด ด้านเวลาทำให้ฉันไม่สามารถตรวจสอบคำตอบนี้ได้ ฉันจะยอมรับคำตอบนี้แม้ว่าจะไม่ได้ตรวจสอบเพราะดูเหมือนว่าคุณใช้ความพยายามอย่างมากและไม่ยุติธรรมที่จะเพิกเฉย การลงคะแนนเสียงทั้งสองช่วยด้วยเช่นกัน :)
Daniel

มีประโยชน์มาก. จำเป็นต้องมีวิธี ajax บางอย่างปิดการใช้งานแบบฟอร์มและไม่อื่น ๆ สิ่งนี้ช่วยฉันได้มากและช่วยให้ฉันเข้าใจวิธีแนบความสำเร็จแบบกำหนดเอง ขอบคุณ.
Tanvir Chowdhury

3

ฉันสร้างวิดเจ็ตที่สามารถปิดใช้งานหรือแสดงมุมมองแบบอ่านอย่างเดียวของเนื้อหาในหน้าของคุณ มันปิดการใช้งานปุ่ม, แองเคอร์ทั้งหมด, ลบกิจกรรมการคลิกทั้งหมด, และสามารถเปิดใช้งานได้ทั้งหมดอีกครั้ง มันยังรองรับวิดเจ็ต jQuery UI ทั้งหมดด้วย ฉันสร้างมันสำหรับแอปพลิเคชันที่ฉันเขียนในที่ทำงาน คุณมีอิสระที่จะใช้มัน

ตรวจสอบได้ที่ ( http://www.dougestep.com/dme/jquery-disabler-widget )


1

คุณสามารถปิด / เปิดใช้งานองค์ประกอบบางอย่างในระหว่าง ajax โดยใช้สคริปต์ 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");
      }
    });

ถ้าคุณจะเพิ่มคลาสajax-disablingไปที่<form>หรือ<div>(หรือ wrapper อื่น ๆ ) อินพุตทั้งหมดจะถูกปิดการใช้งานภายในระหว่างอาแจ็กซ์

คุณสามารถเล่นกับตัวเลือกและปิดการใช้งานนอกจากนี้ยังเลือกและ textareas

ดูเพิ่มเติมที่https://drupal.stackexchange.com/a/76838/6309

ปรับปรุง

หากคุณได้ปิดการใช้งานองค์ประกอบในแบบฟอร์มและคุณต้องการให้พวกเขาปิดการใช้งานหลังจาก ajax ใช้รหัสต่อไป:

  // 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');
          }
        });
      }
    });
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.