2010-04-14 19 views
9

मैं प्रत्येक AJAX अनुरोध के लिए UI को ब्लॉक करने के लिए JQuery UI प्लगइन blockUI का उपयोग कर रहा हूं। यह एक आकर्षण की तरह काम करता है, हालांकि, मैं यूआई को अवरुद्ध नहीं करना चाहता (या कम से कम "कृपया प्रतीक्षा करें" संदेश नहीं दिखाता) जब मैं स्वत: पूर्ण सुझाव आइटम लाने के लिए AJAX कॉल कर रहा हूं। मैं उसको कैसे करू? मैं स्वत: पूर्ण कार्यक्षमता के लिए jquery स्वत: पूर्ण प्लगइन का उपयोग कर रहा हूँ।jQuery ब्लॉक यूआई अपवाद

क्या कोई तरीका है कि मैं ब्लॉक यूआई प्लग-इन को स्वत: पूर्ण के लिए यूआई ब्लॉक न करने के लिए कह सकता हूं?

उत्तर

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

इस आदमी के लिए धन्यवाद, आपसे प्यार है – franchez

0

एक मोडल ब्लॉक (ब्लॉक यूआई) का उपयोग करने का मतलब है उपयोगकर्ता से किसी भी इनपुट को अवरुद्ध करना, मैं 'कृपया प्रतीक्षा करें' दिखाने के लिए सादे पुराने थ्रोबबर का सुझाव देना चाहता हूं और ब्लॉक करने के लिए (केवल विशेषताओं को रीडोनली = "रीडोनली" सेट करें) इनपुट इनपुट तक AJAX अनुरोध पूरा हो गया है।

उपरोक्त यूआई स्वयं विरोधाभासी प्रतीत होता है!

+0

यह उत्तर नहीं लगता है। मैं '$ (दस्तावेज़) .ajaxStart ($। BlockUI) .ajaxStop ($। UnblockUI) का उपयोग करके सभी AJAX अनुरोधों को अवरुद्ध कर रहा हूं; 'आपने जो सुझाव दिया है वह मैन्युअल रूप से अनुकरण कर रहा है और इसे स्वत: पूर्ण करने के लिए छोड़ रहा है जो वास्तव में समाधान नहीं है। मैंने आशा की थी कि ब्लॉकयूआई प्लगइन अपवादों के लिए कॉन्फ़िगर किया जा सकता है। – Chirantan

1

एक डेकोरेटर

$.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); 
+0

हालांकि यह अच्छा है, मैं अनुरोध के कुछ मानकों के आधार पर संदेश नहीं दिखाना चाहता हूं, जैसे कहें, यूआरएल जिस पर अनुरोध किया जा रहा है या कम से कम उस तत्व की आईडी जिस से अनुरोध उत्पन्न हुआ है या AJAX वस्तु। कुछ सुराग होना चाहिए जो यह निर्धारित करता है कि संदेश दिखाना है या नहीं। '$ (यह) 'हमेशा' दस्तावेज़ 'ऑब्जेक्ट देता है। इसलिए मुझे यह जानने का कोई तरीका नहीं है कि मैं "कृपया प्रतीक्षा करें ..." संदेश कब नहीं दिखाना चाहता हूं। – Chirantan

+0

इस मामले के लिए यह कोई अच्छा जवाब नहीं है (jquery UI कुछ भी लिखने के लिए नहीं है, बस कॉन्फ़िगर करना: पी), लेकिन इसमें डिज़ाइन पैटर्न हैं !!!!! :) '+1 – naugtur

1

आप blockUI जोड़कर पृष्ठ पर सभी कार्यों के लिए काम करने के लिए सेट कर सकते हैं एक वैश्विक jQuery घटना हैंडलर के लिए। यह सुनिश्चित करने के लिए कि यह स्वत: पूर्ण AJAX कॉल पर नहीं बुलाया जाता है, हमें यह निर्धारित करना होगा कि कॉल एक स्वतः पूर्ण कॉल है या नहीं। समस्या यह है कि इन वैश्विक कार्यों में उनके लिए उपलब्ध अधिक जानकारी नहीं है। हालांकि AJAXSend कुछ जानकारी प्राप्त करता है। यह AJAX कॉल करने के लिए उपयोग की जाने वाली सेटिंग ऑब्जेक्ट प्राप्त करता है। सेटिंग्स ऑब्जेक्ट में डेटा स्ट्रिंग भेजी जा रही है।

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

तो हम पहले अपने दस्तावेज़ तैयार अनुभाग में इस कोड डाल सकते हैं:

&notautocomplete=notautocomplete 

उदाहरण के लिए: इसलिए आप क्या कर सकते की तरह अपने पेज पर कुछ हर ajax अनुरोध में हर डेटा स्ट्रिंग को संलग्न है कुछ और:

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

अन्य बेहतर विचार कुछ स्वत: पूर्ण अनुरोधों में अद्वितीय, यूआरएल की तरह देखने के लिए होगा, लेकिन उस पर निर्भर करता है जो स्वत: पूर्ण प्लग-इन आप इसका उपयोग कर रहे हैं और आप इसका उपयोग कैसे कर रहे हैं।

2

हम्म, jQuery में :) आप अगर यह एक स्वत: पूर्ण कॉल है संकेत मिलता है और एक सामान्य autcompletefunction

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

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

एक अच्छा समाधान नहीं है में लपेट के लिए एक वैश्विक झंडा इस्तेमाल कर सकते हैं एक लापता सुविधा होने के लिए लग रहा है लेकिन यह काम करना चाहिए ...