我希望能够在搜索发生时在自动完成下拉列表中显示 中的加载图标。我怎么能这样做呢?
当前代码:
$("#searchbox").autocomplete({
search: function(event, ui) {
$('ul.ui-autocomplete').append("<li id='loading_icon'></li>");
$('ul.ui-autocomplete').show();
},
open: function(event, ui) {
$('#loading_icon').hide();
}
...
但是,图标显示在浏览器页面的最左上方。该位置的计算尚未发生。我可以以某种方式调用计算自动完成下拉框的位置吗?
谢谢!
答案 0 :(得分:2)
这是可行的,但您必须将source
选项转换为函数并自行生成AJAX请求。例如:
$("#selector").autocomplete({
source: function (request, response) {
/* Show the loading indicator while a search is in progress */
response([{ label: "Loading...", loading: true }]);
$.ajax({
url: "your_url_here",
data: request,
type: "GET",
dataType: "json"
}).success(response);
},
}).data("autocomplete")._renderItem = function (ul, item) {
var $li = $("<li></li>")
.data("item.autocomplete", item)
.append("<a>" + item.label + "</a>")
.appendTo(ul);
/* Make sure nothing happens when you click "Loading" */
if (item.loading) {
$li.find("a").on("click", false);
}
};
覆盖_renderItem
的最后一位正在执行此操作,以便我们可以取消加载项的click事件(并防止它被放置在input
中)。
示例: http://jsfiddle.net/m3MGH/
更新,根据以下评论:
要在div
中显示加载图片,您可以执行以下操作(只需更改_renderItem
功能):
.data("autocomplete")._renderItem = function(ul, item) {
var $li = $("<li></li>");
if (item.loading) {
$li.append("<div>Loading<img src='my_loading_img' /></div>").appendTo(ul);
} else {
$li.data("item.autocomplete", item).append("<a>" + item.label + "</a>").appendTo(ul);
}
return $li;
};
你可能不得不使用一点CSS来使事情恰到好处,但这应该可以让你开始。
答案 1 :(得分:0)
这最初对我不起作用。我必须做的改变是重写_renderItemData类而不是_renderItem类,并返回$ li对象。
element.autocomplete({
...
}).data("autocomplete")._renderItemData = function (ul, item) {
var $li = $("<li></li>")
.data("item.autocomplete", item)
.append("<a>" + item.label + "</a>")
.appendTo(ul);
/* Make sure nothing happens when you click "Loading" */
if (item.loading) {
$li.find("a").on("click", false);
}
return $li;
};
答案 2 :(得分:0)
我认为
if (item.loading) {
$li.find("a").on("click", false);
}
是不够的,因为jQuery自动完成对按下Tab和Enter按钮的反应与鼠标单击相同。此外,自动完成功能会对“向上”和“向下”按钮作出反应。
有人可以建议解决这个问题吗?