Jquery $(';.item#u name:包含(";text";)';)导致IE8在页面加载时冻结

Jquery $(';.item#u name:包含(";text";)';)导致IE8在页面加载时冻结,jquery,internet-explorer,loops,jquery-selectors,internet-explorer-8,Jquery,Internet Explorer,Loops,Jquery Selectors,Internet Explorer 8,我在$(document)上有一个循环,可以检查一个文本数组,该数组调用一个函数来搜索元素中的每个文本片段,并将其用作选择器 此代码在FF、Chrome、IE9+等中100%有效。。但在IE8中会冻结浏览器 var setText = function(value) { if(typeof $('.item_name:contains("'+value+'")') != 'undefined'){ // Do something, it still freezes with

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

此代码在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\u name”中的文本

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

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

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

这似乎是选择器性能问题

我建议采取以下步骤
1.在包含所有
项目名称的容器中添加一个id,如
id=“疯狂产品”
2.将
$('.item_name:contains(“+value+”)”)
更改为$('.item_name:contains(“+value+”)”),$(“#疯狂产品”)

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


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

$(')。item\u name:contains(“'+value+'”)
返回一个未定义的jQuery对象。您应该使用
length
属性。wrt最后一行,您的意思是
$('.item\u name:包含('+value+')).length>0
?@未定义,请参见最后一行,使用length也会导致冻结,无论不修复它的正确方法是什么。@Ezra您没有使用
length
属性!
if($('.item_name:contains(“+value+”))。length>0){
@undefined,woops..正确。但仍然不会影响冻结。将更新我问题的日期。那很好,但我不能添加id(除非你是说JavaScript),我根本不能直接修改HTML。你能试试
var context=$('.#page\u content>.main\u content\u holder>.main>.cross\u sell>.products')$(“.item_name:包含(“+value+”),上下文)
hmm,这大大提高了加载速度,加载时仍然需要8秒的冻结时间。但是它不再会使浏览器崩溃。但是,整个网站的上下文都会发生变化。它需要在具有不同div布局的不同页面上处于活动状态。
id
选择器将是最佳解决方案,如果你不能使用它,我认为是best你可以得到。否则,你需要进一步分析如何改进选择器。如果你有任何其他想法,也请告诉我。这纯粹是使用最佳选择器的问题。无论如何,请告诉我解决方案,并花相当长的时间找出问题