2010-07-21 20 views
11

मुझे jQuery के स्वत: पूर्ण विजेट को मेरे लिए काम करने में बहुत परेशानी हो रही है। मैं एक सर्वर से कुंजी/मूल्य जोड़े की एक सूची का उपयोग कर रहा हूँ। उपयोगकर्ता विजेट से कोई मान का चयन करता हैjQuery UI स्वत: पूर्ण हाइब्रिड टेक्स्ट/आईडी खोज

हैं, मैं सर्वर से आईडी पास करना चाहते हैं:

मैं निम्नलिखित आवश्यकताओं है।

यदि उपयोगकर्ता कोई मान नहीं चुनता है और कच्चे पाठ में प्रवेश करता है, या पहले से ही चुना गया मान संशोधित करता है, तो मैं चाहता हूं कि आईडी फ़ील्ड को साफ़ किया जाए और केवल कच्चे पाठ को सर्वर पर भेजा जाए।

मान लें कि someAjaxFunction ऑब्जेक्ट्स की एक सरणी देता है जो स्वत: पूर्ण विजेट अपेक्षा करता है: {label:label, value:key}। , यहां तक ​​कि वस्तुओं में से एक पर मँडरा अंतर्निहित कुंजी करने के लिए $ (इनपुट) द्वारा संदर्भित पाठ बॉक्स में पाठ में परिवर्तन द्वारा

$(input).autocomplete({ 
    source: sourceFunction, 
    minLength: 1 
}); 

चयन बदलना:

शुरू में मैं सेट स्वत: पूर्ण इसलिए तरह विजेट लेबल के बजाए। यह एक उपयोगकर्ता इंटरैक्शन दृष्टिकोण से बेहद अवांछनीय है - असल में, मैं इसकी जांच क्यों कर रहा हूं इसका कारण यह है कि जिस साइट पर मैं निर्माण कर रहा हूं, उसके उपयोगकर्ता लगातार उस पाठ द्वारा परेशान थे जो वे यादृच्छिक संख्या में बदल रहे थे!

