JQuery UI स्वत: पूर्ण पर कोई परिणाम नहीं मिला


89

इससे पहले कि आप मुझे उनके बारे में बताएं, हां, मैंने इस विषय पर आधा दर्जन पदों की समीक्षा की है, लेकिन मैं अभी भी स्तब्ध हूं कि यह काम क्यों नहीं करता है।

मेरा लक्ष्य यह पता लगाना है कि स्वत: पूर्ण होने पर 0 परिणाम प्राप्त होते हैं। यहाँ कोड है:

 $.ajax({
   url:'sample_list.foo2',
   type: 'get',
   success: function(data, textStatus, XMLHttpRequest) {
      var suggestions=data.split(",");

  $("#entitySearch").autocomplete({ 
    source: suggestions,
    minLength: 3,
    select: function(e, ui) {  
     entityAdd(ui.item.value);
     },
    open: function(e, ui) { 
     console.log($(".ui-autocomplete li").size());
     },
    search: function(e,ui) {
     console.log("search returned: " + $(".ui-autocomplete li").size());

    },
    close: function(e,ui) {  
     console.log("on close" +  $(".ui-autocomplete li").size());    
     $("#entitySearch").val("");
    }
   }); 

  $("#entitySearch").autocomplete("result", function(event, data) {

   if (!data) { alert('nothing found!'); }

  })
 }
}); 

खोज स्वयं ठीक काम करती है, मैं बिना किसी समस्या के प्रकट होने के लिए परिणाम प्राप्त कर सकता हूं। जैसा कि मैं इसे समझता हूं, मुझे स्वत: पूर्ण ("परिणाम") हैंडलर के साथ परिणामों को बाधित करने में सक्षम होना चाहिए । इस मामले में, यह कभी भी फायर नहीं करता है। (यहां तक ​​कि एक सामान्य चेतावनी या कंसोल.लॉग जो परिणामों की संख्या को संदर्भित नहीं करता है जो कभी भी आग नहीं करता है)। ओपन इवेंट हैंडलर परिणामों की सही संख्या दिखाता है (जब परिणाम होते हैं), और खोज और करीबी इवेंट हैंडलर परिणाम आकार की रिपोर्ट करते हैं जो हमेशा एक कदम पीछे होता है।

मुझे लगता है कि मैं यहाँ कुछ स्पष्ट और चमकता हुआ याद कर रहा हूँ, लेकिन मैं इसे नहीं देखता।


ऐसा लगता है कि क्लाइंट-साइड डेटा द्वारा संचालित स्वत: पूर्ण विजेट के साथ इसे पूरा करने का एक आसान तरीका नहीं है। क्या विजेट के लिए एक दूरस्थ स्रोत का उपयोग करना एक विकल्प है?
एंड्रयू व्हाइटेकर

जवाबों:


199

jQueryUI 1.9

jQueryUI 1.9 ने responseघटना के साथ स्वत: पूर्ण विजेट को आशीर्वाद दिया है , जिसका कोई परिणाम नहीं मिलने पर हम इसका पता लगाने का लाभ उठा सकते हैं:

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

इसलिए, उस दिमाग को, जिसे हमें jQueryUI 1.8 में करना था, को इसके साथ बदल दिया गया है:

$(function() {
    $("input").autocomplete({
        source: /* */,
        response: function(event, ui) {
            // ui.content is the array that's about to be sent to the response callback.
            if (ui.content.length === 0) {
                $("#empty-message").text("No results found");
            } else {
                $("#empty-message").empty();
            }
        }
    });
});​

उदाहरण: http://jsfiddle.net/andrewwhitaker/x5q6Q/


jQueryUI 1.8

मुझे jQueryUI API के साथ ऐसा करने का एक सीधा तरीका नहीं मिला, हालाँकि, आप autocomplete._responseफ़ंक्शन को अपने स्वयं के साथ बदल सकते हैं, और फिर डिफ़ॉल्ट jQueryUI फ़ंक्शन को कॉल कर सकते हैं ( स्वतः पूर्ण prototypeवस्तु को विस्तारित करने के लिए अद्यतन ) :

var __response = $.ui.autocomplete.prototype._response;
$.ui.autocomplete.prototype._response = function(content) {
    __response.apply(this, [content]);
    this.element.trigger("autocompletesearchcomplete", [content]);
};

