jQuery :подсчет видимых элементов -проблемы эффективности/скорости

У меня есть код, который работает нормально, но стал слишком медленным:

HTML:

У меня есть контейнер, содержащий около 50 ulэлементов. Каждый элемент ulимеет заголовок h4, за которым следует ряд элементов li. Функция скрывает заголовок, если элементы строки не видны.

Javascript/JQuery:

            function show_or_hide_headings() {
                $('#container').children('ul').each(function (i) {
                    var $this = $(this),
                        $h4 = $this.children(':first');
                    if ($this.children('li:visible').length) {
                        $h4.show();
                    } else {
                        $h4.hide();
                    }
                }); 
            }

Он работал вполне приемлемо, пока я не изменил природу элементов li. Каждый liтеперь представляет собой мини-таблицу, содержащую <table><tr><td>icon</td><td>text</td></tr></table>. Теперь обработка занимает 2 секунды, тогда как раньше это работало менее чем за полсекунды. (Таблица нужна для того, чтобы остановить обтекание текстом под значком.)

Признаюсь, я не совсем понимаю, почему добавление дополнительных элементов в каждый liдолжно так сильно замедлять обработку DOM, потому что я использовал селектор .children, чтобы углубиться только на один слой DOM.

Я тоже пробовал:

                $('#container').find('h4').each(function (i) {
                    var $this = $(this);
                    if ($this.siblings('li:visible').length) {
                       $this.show();
                    } else {
                       $this.hide();
                    }
                }); 

и $('#container').children().children('h4')на всякий случай.

Примечательно также то, что когда видно много liэлементов, это происходит намного медленнее, чем когда видимых мало. Однако сейчас нет больше очередей,чем тогда, когда он работал довольно быстро (т. е. до того, как в каждую строку вставлялась таблица ).

Приветствуется любой совет, но, пожалуйста, не просите, чтобы я размещал больше кода, чем у меня есть:)

Спасибо.

5
задан Nick 10 July 2012 в 05:11
поделиться