मैं पाठ बॉक्स के तहत एक छिपी हुई फ़ील्ड जोड़ा गया है और) का चयन कार्यान्वित (और ध्यान() की घटनाओं के क्रम इतना की तरह आईडी क्लोक करने के लिए:

$(input).autocomplete({ 
    source: sourceFunction, 
    minLength: 1 
    focus: function(event, ui) { 
     $(idField).val(ui.item.value); 
     $(this).val(ui.item.label); 
     return false; 
    }, 
    select: function(event, ui) { 
     $(idField).val(ui.item.value); 
     $(this).val(ui.item.label); 
     return false; 
    }, 
    minLength: 1 
}); 

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

jQuery यूआई स्वत: पूर्ण प्रलेखन एक change घटना को सूचीबद्ध करता है और कहा गया है ui तर्क के item संपत्ति चयनित आइटम पर निर्धारित किया जाएगा कि। मैंने सोचा कि मैं छिपी हुई आईडी फ़ील्ड को एक कुंजी प्रेस पर रीसेट कर सकता हूं और स्वत: पूर्णता बदलकर आईडी को फिर से पॉप्युलेट कर सकता हूं। दुर्भाग्यवश, कीप्रेस घटना के अलावा, को को आईडी को रीसेट नहीं करना चाहिए, return false उपरोक्त select ईवेंट में स्टेटमेंट को टेक्स्ट बॉक्स में टेक्स्ट प्रबंधित करने के लिए जरूरी है, change ईवेंट को ui होने से रोकता है सही ढंग से असाइन किया गया।

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

मैं इसके लिए कवर करने के लिए सर्वर की ओर कुछ हैक्स जोड़ सकता हूं, लेकिन मैं वास्तव में क्लाइंट स्तर पर ऐसा करने में सक्षम होना पसंद करूंगा।

मैं किसी अन्य पर स्विच करने के बजाय jQuery UI स्वत: पूर्ण विजेट से चिपकना पसंद करूंगा।

+0

क्षमा करें, क्या मैं कुछ स्पष्टीकरण दे सकता हूं? आपकी कम से कम एक समस्या यह है कि आप आईडी बॉक्स को * या * संबंधित आईडी से भरना चाहते हैं यदि उपयोगकर्ता उस मान में प्रवेश करता है जिसमें संबंधित आईडी है, या जो भी उपयोगकर्ता टाइप कर रहा है यदि कोई संबंधित मूल्य नहीं है - सही/गलत? – Stephen

+0

नहीं, मैं बस छिपी हुई आईडी फ़ील्ड खाली होना चाहता हूं यदि टेक्स्ट बॉक्स में टेक्स्ट उस पर सेट किया गया है जो स्वत: पूर्ण द्वारा ऑफ़र किए गए चयन से मेल नहीं खाता है। – Shabbyrobe

उत्तर

2

जिस तरह से मैं स्वतः पूर्ण कर रहा हूं, इनपुट युक्त एक कंटेनर div बनाना है।जब मैं कोई तत्व चुनता हूं, तो मैं कंटेनर में एक अवधि वाला एक लिंक जोड़ता हूं, और मैं इनपुट बॉक्स को छुपाता हूं।

लिंक और अवधि स्टाइल की गई है ताकि यह एक्स के साथ एक बटन जैसा दिखता हो, और डीओएम से प्रविष्टि को हटाने के लिए एक क्लिक इवेंट हैंडलर है, छुपा हुआ क्षेत्र साफ़ करें, और क्लिक किए जाने पर इनपुट बॉक्स को दोबारा दिखाएं । तो एक आइटम का चयन जब जाता है:

<div class="container"> 
    <a href="#"><span>Selected Item</span></a> 
    <input id="myautocomplete" type="text" /> 
    <input type="hidden" name="myvalue" value="1" /> 
    </div> 

और एक आइटम का चयन नहीं किया गया है जब:

<div class="container"> 
    <input id="myautocomplete" name="myautocomplete" type="text" /> 
    <input id="myvalue" name="myvalue" type="hidden" value="" /> 
    </div> 

इस तरह, आप या तो किसी आइटम का चयन करने के लिए मजबूर कर रहे हैं, या आप मुक्त रूप पाठ दर्ज करें। बैकएंड पर, यदि कुंजी 'myvalue' के साथ अनुरोध पैरामीटर खाली है, तो आप कुंजी 'myautocomplete' के साथ अनुरोध पैरामीटर देखेंगे।

+0

भी, jQuery UI स्वत: पूर्ण के चयन हैंडलर में, प्रत्येक बार जब आप कोई आइटम चुनते हैं, तो आप एक ही नाम के साथ एक छिपे हुए फ़ील्ड बना सकते हैं, इसलिए यदि आप एकाधिक देशों का चयन कर रहे हैं, तो छिपे हुए फ़ील्ड का नाम विशेषता 'देश' बनाएं। यदि आप इसे हटाने के लिए किसी प्रविष्टि पर क्लिक करते हैं, तो यह संबंधित छिपे हुए फ़ील्ड को हटा देता है। सर्वर की तरफ, आप आईडी की एक अल्पविराम से अलग सूची को पुनर्प्राप्त करना समाप्त कर देते हैं जिसे विभाजित किया जाना चाहिए और एक पूर्णांक/लंबी सरणी में परिवर्तित किया जाना चाहिए। – jamiebarrow

+0

यह एक अच्छा सुझाव है और किसी भी चीज की अनुपस्थिति में, मैं जिस तरह से जाऊंगा। आदर्श रूप में, मैं कुछ ऐसा पसंद करूंगा जिसके लिए jQuery UI विजेट के शीर्ष पर बहुत कम इमारत की आवश्यकता हो - ऐसा लगता है कि विजेट को उस समर्थन का समर्थन करना चाहिए जो मैं बॉक्स से अधिक या कम करना चाहता हूं। – Shabbyrobe

+0

खैर मुझे कुछ इसी तरह से काम सौंपा गया है, इसलिए मैं इसे अच्छी तरह से करने के सुझावों के बारे में भी सुझाव दे रहा था :) मेरे सुझाव की खुशी से खुशी हुई!पृष्ठ को पुनः लोड जबकि editting, आप छिपा क्षेत्र में मूल्यों के लिए सभी स्पैन आदि से बनाना पर - एक और बात अगर एक निर्माण और editting के लिए एक ही पृष्ठ का उपयोग कर रहा है। फिलहाल मैं सर्वर सर्वर पर ऐसा कर रहा हूं। केवल समस्या यह है कि कक्षाओं जैसी चीजों को अब फ्रंटेंड कोड और बैकएंड कोड में बनाए रखा जाना चाहिए ... मुझे यह पसंद नहीं है लेकिन यह काम करता है। – jamiebarrow