और फिर ईवेंट हैंडलर को ईवेंट में बांधें autocompletesearchcomplete(सामग्री खोज का परिणाम है, एक सरणी):

$("input").bind("autocompletesearchcomplete", function(event, contents) {
    $("#results").html(contents.length);
});

यहाँ क्या हो रहा है कि आप स्वतः पूर्ण responseफ़ंक्शन को एक चर ( __response) में सहेज रहे हैं और फिर applyउसे फिर से कॉल करने के लिए उपयोग कर रहे हैं। जब से आप डिफ़ॉल्ट विधि को बुला रहे हैं, मैं इस पद्धति से किसी भी बुरे प्रभाव की कल्पना नहीं कर सकता। चूंकि हम ऑब्जेक्ट के प्रोटोटाइप को संशोधित कर रहे हैं, यह सभी स्वतः पूर्ण विजेट के लिए काम करेगा।

यहां एक कार्यशील उदाहरण दिया गया है : http://jsfiddle.net/andrewwhitaker/VEhyV/

मेरा उदाहरण डेटा स्रोत के रूप में एक स्थानीय सरणी का उपयोग करता है, लेकिन मुझे नहीं लगता कि इससे कोई फर्क नहीं पड़ता।


अद्यतन: आप अपने स्वयं के विजेट में नई कार्यक्षमता को भी लपेट सकते हैं, डिफ़ॉल्ट स्वत: पूर्ण कार्यक्षमता का विस्तार कर सकते हैं:

$.widget("ui.customautocomplete", $.extend({}, $.ui.autocomplete.prototype, {

  _response: function(contents){
      $.ui.autocomplete.prototype._response.apply(this, arguments);
      $(this.element).trigger("autocompletesearchcomplete", [contents]);
  }
}));

इसमें से अपना कॉल बदलना .autocomplete({...});:

$("input").customautocomplete({..});

और फिर autocompletesearchcompleteबाद में कस्टम इवेंट के लिए बाध्य करें :

$("input").bind("autocompletesearchcomplete", function(event, contents) {
    $("#results").html(contents.length);
});

यहां एक उदाहरण देखें : http://jsfiddle.net/andrewwhitaker/VBTGJ/


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

var src = [...];

$("#auto").autocomplete({
    source: function (request, response) {
        var results = $.ui.autocomplete.filter(src, request.term);

        if (!results.length) {
            $("#no-results").text("No results found!");
        } else {
            $("#no-results").empty();
        }

        response(results);
    }
});

अंदर है if, जहां आप अपने कस्टम तर्क को निष्पादित करने के लिए रखेंगे जब कोई परिणाम नहीं मिलता है।

उदाहरण: http://jsfiddle.net/qz29K/

यदि आप दूरस्थ डेटा स्रोत का उपयोग कर रहे हैं, तो कुछ इस तरह कहें:

$("#auto").autocomplete({
    source: "my_remote_src"
});

फिर आपको अपना कोड बदलने की आवश्यकता होगी ताकि आप खुद AJAX करें और 0 परिणाम वापस आने पर पता लगा सकें:

$("#auto").autocomplete({
    source: function (request, response) {
        $.ajax({
            url: "my_remote_src", 
            data: request,
            success: function (data) {
                response(data);
                if (data.length === 0) {
                    // Do logic for empty result.
                }
            },
            error: function () {
                response([]);
            }
        });
    }
});

@ और, किसी भी विचार कैसे मैं "सामग्री" सरणी में तत्वों का उपयोग कर सकते हैं jQuery का उपयोग कर ???
बॉन्ग

1
@ बैग्स: आपको इसे इंडेक्स द्वारा सीधे एक्सेस करने में सक्षम होना चाहिएcontents[0]
एंड्रयू व्हिटकर

दरअसल बात यह है कि कंटेंट एरे को यूजरनेम और उसकी इमेज के साथ पॉपुलेट किया गया था, और इंडेक्स वैल्यू को निर्दिष्ट करके इसे एक्सेस करने में सक्षम नहीं था। लेकिन इसका हल निकाल लिया। जैसे उल्लेख करना था, सामग्री [i] .user.username ... :) उत्तर और भयानक समाधान के लिए धन्यवाद ...
Bongs

