jQueryUI 1.9.0
jQueryUI 1.9 telah memberkati widget pelengkapan otomatis dengan response
acara tersebut, yang dapat kita manfaatkan untuk mendeteksi jika tidak ada hasil yang dikembalikan:
Dipicu setelah pencarian selesai, sebelum menu ditampilkan. Berguna untuk manipulasi data saran lokal, yang tidak memerlukan callback opsi sumber kustom. Peristiwa ini selalu dipicu saat penelusuran selesai, meskipun menu tidak akan ditampilkan karena tidak ada hasil atau Pelengkapan Otomatis dinonaktifkan.
Jadi, dengan pemikiran tersebut, peretasan yang harus kami lakukan di jQueryUI 1.8 diganti dengan:
$(function() {
$("input").autocomplete({
source: ,
response: function(event, ui) {
if (ui.content.length === 0) {
$("#empty-message").text("No results found");
} else {
$("#empty-message").empty();
}
}
});
});
Contoh: http://jsfiddle.net/andrewwhitaker/x5q6Q/
jQueryUI 1.8.0
Saya tidak dapat menemukan cara langsung untuk melakukan ini dengan API jQueryUI, namun, Anda dapat mengganti autocomplete._response
fungsinya dengan milik Anda sendiri, dan kemudian memanggil fungsi jQueryUI default ( diperbarui untuk memperluas objek pelengkapan otomatis prototype
) :
var __response = $.ui.autocomplete.prototype._response;
$.ui.autocomplete.prototype._response = function(content) {
__response.apply(this, [content]);
this.element.trigger("autocompletesearchcomplete", [content]);
};
Dan kemudian ikat event handler ke autocompletesearchcomplete
event (isinya adalah hasil pencarian, sebuah array):
$("input").bind("autocompletesearchcomplete", function(event, contents) {
$("#results").html(contents.length);
});
Apa yang terjadi di sini adalah Anda menyimpan response
fungsi pelengkapan otomatis ke variabel ( __response
) dan kemudian menggunakannya apply
untuk memanggilnya lagi. Saya tidak bisa membayangkan efek buruk dari metode ini karena Anda memanggil metode default. Karena kami memodifikasi prototipe objek, ini akan berfungsi untuk semua widget pelengkapan otomatis.
Berikut adalah contoh yang berfungsi : http://jsfiddle.net/andrewwhitaker/VEhyV/
Contoh saya menggunakan array lokal sebagai sumber data, tapi menurut saya itu tidak penting.
Pembaruan: Anda juga dapat menggabungkan fungsionalitas baru dalam widgetnya sendiri, memperluas fungsionalitas pelengkapan otomatis default:
$.widget("ui.customautocomplete", $.extend({}, $.ui.autocomplete.prototype, {
_response: function(contents){
$.ui.autocomplete.prototype._response.apply(this, arguments);
$(this.element).trigger("autocompletesearchcomplete", [contents]);
}
}));
Mengubah panggilan Anda dari .autocomplete({...});
menjadi:
$("input").customautocomplete({..});
Lalu ikat ke autocompletesearchcomplete
acara khusus nanti:
$("input").bind("autocompletesearchcomplete", function(event, contents) {
$("#results").html(contents.length);
});
Lihat contohnya di sini : http://jsfiddle.net/andrewwhitaker/VBTGJ/
Karena pertanyaan / jawaban ini mendapat perhatian, saya pikir saya akan memperbarui jawaban ini dengan cara lain untuk mencapai ini. Metode ini paling berguna jika Anda hanya memiliki satu widget pelengkapan otomatis di halaman. Cara melakukannya ini dapat diterapkan ke widget pelengkapan otomatis yang menggunakan sumber jarak jauh atau lokal:
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);
}
});
Di dalamnya if
adalah tempat Anda akan menempatkan logika kustom Anda untuk dieksekusi ketika tidak ada hasil yang terdeteksi.
Contoh: http://jsfiddle.net/qz29K/
Jika Anda menggunakan sumber data jarak jauh, katakan sesuatu seperti ini:
$("#auto").autocomplete({
source: "my_remote_src"
});
Kemudian Anda harus mengubah kode Anda sehingga Anda membuat panggilan AJAX sendiri dan dapat mendeteksi ketika 0 hasil kembali:
$("#auto").autocomplete({
source: function (request, response) {
$.ajax({
url: "my_remote_src",
data: request,
success: function (data) {
response(data);
if (data.length === 0) {
}
},
error: function () {
response([]);
}
});
}
});