我找到了此解决方案 StackOverflow上不区分大小写的jQuery :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 ||&quot;&quot;)而不是 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(),我怀疑它很慢。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top