उपरोक्त समाधान PrimeFaces स्वतः पूर्ण (2.2.x) के लिए भी बढ़िया काम करता है जो समान jQuery प्लगइन पर आधारित है।
१46

3
JqueryUI 1.8.19 में, _response फ़ंक्शन का नाम बदलकर __response किया गया। ( goo.gl/zAl88 )। तो, $ .ui.autocomplete.prototype._response $ .ui.autocomplete.prototype .__ प्रतिक्रिया हो जाता है
crazyphoton

6

हर कोई आसान, अंतर्निहित तरीके की अनदेखी कर रहा है: संदेशों का उपयोग करें: noResults इवेंट।

$('#field_name').autocomplete({
  source: $('#field_name').data('autocomplete-source'),
  messages: {
    noResults: function(count) {
      console.log("There were no matches.")
    },
    results: function(count) {
      console.log("There were " + count + " matches")
    }
  }
})

इस सुविधा को jQuery 1.9 में एक प्रायोगिक सुविधा ( यहाँ वर्णित ) के रूप में जोड़ा गया था । जुलाई 2017 तक, यह अभी तक एपीआई में प्रलेखित नहीं है


2

यदि आप एक दूरस्थ डेटा स्रोत (जैसे MySQL डेटाबेस, PHP) का उपयोग कर रहे हैं , या सर्वर की तरफ जो कुछ भी) का उपयोग कर रहे हैं, एक स्थिति को संभालने के लिए अन्य क्लीनर तरीके के एक जोड़े हैं जब ग्राहक को वापस करने के लिए कोई डेटा नहीं है (बिना किसी की आवश्यकता के) हैक्स या कोर कोड यूआई कोड बदल जाता है)।

मैं अपने दूरस्थ डेटा स्रोत और JSON के रूप में PHP और MySQL का उपयोग करता हूं ताकि उनके बीच जानकारी पास हो सके। मेरे मामले में मुझे jQuery अपवाद त्रुटियाँ मिल रही थीं यदि JSON अनुरोध को सर्वर से किसी प्रकार की प्रतिक्रिया नहीं मिली, तो मुझे सर्वर से खाली JSON प्रतिक्रिया वापस करना आसान लगा जब कोई डेटा नहीं है और फिर क्लाइंट को संभालना है वहां से प्रतिक्रिया:

if (preg_match("/^[a-zA-Z0-9_]*$/", $_GET['callback'])) {//sanitize callback name
    $callback = $_GET['callback'];
} else { die(); }

die($callback . "([])");

एक अन्य तरीका यह होगा कि सर्वर से प्रतिक्रिया में एक झंडा वापस किया जाए ताकि यह संकेत मिल सके कि कोई मिलान डेटा नहीं है और प्रतिक्रिया में ध्वज की मौजूदगी (और मान) के आधार पर कार्रवाई क्लाइंट साइड करें। इस मामले में सर्वर की प्रतिक्रिया कुछ इस तरह होगी:

die($callback . "([{'nodata':true}])");

फिर इस ध्वज क्रिया के आधार पर ग्राहक पक्ष का प्रदर्शन किया जा सकता है:

$.getJSON('response.php?callback=?', request, function (response) {
    if (typeof response[0].nodata !== 'undefined' && response[0].nodata === true) {
        alert('No data to display!');
    } else {
        //Do whatever needs to be done in the event that there is actually data to display.
    }
});

2

अपने स्वत: पूर्ण तत्व को प्रारंभ करने के बाद, संदेश विकल्प सेट करें यदि आप संदेश संकेत के लिए डिफ़ॉल्ट स्पैन का उपयोग करना चाहते हैं:

$(<yourselector>).autocomplete('option', 'messages', {
    noResults: 'myKewlMessage',
    results: function( amount ) {
        return amount + ( amount > 1 ? " results were" : " result was" ) + " found.";
    }
});

नोट : यह एक प्रायोगिक एपीआई है (प्रलेखित नहीं)। jQuery UI डेवलपर्स अभी भी स्ट्रिंग हेरफेर और अंतर्राष्ट्रीयकरण के लिए एक पूर्ण समाधान की जांच कर रहे हैं।


0

