有没有办法为不区分大小写的jQuery加速这个解决方案:包含选择器?

我找到了一个不区分大小写的jQuery的解决方案 :contains在StackOverflow上:contains选择器。 它工作得很好,但它以性能为代价。 有没有其他人觉得这个解决方案有点慢?

我正在使用:contains选择器来搜索表格。 用户在文本框中键入搜索字符串。 对于每次击键,它会在表中搜索该字符串,仅通过:contains选择器显示包含该字符串的行。 在实施不区分大小写的解决方案之前,此搜索快速而且快速。 现在有了这个解决方案,它会在每次击键后锁定一小段时间。

关于如何加快解决方案的任何想法?

我在Google上找到了另一种不区分大小写搜索的解决方案(参见Eric Phan ),这与我最初使用的解决方案略有不同。

原版的:

 return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0; 

EricPhan:

 return (a.textContent || a.innerText || "").toLowerCase().indexOf(m[3].toLowerCase())>=0; 

比较两者,您可以看到Eric Phan的解决方案直接访问DOM属性并使用toLowerCase()而不是toUpperCase() 。 后者并不重要,但前者确实改善了不区分大小写搜索的性能。 只需更改要使用的原始解决方案(a.textContent || a.innerText || "")而不是jQuery(a).text()就可以了!

现在我有点好奇,所以这是一个后续问题: jQuery.text()的处理是什么? 为什么这么慢? 我有我的假设,但我很想听听专家们的意见。

最后,感谢所有回复的人。 我恭维你的帮助。 =)

在用户停止键入指定的时间后,您可以尝试仅检查一次选择器,而不是每次按键。

例如,一个简单的实现:

用法:

 $("#textboxId").keyup(function () { typewatch(function () { // executed only 500 ms after the user stopped typing. }, 500); 

执行:

 var typewatch = function(){ var timer = 0; // store the timer id return function(callback, ms){ clearTimeout (timer); // if the function is called before the timeout timer = setTimeout(callback, ms); // clear the timer and start it over } }(); 

你可以尝试不要在每次按键后检查,但也许在按下最后一次按键后一秒钟。 这样,您不会在用户键入时不断检查,而是检查用户何时完成或暂停键入。

这是一个后续问题:jQuery.text()的处理是什么? 为什么这么慢?

由于$(a) (将DOM元素转换为jQuery对象)而不是.text()我怀疑它很慢。

要添加杰森所说的内容,您可以尝试使用此插件来实现这一目标。