2010-04-14 34 views
9

Estoy usando JQuery UI complemento blockUI para bloquear la interfaz de usuario para cada solicitud de AJAX. Sin embargo, funciona como un amuleto. No quiero bloquear la interfaz de usuario (o al menos no mostrar el mensaje "Espere por favor") cuando estoy haciendo llamadas ajax para buscar elementos de sugerencia de autocompletar. ¿Cómo puedo hacer eso? Estoy usando el complemento de autocompletar de jquery para la funcionalidad de autocompletar.jQuery bloque UI excepciones

¿Hay alguna manera en que pueda decirle al plug-in de la interfaz de usuario del bloque que no bloquee la autocompleción de la interfaz de usuario?

Respuesta

21
$('#myWidget').autocomplete({ 
    source: function(data, callback) { 
     $.ajax({ 
      global: false, // <-- this is the key! 
      url: 'http:...', 
      dataType: 'json', 
      data: data, 
      success: callback 
     }); 
    } 
}); 
+0

gracias por este hombre, te amo – franchez

0

usando un bloque modal (bloque UI) significa bloquear cualquier entrada del usuario, sugiero un simple latido antiguo para mostrar 'Por favor espere ..' y bloquear (establecer atributos readonly = "readonly") ur controles de entrada hasta la solicitud de Ajax está completa.

¡La IU anterior parece ser contradictoria!

+0

Eso no parece ser la respuesta. Estoy bloqueando todas las solicitudes ajax usando '$ (documento) .ajaxStart ($. BlockUI) .ajaxStop ($. UnblockUI);' Lo que sugirió es simular el mismo manualmente y excluirlo para autocompletar, que en realidad no es la solución. Esperaba que el plugin blockUI se pudiera configurar para excepciones. – Chirantan

1

intentar usar un decorador

$.blockUI = function() { 
    if (condition_you_dont_want_to_block) { 
     return; 
    } 
    return $.blockUI.apply(this, arguments); 
} 

o puede escribir su propia función de bloque que es más inteligente

function my_blockUI() { 
    if (condition_you_dont_want_to_block) { 
     return; 
    } 
    $.blockUI(); 
} 
$(document).ajaxStart(my_blockUI).ajaxStop($.unblockUI); 
+0

Esto es bueno, sin embargo, me gustaría no mostrar el mensaje basado en ciertos parámetros de la solicitud, como por ejemplo, la url a la que se solicita si se realiza o al menos la identificación del elemento desde el que se originó la solicitud o el ajax objeto. Tiene que haber alguna pista que determine si mostrar el mensaje o no. '$ (this)' siempre da el objeto 'document'. Por lo tanto, no hay forma de saber cuándo quisiera mostrar el mensaje "Espere ...". – Chirantan

+0

No es una buena respuesta para este caso (jquery UI es para no escribir nada usted mismo, simplemente configurando: P), '¡pero tiene patrones de diseño! :) '+1 – naugtur

1

Puede establecer blockUI a trabajar para todas las funciones de la página añadiendo a un controlador de eventos jQuery global. Para asegurarnos de que no reciba llamadas automáticas de ajax, debemos determinar si la llamada es o no una llamada de autocompletar. El problema es que estas funciones globales no tienen mucha información disponible. Sin embargo, ajaxSend obtiene algo de información. Obtiene el objeto de configuración utilizado para hacer la llamada ajax. el objeto de configuración tiene la cadena de datos que se envía. Por lo tanto lo que puede hacer es anexar a cada cadena de datos en cada petición Ajax en su página algo como:

&notautocomplete=notautocomplete 

Por ejemplo:

$.ajax({data:"bar=1&foo=2&notautocomplete=notautocomplete"}) 

entonces podemos poner este código en su sección de lista de documentos antes cualquier otra cosa:

$(document).ajaxSend(
    function (event, xhr, ajaxOptions){ 
    if(ajaxOptions.data.indexOf("notautocomplete") !== -1){ 
     $.blockUI; 
    } 
}); 
$(document).ajaxStop($.unblockUI); 

por supuesto, la otra idea mejor sería buscar algo único en los automóviles solicitudes completas, como la URL, pero eso depende de qué plug-in de autocompletar estás usando y cómo lo estás usando.

2

Hm, parece ser una característica que falta en jQuery :) Se puede usar un indicador global para indicar si se trata de una llamada de autocompletar y se envuelve en una autcompletefunction generales

var isAutoComplete = false; 
    function autoComplete(autocomplete){ 
    isAutoComplete = true; 
    if($(autocomplete).isfunction()) 
     autocomplete(); 
    } 

     $(document).ajaxStart(function(){if(!isAutoComplete)$.blockUI();}).ajaxStop(function(){isAutoComplete = false;$.unblockUI();}); 

No es una buena solución pero debería funcionar ...