घंटो खेलने के बाद आखिरकार मुझे No match foundjQuery के स्वतः पूर्ण में प्रदर्शित करने की एक ट्रिक मिली । उपरोक्त कोड को देखें और केवल divमेरे मामले में #ulNoMatchऔर इसकी शैली सेट में जोड़ें displap:none। कॉलबैक सफलता पद्धति की जाँच करें कि क्या सरणी वापस आ गई है length == 0। अगर यह वहाँ है तुम जाओ, तुम अपना दिन बना दिया! :)

<pre><div class="ui-widget1" style="width: auto;">
    <asp:TextBox ID="txtSearch" class="tb" runat="server" Width="150px">
    </asp:TextBox>
    <ul id="ulNoMatch" class="ui-autocomplete ui-menu ui-widget1 ui-widget1-content ui-corner-all"
        role="listbox" aria-activedescendant="ui-active-menuitem" style="z-index: 16;
        display: none; width: 150px;">
        <li class="ui-menu-item" role="menuitem"><a class="ui-corner-all" tabindex="-1">No Matches
            Found</a></li>
    </ul>
    </div><pre>
<b>
<b>

Enter code here

<script>
    $(function () {
        $("input[id$='txtSearch']").autocomplete({
            source: function (request, response) {
                $.ajax({
                    url: "splah.aspx/GetByName",
                    data: "{ 'strName': '" + request.term.trim() + "' }",
                    dataType: "json",
                    type: "POST",
                    //cacheLength: 1,
                    contentType: "application/json; charset=utf-8",
                    dataFilter: function (data) {
                        return data; },
                    success: function (data) {
                        var found = $.map(data.d, function (item) {
                            return {
                                value: item.Name,
                                id: item.id
                            }
                         });

                         if (found.length == 0)
                         {
                             $("#ulNoMatch").show();
                         }
                         else
                         {
                             $("#ulNoMatch").hide();
                         }
                         response(found);
                    },
                    error: function (XMLHttpRequest, textStatus, errorThrown) {
                        alert(textStatus);
                    }
                });
            },
            select: function (event, ui) {
                $("input[id$='txtSearch']").val(ui.item.label);
                $("input[id$='txtID']").val(ui.item.id);
                return false;
            },
            minLength: 1
        });
    });
</script>

0

मैं यह नहीं देखता कि sourceकस्टम कॉलबैक के साथ पैरामीटर पर्याप्त क्यों नहीं है:

$("#autocomplete").autocomplete({
    source: function (request, response) {
        $.ajax({
            url: "http://example.com/service.json",
            data: {
                q: this.term
            },
            success: function (data, textStatus, jqXHR) {
                // data would be an array containing 0 or more items
                console.log("[SUCCESS] search returned " + data.length + " item(s)");
                response(data);
            },
            error: function (jqXHR, textStatus, errorThrown) {
                // triggered when AJAX failed because of, for example, malformed JSON
                console.log("[FAILURE] search returned error");
                response([]);
            }
        });
    }
});

-1
function SearchText() {
 $(".autosuggest").autocomplete({
   source: function (request, response) {
    $.ajax({
     type: "POST",
     contentType: "application/json; charset=utf-8",
      url: "Default.aspx/GetAutoCompleteData",
      data: "{'username':'" + document.getElementById('txtSearch').value + "'}",
        dataType: "json",
        success: function (data.d) {
        if ((data.d).length == 0) {
         alert("no result found");
          }
           response(data.d);
         },
         error: function (result) {
              alert("Error");
         }
         });
        }
     });
  }

यह उत्तर कुछ भी नया योगदान नहीं देता है, स्वीकृत उत्तर में समान कोड होता है।
मार्टिन

-1
The easiest straight forward way to do it.

$("#search-box").autocomplete({
                    minLength: 2,
                    source:function (request, response) {
                        $.ajax({
                            url: urlPref + "/Api/SearchItems",
                            data: {
                                term: request.term
                            },
                            success: function (data) {
                                if (data.length == 0) {
                                    data.push({
                                        Id: 0,
                                        Title: "No results found"
                                    });
                                }
                                response(data);
                            }
                            });
                        },

यह उत्तर कुछ भी नया योगदान नहीं देता है, स्वीकृत उत्तर में समान कोड होता है।
मार्टिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.