jQueryUI 1.9
jQueryUI 1.9 ได้อวยพรให้วิดเจ็ตเติมข้อความอัตโนมัติด้วยresponse
เหตุการณ์ซึ่งเราสามารถใช้ประโยชน์เพื่อตรวจสอบว่าไม่มีผลลัพธ์กลับมา:
ทริกเกอร์หลังจากการค้นหาเสร็จสิ้นก่อนที่เมนูจะปรากฏขึ้น มีประโยชน์สำหรับการจัดการข้อมูลคำแนะนำในพื้นที่โดยที่ไม่จำเป็นต้องเรียกกลับตัวเลือกแหล่งที่มาที่กำหนดเอง เหตุการณ์นี้จะถูกทริกเกอร์เสมอเมื่อการค้นหาเสร็จสิ้นแม้ว่าเมนูจะไม่ปรากฏขึ้นเนื่องจากไม่มีผลลัพธ์หรือปิดใช้งานการเติมข้อความอัตโนมัติ
ด้วยเหตุนี้การแฮ็กที่เราต้องทำใน jQueryUI 1.8 จึงถูกแทนที่ด้วย:
$(function() {
$("input").autocomplete({
source: ,
response: function(event, ui) {
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) {
}
},
error: function () {
response([]);
}
});
}
});