$('.item_name:containes("text")') 导致 IE8 在页面加载时冻结
Posted
技术标签:
【中文标题】$(\'.item_name:containes("text")\') 导致 IE8 在页面加载时冻结【英文标题】:$('.item_name:containes("text")') causing IE8 to freeze on page load$('.item_name:containes("text")') 导致 IE8 在页面加载时冻结 【发布时间】:2013-01-08 22:08:26 【问题描述】:我在 $(document) 上有一个循环。准备检查一个文本数组,该数组调用一个函数来搜索元素中的每个 sn-p 文本并将其用作选择器。
此代码在 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.
【问题讨论】:
$('.item_name:contains("'+value+'")')
返回一个不是 undefined
的 jQuery 对象。您应该改用length
属性。
写到最后一行,你的意思是$('.item_name:contains("'+value+'")').length > 0
?
@undefined,见最后一行,使用 length 也会导致冻结,无论什么是正确的都不能解决它。
@Ezra 你还没有使用length
属性! if($('.item_name:contains("'+value+'")').length > 0)
@undefined,哎呀..正确。但仍然不影响冻结。将更新我的问题的日期。
【参考方案1】:
这看起来是选择器性能问题。
我会建议以下步骤
1.在包含所有item_name
元素的容器中添加一个像id="crazy-products"
这样的id
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基于上下文的过滤器可以减少它。
【讨论】:
那很好,但我无法添加 ID。 (除非你指的是 javascript),我根本无法直接修改 HTML。 你可以试试var context = $('#page_content > .main_content_holder > .main > .cross_sell > .products'); $('.item_name:contains("'+value+'")', context)
hmm,这极大地改善了负载,加载时仍然冻结了 8 秒.. 但它不再使浏览器崩溃。但是,该上下文在整个站点中发生了变化。它需要在具有不同 div 布局的不同页面上处于活动状态。
id
选择器将是最佳解决方案,如果您不能拥有它,我认为这是您能获得的最佳解决方案。否则需要对选择器的进一步改进做进一步的分析。如果您有任何其他想法,也请告诉我。使用最优选择器纯粹是个问题
总之告诉我解决办法,花了好长时间才找到问题以上是关于$('.item_name:containes("text")') 导致 IE8 在页面加载时冻结的主要内容,如果未能解决你的问题,请参考以下文章