Я использую JQuery плагин UI blockUI для блокирования UI для каждого запроса ajax. Это работает как очарование, однако, я не хочу блокировать UI (Или по крайней мере не показать, "Ожидайте" сообщение), когда я выполняю вызовы ajax для выборки автоматического заполнения, предлагают объекты. Как я делаю это? Я использую плагин автоматического заполнения jQuery для функциональности автоматического заполнения.
Существует ли способ, которым я могу сказать блоку плагин UI для не блокирования UI для автоматического заполнения?
$('#myWidget').autocomplete({
source: function(data, callback) {
$.ajax({
global: false, // <-- this is the key!
url: 'http:...',
dataType: 'json',
data: data,
success: callback
});
}
});
попробуйте использовать декоратор
$.blockUI = function() {
if (condition_you_dont_want_to_block) {
return;
}
return $.blockUI.apply(this, arguments);
}
или вы можете написать свою собственную блочную функцию, которая будет умнее
function my_blockUI() {
if (condition_you_dont_want_to_block) {
return;
}
$.blockUI();
}
$(document).ajaxStart(my_blockUI).ajaxStop($.unblockUI);
использование модального блока (блочного пользовательского интерфейса) означает блокировку любых входных данных от пользователя, я бы посоветовал простому старому пульсатору показать «Подождите ...» и block (установить атрибуты readonly = "readonly") ur вводит элементы управления до тех пор, пока запрос ajax не будет завершен.
Вышеупомянутый интерфейс кажется противоречивым!
Вы можете настроить blockUI на работу для всех функций на странице, добавив в глобальный обработчик событий jQuery. Чтобы убедиться, что он не вызывается при вызовах автозаполнения ajax, мы должны определить, является ли вызов вызовом автозаполнения или нет. Проблема в том, что этим глобальным функциям доступно не так много информации. Однако ajaxSend действительно получает некоторую информацию. Он получает объект настроек, используемый для вызова ajax. объект настроек имеет отправляемую строку данных. Поэтому вы можете добавить к каждой строке данных в каждом запросе ajax на вашей странице что-то вроде:
¬autocomplete=notautocomplete
Например:
$.ajax({data:"bar=1&foo=2¬autocomplete=notautocomplete"})
Затем мы можем поместить этот код в раздел готовности вашего документа перед любым другим:
$(document).ajaxSend(
function (event, xhr, ajaxOptions){
if(ajaxOptions.data.indexOf("notautocomplete") !== -1){
$.blockUI;
}
});
$(document).ajaxStop($.unblockUI);
Конечно другая лучшая идея - искать что-то уникальное в запросах автозаполнения, например URL-адрес, но это зависит от того, какой плагин автозаполнения вы используете и как вы его используете.
Хм, похоже, это недостающая функция в jquery :) Вы можете использовать глобальный флаг, чтобы указать, является ли это вызовом автозаполнения, и обернуть его в общую функцию автозаполнения
var isAutoComplete = false;
function autoComplete(autocomplete){
isAutoComplete = true;
if($(autocomplete).isfunction())
autocomplete();
}
$(document).ajaxStart(function(){if(!isAutoComplete)$.blockUI();}).ajaxStop(function(){isAutoComplete = false;$.unblockUI();});
Это не очень хорошее решение, но оно должно работать...