2012-04-09 19 views
6

के दौरान निष्पादित होने से $ .ajaxStart() को रोकें। मैं एक पेज पर jquery-ui स्वत: पूर्णता का उपयोग कर रहा हूं। उसी पृष्ठ पर मेरे पास कुछ AJAX घटनाएं चल रही हैं। अन्य AJAX घटनाओं के दौरान मैं अपने पृष्ठ पर एक ओवरले जोड़ रहा हूं, ताकि वेबसाइट पर सभी लिंक उपयोगकर्ता के लिए अब क्लिक करने योग्य न हों। मैं नहीं चाहता कि यह स्वत: पूर्ण के दौरान हो।jquery-ui autocomplete

स्वत: पूर्ण:

$(function() { 
    $("#search_input").autocomplete({ 
    source: '/search_autocomplete/',}); 
}); 

ajax:

$.ajax({ 
    url: "/ajax_login/", 
      login_user: $("#login_user").val(), 
      password: $("#login_password").val(), 
      }); 

ajaxStart:

$("#loading_gif").ajaxStart(function() { 
    $("#overlay").show(); 
    $(this).show(); 
}); 

ajax घटनाओं जहां यह आवश्यक नहीं है के दौरान निष्पादित किया जा रहा से ajaxstart समारोह को रोकने के लिए। मैं

global:false, 

संबंधित AJAX कार्यक्षमताओं में जोड़ें। मैं jquery-ui स्रोत को बदले बिना स्वत: पूर्ण के दौरान कुछ कैसे कर सकता हूं?

उत्तर

1

आप $.ajax() एक निश्चित तरीके से समय की सबसे लेकिन अबहर समय काम करने के लिए चाहते हैं, तो आप शायद अपने डिफ़ॉल्ट व्यवहार को बदलने नहीं करना चाहिए।

मैं ऐसे फ़ंक्शन को बनाने की अनुशंसा करता हूं जो एक फ़ंक्शन में AJAX अनुरोध को लपेटता है जो उपयुक्त समय पर ओवरले को सक्षम और अक्षम करता है। इस फ़ंक्शन को कॉल करें जहां आप ओवरले का उपयोग करना चाहते हैं, और अपने स्वत: पूर्ण के लिए सादा $.ajax() का उपयोग करें।

5

इसके लिए आपको source के साथ शॉर्टेंड कॉल को छोड़ना होगा और इस तरह की कॉल को बदलना होगा।

$('#search_input').autocomplete({ 
    source: function (request, response) { 
     var DTO = { "term": request.term }; 
     //var DTO = { "term": $('#search_input').val() }; 
     $.ajax({ 
      data: DTO, 
      global: false, 
      type: 'GET', 
      url: '/search_autocomplete/', 
      success: function (jobNumbers) { 
       //var formattedNumbers = $.map(jobNumbersObject, function (item) { 
       // return { 
       //  label: item.JobName, 
       //  value: item.JobID 
       // } 
       //}); 
       return response(jobNumbers); 
      } 
     }); 
    } 
    //source: '/search_autocomplete/' 
}); 

इस लंबे समय से हाथ विधि का लाभ

  1. है आप एक से अधिक पैरामीटर पारित कर सकते हैं। इसके अलावा पैरामीटर नाम शब्द नहीं होना चाहिए।
  2. शॉर्ट-हाथ नोटेशन तारों की एक सरणी की अपेक्षा करता है। यहां आप वस्तुओं की एक सरणी भी वापस कर सकते हैं।
1

मैं सहमत हूं कि नवीन का जवाब सबसे अच्छा समाधान है। मेरे मामले में बदलने की आवश्यकता वाले विशाल मात्रा में लागत प्रभावी नहीं थी क्योंकि हम फिर से लिखने की प्रक्रिया में हैं और हमें एक अल्पकालिक समाधान की आवश्यकता है।

आप jQuery UI में AJAX कॉल को ओवरराइड कर सकते हैं, मैंने _initSource फ़ंक्शन कॉल के स्रोत को कॉपी किया जो AJAX अनुरोध को संभालता है। फिर बस वैश्विक जोड़ा: $ .ajax विकल्पों के लिए झूठा। यहां कोड jquery-ui 1.9.2 पर आधारित है, आपको अपने संस्करण के लिए सही स्रोत मिलना पड़ सकता है।

$.ui.autocomplete.prototype._initSource = function() { 
    var array, url, 
     that = this; 
    if ($.isArray(this.options.source)) { 
     array = this.options.source; 
     this.source = function(request, response) { 
      response($.ui.autocomplete.filter(array, request.term)); 
     }; 
    } else if (typeof this.options.source === "string") { 
     url = this.options.source; 
     this.source = function(request, response) { 
      if (that.xhr) { 
       that.xhr.abort(); 
      } 
      that.xhr = $.ajax({ 
       url: url, 
       data: request, 
       dataType: "json", 
       global: false, 
       success: function(data) { 
        response(data); 
       }, 
       error: function() { 
        response([]); 
       } 
      }); 
     }; 
    } else { 
     this.source = this.options.source; 
    } 
};