【问题标题】:How can I add a `loading...` icon to jQuery UI's autocomplete widget如何向 jQuery UI 的自动完成小部件添加“正在加载...”图标
【发布时间】:2013-05-31 01:08:07
【问题描述】:

我正在尝试修改 jQuery's autocomplete widget 以在脚本搜索建议时更改输入的背景颜色。这是我的尝试(或看看my attempt on jsfiddle):

html

<label for="numbers">Numbers: </label>
<input id="numbers" />

javascript

var numbers = [],
    nb = 10000,
    i;

for (i = 0; i < nb; i += 1) {
    numbers.push(i.toString());
}

function color (color) {
    $('#numbers').css({
        background: color
    });
}

$("#numbers").autocomplete({
    source: numbers,
    search: function (event, ui) {
        console.log('search event fired');
        color("red");
    },
    open: function (event, ui) {
        console.log('open event fired');
        color("green");
    },
    close: function (event, ui) {
        console.log('close event fired');
        color("white");
    }
});

如您所见,我正在记录 searchopenclose 事件,以便查看它们何时被触发。

正如预期的那样,输入5(现有值)会触发search 事件并记录相应的消息,几秒钟后,会触发open 事件并记录其相应的消息。由于我在其中放置了 10000 个条目,因此 search 事件和 open 事件之间存在明显的延迟(大约 1 秒)。

让我感到困惑的是,当与search 事件相关联的日志消息出现时,并没有按照预期将背景颜色变为红色。相反,在open 事件发生之前它会保持白色,然后变为绿色(正如在打开事件之后所预期的那样)。但是,如果我输入a(一个不存在的值),背景颜色会毫无问题地变为红色(请注意,在这种情况下,open 事件永远不会发生,因为没有找到相应的值)。这里发生了什么?

出于好奇,我最终会尝试在搜索过程中显示一个小loading 图标(我很惊讶的一个功能并未随开箱即用的小部件提供)。背景颜色的改变是朝着这个方向迈出的第一步。

更新

我做了another attempt,这表明console.log后面的指令确实被调用了,但是视觉效果只是在很久以后才出现。这是我正在使用的代码:

$("#numbers").autocomplete({
    source: numbers,
    search: function (event, ui) {
        console.log('search event fired');
        $('#numbers').css({
            marginTop: "5em"
        });
        console.log('search callback done');
    }
});

如果您尝试一下,您会发现在字段被添加上边距取代之前,两条消息都已记录。不知何故,边距是在正确的时间添加的,但页面并没有在正确的时间重绘......

【问题讨论】:

标签: javascript combobox jquery-ui-autocomplete


【解决方案1】:

那么,你试过了吗?

$("#numbers").autocomplete({
    source: numbers,
    search: function (event, ui) {
        console.log('search event fired');
        $(this).addClass('working');
    },
    open: function (event, ui) {
        console.log('open event fired');
        color("green");
    },
    close: function (event, ui) {
        console.log('close event fired');
        color("white");
    }
});

这应该在您的文本框中添加一个类。只需添加一个名为“working”的 CSS 样式,背景属性为 red。

参考。 jQuery autocomplete: How to show an animated gif loading image

【讨论】:

  • 真的,你不需要任何代码,因为.ui-autocomplete-loading 类会在加载过程中自动应用。但是,我认为有一个错误,它不会显示样式。参考。 forum.jquery.com/topic/…
  • 是的,我看到了那个线程,但我从来没有发现如何在使用静态列表时异步进行搜索。文档中似乎没有任何内容...
  • 对不起,我帮不上忙。如果您认为不是异步是问题,请尝试将您的静态值添加到服务器并通过 ajax 调用它们。
  • 看起来它可以暂停,因为 javascript 是一种单线程语言。他们正在使用暂停执行的 SetTimeout()... 我会尝试使用 source: function(request, response) { 并尝试在返回响应之前在那里执行您的更改。
  • 我很惊讶地看到每个查询都调用了源回调。但是,它也不起作用:jsfiddle.net/Shawn/VgmE5
【解决方案2】:

简短的回答:这不是你的错 :) 发生的情况是,浏览器的绘制基本上停止了,因为自动完成插件非常很慢。

要确定速度有多慢以及为什么这么慢,您可以使用 Chrome Devtool 的时间线标签。在帧模式下,按记录可以看到这样的图表:

一旦您开始输入输入,您会看到黄色条(脚本)在条的轮廓上方。这意味着操作无法及时完成,从而导致浏览器停止。您可以查看堆栈跟踪以确定哪些行确实很慢。虽然这个问题是可以解决的,但它需要相当多的 jquery-ui 内部知识。

当使用这么多选项时,前端脚本可能不够用。您可以查看使用 ajax 前端的服务器端搜索,以便由服务器完成繁重的工作。

【讨论】:

  • 您是说脚本编写需要大量计算以致浏览器不再有“时间”将屏幕重新绘制为红色背景?
  • 是的。那是因为 CSS 是在浏览器的“绘画”线程中完成的。不幸的是,这也是 jquery-ui 减慢页面速度的部分。这很愚蠢,老实说,我很惊讶 jquery-ui 写得不够好,无法与之合作。
  • 还有一点,我没做过性能对比,不过我之前用过ivaynberg.github.io/select2/#documentation,没遇到什么问题。根据您的需要,这可能是一个不错的选择。
猜你喜欢
  • 2012-03-28
  • 1970-01-01
  • 2013-04-08
  • 1970-01-01
  • 1970-01-01
  • 2012-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多