【问题标题】:Slow performance with jQuery selectorjQuery 选择器性能低下
【发布时间】:2013-03-11 12:12:45
【问题描述】:

我正在以 MVC 格式 (php Codeigniter) 呈现超过 600 个表单。这些表单中的每一个都有一个标有“更多选项”的按钮。当您单击此按钮时 - 位于同一父元素中的隐藏 div 被切换,显示更多输入字段和数据。问题是控制台中的兄弟切换很快,但是当我单击实际按钮时,触发需要很长时间。

使用 id 是推荐的解决方法,但是当我要处理这么多 div 元素时,这有点不切实际。

这是我的 js 文件

jQuery(document.ready(function(){
    jQuery("form >button[name='more_data'].meta_button").click( function(){  
        jQuery(this).siblings("div.meta").toggle("fast");
    });
});

这是结构(这些 div 有 650 个,以后还会有更多)

<div>
    <li id="bCIya8DZyr4idseJe5cbLA" class="even">
        <form action="url" method="post" accept-charset="utf-8">
            <div class="space_name"></div>
            <button name="more_data" type="button" class="meta_button">More Options</button>
            <input type="submit" name="Submit" value="Submit">
            <div class="meta" style="overflow: hidden; display: block;">
                <div class="meta_block">Set Estimates:
                    <div class="input_estimate">1:
                        <input type="number" name="estimate_1" value="" id="estimate_1" class="estimate">
                    </div>
                    <div class="input_estimate">2:
                        <input type="number" name="estimate_2" value="" id="estimate_2" class="estimate">
                    </div>
                    <div class="input_estimate">3:
                        <input type="number" name="estimate_3" value="" id="estimate_3" class="estimate">
                    </div>
                </div>
            </div>
        </form>
    </li>
</div>

注意:我正在运行 jQuery 1.7.2

【问题讨论】:

  • 您可以尝试使用.nextAll() 而不是.siblings()。为什么有这么多表格?
  • 如果适用,将“div.meta”更改为“.meta”。
  • 你在控制台中使用什么代码速度快?
  • 你确定没有渲染问题?喜欢复杂的回流和昂贵的 CSS 规则?根据我的经验,我们看到的代码看起来很快。
  • 属性选择器很慢;如果你真的不需要它,我会删除它并按类选择。

标签: javascript jquery optimization jquery-selectors


【解决方案1】:

不要使用委托

当您有多个事件侦听器时,使用@jrummell 建议的委托(.on() 和选择器)会更快,因为您可以将侦听器的数量减少到一个。

使用类的更简单的选择器

所以在这种情况下,尽管我建议使用更简单的选择器:

$(function(){
    $('.meta_button').on('click', function(){
        $(this).siblings('div.meta').toggle('fast');
    });
});

这样你有一个更简单的选择器和更少的点击触发检查,因为没有委托。此外,不会捕获对表单中其他元素的点击。

动画减慢速度

动画可能会减慢速度。在多个元素上同时执行的动画甚至更多。

尝试移动单个父元素中的所有 div.meta 元素并仅在该单个元素上应用动画。

您也可以只使用toggle() 完全删除动画(在这种情况下,关于多个项目的评论仍然有效)。

示例

$(function(){
    $('.meta_button').on('click', function(){
        $(this).parent().find('.meta_holder').toggle();
        // OR
        // $(this).next('.meta_holder').toggle();
    });
});

【讨论】:

  • 这确实稍微加快了渲染速度。毫秒数减少了。
  • @Fuhton 渲染是一个完全不同的世界。您询问了 jQuery 选择器和其他东西的速度。
  • 您使用的是什么浏览器?渲染内容在特定浏览器中可能会很慢,而在其他浏览器中会很快
  • 如果有一个包含所有元按钮的 ID,您也应该将其添加到选择器中
  • $('#containerID').find('button.meta_button').on(...) 会比 $('.meta_button') 更快。
【解决方案2】:

包含 jQuery.ui.css 使重新显示变得异常缓慢。昂贵的 CSS 规则会扼杀显示并减慢渲染时间。 “向正确的方向轻推”在问题的 cmets 中。

【讨论】:

  • 这解决了你的问题,但没有回答你的问题。这应该是对恕我直言的问题的评论。
  • 问题是为什么 jQuery 需要这么长时间才能触发。答案是昂贵的 CSS 规则。
猜你喜欢
  • 2010-11-27
  • 2011-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多