3

我正在寻找一种使用 jQuery 显示状态指示器的方法,我在 jQuery Cookbook 中找到了一个解决方案,它显示了这个解决方案

(function($) {
    $(document).ready(function() {
       $('#ajaxStatus')
         .ajaxStart(function() {
            $(this).show();
        })
         .ajaxStop(function() {
            $(this).hide();
        });

        .....
  })(jQuery);

然后它警告说,

如果您在应用程序中遇到性能问题,这可能是因为如果元素数量非常多,则事件传播的成本。在这种情况下,将 global 设置为 false 可能会提高性能。

所以首先我应该使用上面显示的解决方案,随着我的网站和 js 代码变得越来越大,这是否会成为性能问题?

我是否应该避免 jQuery 全局事件,就像段落中所说的那样将其关闭?

最后,你们如何在执行 ajax 请求时显示一个简单的指示器?

4

1 回答 1

9

老实说,我认为这种谨慎是有效的,但同时也是过时的。在这里查看 jQuery 源代码:http: //github.com/jquery/jquery/blob/master/src/event.js#L290

它显示了现在如何处理全局事件:

if ( jQuery.event.global[ type ] ) {
  jQuery.each( jQuery.cache, function() {
    if ( this.events && this.events[type] ) {
      jQuery.event.trigger( event, data, this.handle.elem );
    }
  });
}

曾经是:

jQuery("*").add([window, document]).trigger(type, data);

因此它不会像以前那样触发每个元素,这使得大量元素警告成为一个非常现实的问题,而是循环遍历已注册的元素或事件,并且仅在任何已注册的元素上循环,因此性能好得多现在。


对于您的问题:

所以首先我应该使用上面显示的解决方案,随着我的网站和 js 代码变得越来越大,这是否会成为性能问题?

是的,上面的解决方案很好,在我上面概述的全局事件优化之后,我还没有看到一个足够大的页面来解决这个问题。

我是否应该避免 jQuery 全局事件,就像段落中所说的那样将其关闭?

不,您几乎可以忽略该段落在进行此更改后使用任何 jQuery 。

最后,你们如何在执行 ajax 请求时显示一个简单的指示器?

就像你在你的问题中所说的那样:)

于 2010-07-02T02:44:20.370 回答