IE中的jQuery非常慢

时间:2011-07-04 10:10:26

标签: jquery internet-explorer

我编写了一个代码来过滤元素列表。

HTML:

<div id="ms-simpleCountries" class="ms-container">
<div class="ms-selectable"><ul><li style="display: none;" ms-value="fr">France</li><li style="display: none;" ms-value="ca">Canada</li><li ms-value="ar">Argentina</li><li ms-value="pt">Portugal</li></ul></div>
<div class="ms-selection"><ul><li ms-value="fr">France</li><li ms-value="ca">Canada</li></ul></div>
</div>

的Javascript:

function filterAvailable()
{
var filterText = "ca"; // <-- string used to filter


var a_val;
var a_txt;
$('.ms-container .ms-selectable li').each (function () { 

    // valore elemento disponibile corrente
    a_val = $(this).attr('ms-value');   // ca
    a_txt = $(this).text();             // canada

    // --
    if ($('.ms-container .ms-selection [ms-value="' +a_val +'"]').length > 0)
    {
        $(this).hide();
    }
    else 
    {
        if ($(this).text().toUpperCase().indexOf(filterText) >= 0)
        {
            $(this).show();
        }
        else
        {
            $(this).hide();
        }
    }

});//each

}//end

我测试了这个javascript代码大约500&lt; li&gt;类'ms-selectable'中的元素。 在我的IE8中,这段代码运行在10000毫秒,而在FF中运行1000毫秒! 如何在IE中执行此任务?

谢谢!

1 个答案:

答案 0 :(得分:3)

循环,特别是那些与DOM交互的循环,通常可能会导致旧浏览器的性能下降。通过确保您的选择器更加优化,您可以提供帮助,因为不间断时间旅行建议。不要反复重复$(this),而是将元素缓存在变量中:

var $this = $(this);

此外,通过使用常规的“for”循环而不是jQuery的$.each()方法,通常可以获得相当大的性能提升:

function filterAvailable () {
    var filterText = 'ca';
    var items = $('.ms-container .ms-selectable li');
    var $currentItem;
    var a_val;
    var a_txt;

    for (var i = 0, j = items.length; i < j; i++) {
        $currentItem = $(items[i]); // in place of $(this)

        // Contents of $.each() loop here
    }
}

在jsPerf上支持此项的大量测试:http://jsperf.com/jquery-each-vs-for-loop/186

重要的是要记住任何DOM交互(包括查找)都很慢。当您的页面中包含大量标记时尤其如此。您可以通过使用ID,缓存选择器,最小化DOM交互和使用常规for循环来加快速度。以下是尼古拉斯扎卡斯的精彩综述: http://jonraasch.com/blog/10-javascript-performance-boosting-tips-from-nicholas-zakas