jQuery选择器性能下降

时间:2013-03-21 19:52:27

标签: javascript jquery optimization jquery-selectors

我以MVC格式渲染超过600个表单(php Codeigniter)。这些表单中的每一个都有一个标有“更多选项”的按钮。单击此按钮时 - 将切换位于同一父元素中的隐藏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

2 个答案:

答案 0 :(得分:3)

不要使用代理

当你有多个事件监听器时,使用像@jrummell建议的委托(.on()和@jrummell建议更快,因为你将监听器的数量减少到一个。

使用类

的简单选择器

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

$(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();
    });
});

答案 1 :(得分:0)

包括jQuery.ui.css使重新显示速度极慢。昂贵的css规则杀死了显示并减慢了渲染时间。 “正确方向的推动”在问题的评论中。