有没有办法为不区分大小写的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()
我怀疑它很慢。
要添加杰森所说的内容,您可以尝试使用此插件来实现这一目标。