2011-02-07 9 views
9

संभव डुप्लिकेट:
jQuery autocomplete UI- I'd like it to start the search onfocus without the user having to type anythingफील्ड फोकस पर पॉप अप करने के लिए jQuery स्वत: पूर्ण कैसे प्राप्त करें?

jQuery UI Autocomplete

मैं विकल्प के रूप में जल्द ही के रूप में अपने इनपुट केंद्रित है दिखाना चाहते हैं। क्या इसके लिए कोई सेटिंग है? मैंने minlength को 0 पर सेट करने का प्रयास किया, लेकिन यह काम नहीं करता है ... यह अभी भी एक कीप्रेस के लिए इंतजार कर रहा है।

उत्तर

24
$("#yourField").bind('focus', function(){ $(this).autocomplete("search"); }); 

यहाँ एक jsfiddle: http://jsfiddle.net/fpHf4/2/ एक अपडेट किया गया (आईई के लिए): http://jsfiddle.net/q9ERL/4/

@HoldOffHunger द्वारा enlighted के रूप में आप भी MINLENGTH सेट करना होगा 0

+0

आपका पहेली कुछ अलग से अलग है। – mVChr

+0

क्षमा करें, मैंने कांटा को बचाया नहीं है ... अब तय की गई चीजें। – Pierre

+2

काम करता है, लेकिन माउस के साथ एक आइटम का चयन करने के बाद यह दूसरी बार खुलता है (मुझे लगता है कि यह फिर से तत्व पर ध्यान केंद्रित कर रहा है)। – mpen

2

लिए मुझे लगता है कि यू तोड़ रहे हैं "स्वत: पूर्ण" उपयोगिता बस एक स्टाइलिज्ड चयन करना, एक कुंजीपटल को पूरा करने के लिए कुछ इंतजार करने का कारण है।

मुझे पता है कि आप जिस उत्तरदाता की तलाश में हैं, उसे याद रखें, बस याद रखें कि आप केवल कुछ विकल्पों के साथ काम करने की कोशिश कर रहे हैं, अगर आपको पहले अक्षर पर हार्ड ऑटोकंपल div लोड मिल जाएगा।

या हो सकता है यू उर एसक्यूएल क्वेरी पर 10 परिणाम रिकॉर्ड हो सकता है अगर वैसे, तो परिणाम

के सभी तरह लोड किए बिना तेजी से मिलता है --- मैं IE8 पर ध्यान देने के बाँध का परीक्षण, यह विफल रहता है इस से है यह कोई असफल नहीं है कि आप फोकस पर ओपन डिव बॉक्स चाहते हैं, अंतर यह है कि आईई फोकस इवेंट पर फोकस इवेंट के साथ फोकस इवेंट, दूसरों की तरह नहीं, इसलिए सु को फोकस इवेंट पर मूल्यांकन करना चाहिए यदि फ़ील्ड अपनी खाली लॉन्च सर्च, अगर नहीं है बस कुछ भी नहीं .. मुझे उम्मीद है कि यह मदद करता है।

$("#yourField").bind('focus', function(){ 
    if($(this).val()!=""){ 
    $(this).autocomplete("search"); 
    } 
}); 
+0

यह सिर्फ एक स्टाइलिज्ड चयन नहीं है क्योंकि उपयोगकर्ता को अभी भी बॉक्स में टाइप करने की अनुमति है, और उन चीज़ों को दर्ज करें जो सूची में प्रकट नहीं होते हैं। एक combobox की तरह अधिक। मैं पहले से ही परिणामों को सीमित कर रहा हूं, इसलिए यह कोई मुद्दा नहीं है। – mpen

+0

ठीक है मार्क आप सही थे, लेकिन मैंने अपनी उत्तर को उस समस्या को ठीक करने के लिए संपादित किया जो आईई मौजूद है, बस एक नज़र डालें .. –

+3

'==' नहीं '! =' होना चाहिए लेकिन आपको सही विचार मिल गया है। वह काम करेगा :) धन्यवाद। – mpen

0

यहाँ एक समाधान है कि एक आइटम का चयन (के रूप में मार्क ने उल्लेख किया) के बाद सूची को खोलने के दूसरी बार पॉप नहीं करता है और यह भी काम करता है जब इनपुट बॉक्स पहले से ही पाठ है:

jQuery autocomplete UI- I'd like it to start the search onfocus without the user having to type anything

+0

वह समाधान एक हैक का एक सा है। यह 300 एमएमएस देरी पर निर्भर करता है। – mpen

+0

सहमत हैं कि यह विचार नहीं है, लेकिन यह काम करता है - मैं बेहतर सुझावों के लिए खुला हूं? – Dunc

+0

