6

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

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

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

4

5 回答 5

10

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

原来的:

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

埃里克潘:

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()?为什么这么慢?我有我的假设,但我很想听听专家们怎么说。

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

于 2009-09-11T16:23:02.743 回答
6

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

例如,一个简单的实现:

用法:

$("#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
    }  
}();
于 2009-09-10T20:45:01.093 回答
1

您可以尝试在每次击键后不检查,但可能在最后一次击键后一秒钟。这样,您就不会在用户输入时不断检查,而是检查用户何时完成或暂停输入。

于 2009-09-10T20:11:26.050 回答
1

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

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

于 2011-01-06T00:55:35.437 回答
0

要补充 jason 所说的内容,您可以尝试使用此插件来完成此操作。

于 2009-09-10T20:16:47.057 回答