ฉันมีฟอร์มที่เปิดใช้งาน AJAX ทุกฟิลด์ป้อนข้อมูลผู้ใช้และฉันต้องการปิดการใช้งานองค์ประกอบทั้งหมดของฟอร์มเมื่อมีการเปลี่ยนแปลงอย่างใดอย่างหนึ่ง - เป็นไปได้หรือไม่
ฉันมีฟอร์มที่เปิดใช้งาน AJAX ทุกฟิลด์ป้อนข้อมูลผู้ใช้และฉันต้องการปิดการใช้งานองค์ประกอบทั้งหมดของฟอร์มเมื่อมีการเปลี่ยนแปลงอย่างใดอย่างหนึ่ง - เป็นไปได้หรือไม่
คำตอบ:
ใช่มันเป็นไปได้ ตัวอย่างเช่นคุณสามารถแนบไฟล์. 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
ฉันสร้างวิดเจ็ตที่สามารถปิดใช้งานหรือแสดงมุมมองแบบอ่านอย่างเดียวของเนื้อหาในหน้าของคุณ มันปิดการใช้งานปุ่ม, แองเคอร์ทั้งหมด, ลบกิจกรรมการคลิกทั้งหมด, และสามารถเปิดใช้งานได้ทั้งหมดอีกครั้ง มันยังรองรับวิดเจ็ต jQuery UI ทั้งหมดด้วย ฉันสร้างมันสำหรับแอปพลิเคชันที่ฉันเขียนในที่ทำงาน คุณมีอิสระที่จะใช้มัน
ตรวจสอบได้ที่ ( http://www.dougestep.com/dme/jquery-disabler-widget )
คุณสามารถปิด / เปิดใช้งานองค์ประกอบบางอย่างในระหว่าง 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');
}
});
}
});