Глобальные события и производительность jQuery?

Я искал способ показать индикатор состояния с помощью jQuery и нашел решение в jQuery Cookbook, оно показало это решение

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

        .....
  })(jQuery);

затем он предупредил,

Если вы испытываете проблемы с производительностью в своем приложении, это может быть связано с затратами на распространение событий при значительном количестве элементов. В этом случае установка глобального значения false может дать вам улучшение производительности.

Итак, сначала я должен использовать решение, показанное выше, и будет ли это проблемой производительности, поскольку мой сайт и код js становятся все больше и больше?

Должен ли я избегать глобальных событий jQuery, просто отключив их, как сказано в абзаце?

Наконец, как вы, ребята, показываете простой индикатор во время выполнения запроса ajax?


person Ray    schedule 02.07.2010    source источник


Ответы (1)


Честно говоря, я считаю это предостережение обоснованным, но в то же время устаревшим. Посмотрите исходный код 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?

Точно так же, как в вашем вопросе :)

person Nick Craver    schedule 02.07.2010
comment
Большое спасибо Ник! Действительно, книга, на которую я ссылаюсь, написана в прошлом году. Приятно знать, что с тех пор ситуация улучшилась, тогда я воспользуюсь решением. Спасибо. - person Ray; 02.07.2010