आप मेरा समाधान देख सकते हैं। हालांकि यह सिर्फ पॉप खोलने की तुलना में बहुत अधिक की एक बिल्ली है। यह इसे क्लिक, या टैब पर खुलता है, लेकिन केवल कुछ स्थितियों के तहत जैसे प्रोग्रामेटिक रूप से ट्रिगर नहीं किया जा रहा है। मुझे लगता है कि डबल-ओपन को रोकने की कुंजी खुली और करीबी घटनाओं में '$ (यह) .डेटा (' isOpen ', true) है, जो वैश्विक रूप से उपयोग करने के बजाय तत्व पर चर को संग्रहीत करती है, जो कि आपको पृष्ठ पर इनमें से कई को भी देखने देता है। – mpen

0

मेरा पूरा समाधान यहां है (यह कुछ अन्य चीजें भी करता है):

$.fn.ajaxselect = function(options) { 
    var settings = { 
     delay: 300, 
     sourceData: function(term) { 
      return {term:term}; 
     }, 
     sourceUrl: null, 
     select: function(item) {}, 
     html: true, 
     minLength: 0, 
     autoSelect: true, 
     autoFocus: true, 
     showOnClick: null 
    }; 

    if(options) $.extend(settings, options); 
    if(settings.showOnClick === null) settings.showOnClick = settings.minLength === 0; 

    $(this).autocomplete({ 
     source: function(request, response) { 
      var data = settings.sourceData.call(this.element[0], request.term); 
      if(data === false) { 
       response([]); 
       return; 
      } 
      $.ajax({ 
       url: settings.sourceUrl, 
       dataType: 'json', 
       data: data, 
       success: function(data, textStatus, $xhr) { 
        response(data); 
       }, 
       error: function($xhr, textStatus) { 
        response([]); 
       } 
      }); 
     }, 
     focus: function(e, ui) { 
      return false; // don't fill input with highlighted value 
     }, 
     search: function(e, ui) { 
      if(settings.minLength < 0 && e.hasOwnProperty('originalEvent')) return false; // don't search on keypress if minLength < 0 (use with showOnClick) 
      $(this).data('lastSearch', this.value); 
      return true; 
     }, 
     select: function(e, ui) { 
      if(!settings.autoSelect && e.keyCode === 9) return false; // don't select highlighted item on tab unless autoSelect is enabled 
      if($(this).val() === $(this).data('lastSearch')) { 
       if(settings.select.call(this, ui.item) !== false) { 
        $(this).val(ui.item.value); 
       } 
       $(this).data('selectedValue',$(this).val()).trigger('change'); 
      } 
      return false; 
     }, 
     open: function(e, ui) { 
      $(this).data('isOpen', true); 
     }, 
     close: function(e, ui) { 
      $(this).data('isOpen', false); 
     }, 
     minLength: settings.minLength, 
     autoFocus: settings.autoFocus, 
     delay: settings.delay, 
     html: settings.html 
    }).bind('change.ajaxselect', function() { 
     $(this).toggleClass('ajax-selected', $(this).val() === $(this).data('selectedValue')); 
    }); 

    if(settings.autoSelect) { 
     $(this).bind('autocompletechange.ajaxselect', function(event, ui) { 
      if($(this).val() !== $(this).data('selectedValue') && this.value.length > 0) { 
       var self = this; 
       var data = $.extend({autoSelect:1},settings.sourceData.call(this, this.value)); 
       $(this).addClass('.ui-autocomplete-loading'); 
       $.ajax({ 
        url: settings.sourceUrl, 
        dataType: 'json', 
        data: data, 
        success: function(data, textStatus, $xhr) { 
         if(data.length >= 1) { 
          var item = $.ui.autocomplete.prototype._normalize(data)[0]; 
          if(settings.select.call(self, item) !== false) { 
           $(self).val(item.value); 
          } 
          $(self).data('selectedValue',$(self).val()).trigger('change'); 
         } 
        }, 
        complete: function($xhr, textStatus) { 
         $(self).removeClass('.ui-autocomplete-loading'); 
        } 
       }); 
      } 
     }); 
    } 

    if(settings.showOnClick) { 
     $(this).bind('click.ajaxselect', function(e) { 
      if(!$(this).data('clickHandled') && !$(this).data('isOpen')) { 
       $(this).data('clickHandled',true); 
       $(this).autocomplete('search',''); 
      } else { 
       $(this).data('clickHandled',false); 
      } 
     }).bind('focus.ajaxselect', function(e) { 
      if(!$(this).data('clickHandled') && e.hasOwnProperty('originalEvent') && $(this).val() === this.defaultValue && !$(this).data('isOpen')) { 
       $(this).data('clickHandled',true); 
       $(this).autocomplete('search',''); 
      } else { 
       $(this).data('clickHandled',false); 
      } 
     }) 
    } 

    return $(this); 
}; 
संबंधित मुद्दे