使用$ element.each()加速DOM访问

时间:2013-02-16 12:46:40

标签: javascript jquery dom performance

我正试图在我庞大的javascript UI应用程序中进行一些严重的延迟削减。 我一直在阅读优化代码的方法,从我学到的一些东西,我理解:

  1. $(元素).each()让事情变得更慢
  2. 应缓存变量(和HTML对象)
  3. 这是我在我的应用程序中经常运行的函数中现有代码的一部分:

    if($('.textbox').length > 0)
    {   $(".textbox").each(function(){
                 var parts = $(this).attr('id').split('_');
                 // do some linear-time operations here with $this
                });
         });
    

    到目前为止,我知道我应该将$this = $(this)放在.each()的开头,并且只使用$(this)。但我还能做些什么呢?有没有更快,替代的方式来使用.each()?我需要使用div类查看每个 .textbox

2 个答案:

答案 0 :(得分:1)

你正在使用jQuery,后面执行很多代码。最快的方法是原生Javascript。

真正的小优化是从id获得this。你也可以使用这个(Native JS)jQuery执行很多函数):

var parts = this.id.split('_'); 

例如
尽可能快地获取所有元素。您可以使用此函数按类名获取元素:

if (document.getElementsByClassName == undefined) {
    document.getElementsByClassName = function(className)
    {
        var hasClassName = new RegExp("(?:^|\\s)" + className + "(?:$|\\s)");
        var allElements = document.getElementsByTagName("*");
        var results = [];

        var element;
        for (var i = 0; (element = allElements[i]) != null; i++) {
            var elementClass = element.className;
            if (elementClass && elementClass.indexOf(className) != -1 && hasClassName.test(elementClass))
                results.push(element);
        }

        return results;
    }
}

循环代码:

var elements = getElementsByClassName(".textbox");
for(var i=0;i<elements.length;i++)
{
    var splitid = elements[i].id.split("_");
}

答案 1 :(得分:1)

  

但我还能做些什么呢?

有几件事:

  1. 你的if语句绝对没有意义(除非它有一个你没有显示的else子句),因为在一个空的jQuery对象上调用.each是无操作。删除它。

  2. 如果您不想删除它,至少缓存DOM查找的结果,因为每次调用$('.textbox') jQuery都必须关闭并查询DOM。

  3. id是DOM元素实例的反射属性,因此$(this).attr("id").split('_')涉及使用this.id.split('_')可以避免的多个函数调用和内存分配。

  4. 这样就给了我们:

    $('.textbox').each(function() {
        var parts = this.id.split('_');
        // Do something with `parts`
    });
    

    或者如果有else你没有显示:

    var boxes = $('.textbox');
    if (boxes.length) {
        boxes.each(function() {
            var part s= this.id.split('_');
            // ...
        });
    }
    else {
        // ...
    }