0

我在 $(document).ready 上有一个循环来检查一个文本数组,该数组调用一个函数来搜索元素中的每个文本片段并将其用作选择器。

此代码在 FF、Chrome、IE9+ 等中 100% 工作。但在 IE8 中冻结了浏览器。

var setText = function(value)
{
    if(typeof $('.item_name:contains("'+value+'")') != 'undefined'){
      // Do something, it still freezes with nothing set here.
    }
}

// In the real script there maybe upwards of 20 items in this array.
var item_list = new Array('a','b','c');

$(document).ready(function() 
{
    $.each(item_list, function(index, value) {
       setText(value); 
    });
});

我已经禁用了 setText 函数并且它工作正常,所以它不是循环,它似乎是 :contains 选择器。

为什么会这样?我还能怎么做?我无法编辑 HTML 代码本身。

我的想法是我必须使用 jQuery 更改部分 HTML 标记,添加一些 HTML 并更改一些 CSS 值,但我拥有的唯一唯一标识符是“.item_name”中的文本。

冻结运行此程序的相关页面最多包含 3 个单独的“.item_name”实例。根据搜索字符串,其中任何一个都可能成为目标。

我使用的是 jQuery 1.7.1,无法更新。

if($('.item_name:contains("'+value+'")').length > 0){ // Also causes it to freeze.
4

1 回答 1

0

这看起来是一个选择器性能问题。

我建议执行以下步骤
1. 添加一个 id,例如id="crazy-products"包含所有item_name元素的容器
2. 更改$('.item_name:contains("'+value+'")')为 $('.item_name:contains("'+value+'")', $('#crazy-products') )

IE8 或更低版本没有document.getElementsByClassName实现,因此它正在查看文档中的所有元素,以查看是否应用了给定的过滤条件。如果我们可以将上下文传递给过滤条件,我们可以缩小文档查找的范围,从而提高页面的性能。

为了更好地理解问题,您可以查看 jquery.js 行号 4215 ( found = filter( item, match, i, curLoop )) 并查看数组的大小,curLoop在您的情况下它看起来非常大,通过将基于 id 的上下文传递给过滤器可以减少它.

于 2013-01-25T03:18:41.330 回答