1

जब मैं अनुमान आप निम्नलिखित क्षेत्रों की स्थापना की है:

<div> 
    <input type="text" name="visible" class="autocomplete-reference" /> 
    <input type="hidden" name="hidden" /> 
</div> 

आप निम्न js (यह jQuery 1.5.2 के साथ काम करता है) init की जरूरत है:

$(document).ready(function() { 
    $('.autocomplete-reference').each(function() { 
     $(this).keydown(function(e){ 
      /* 
      * this will reset hidden id reference on each visible field manual change 
      * we have to bind it on keydown because we want to recognize event of submiting form by enter after autocomplete set 
      */ 
      if (e.keyCode != 13) { 
       $(this).siblings('input[type=hidden]').each(function() { 
        $(this).val(''); 
       }); 
      } 
     }); 
     $(this).autocomplete({ 
      minLength: 1, 
      /* you can set appending of autocomplete menu into some container to set css contextually 
      appendTo: '#someElem',*/ 
      source: sourceFunction, 
      search:function (event, ui) { 
       //TODO ...spinner init... 
      }, 
      open:function (event, ui) { 
       /* you can grab autocomplete menu widget by this to manipulate some recognizing id, etc.. 
       * $(this).autocomplete('widget') 
       */ 
       //TODO ..stop spinner ... 
       $(this).keydown(function(e){ 
        /* this is important for live reference updates while arrow keys changes */ 
        if (e.keyCode == 37 || e.keyCode == 39) { 
         $($(this).data('autocomplete').menu.active).find('a').trigger('click'); 
        } 
       }); 
      }, 
      focus: function(event, ui) { 
       /* here we'll map our data object onto both fields */ 
       $(this).val(ui.item.label); 
       $(this).siblings('input[type=hidden]').each(function() { 
        $(this).val(ui.item.key); 
       }); 
      }, 
      select: function(event, ui) { 
       /* here we'll map our data object onto both fields */ 
       $(this).val(ui.item.label); 
       $(this).siblings('input[type=hidden]').each(function() { 
        $(this).val(ui.item.key); 
       }); 
      }, 
      close: function(event, ui) { 
       //TODO ..stop spinner ... 
      } 
     }); 
    }); 
}); 

यह कुछ है करने के लिए बहुत अच्छा है सर्वरसाइड सत्यापन जो सटीक रूप से परिवर्तित कर सकता है: पाठ्यक्रम के त्वरित टाइपिंग लोगों के संदर्भ में दृश्य फ़ील्ड मान संदर्भों में।

0

हालांकि यह एक पुराना सवाल है, मेरी विधि मदद कर सकती है।

.change ईवेंट पर आप लूप का उपयोग करके अपनी स्रोत सूची से मूल्य के साथ टेक्स्टबॉक्स मान खोज सकते हैं।

गोटो अधिक जानकारी के लिए: यहां यह अजाक्स स्रोत सूची में है लेकिन कसरत समान है। Search a text In Jquery AutoComplete Ui

यह बात कई बार मुझे परेशान कर दिया गया था और अंत में अब मैं यह समझ से बाहर :)

0

आप event.preventDefault उपयोग कर सकते हैं

ui.item.label के माध्यम से अपने चुने गए मानों इकट्ठा या ui.item.value और आवश्यक मान प्राप्त करें और इसे उसी टेक्स्टबॉक्स पर सेट करें।

var idNameCombo = ui.item.label; 
      event.preventDefault(); 
      $("#mID").val(idNameCombo.split(",")[0].trim()); 
संबंधित मुद्दे