大文字と小文字を区別しないjQuery:containsセレクターのこのソリューションを高速化する方法はありますか?
-
05-07-2019 - |
質問
このソリューションが見つかりました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;
2つを比較すると、Eric PhanのソリューションがDOM属性に直接アクセスし、 toUpperCase()
の代わりに toLowerCase()
を使用していることがわかります。後者は実際には重要ではありませんが、前者は大文字と小文字を区別しない検索のパフォーマンスを本当に改善したものです。元のソリューションを変更して、 jQuery(a).text()
の代わりに(a.textContent || a.innerText ||"")
を使用するだけで、差!
今私は少し興味がありますので、次の質問があります: jQuery.text()
の対処法は?なぜそんなに遅いのですか?前提はありますが、専門家の意見を聞きたいです。
最後に、回答してくれたすべての人に感謝します。あなたの助けを感謝します。 =)
他のヒント
ユーザーがすべてのキーストロークではなく、指定した時間タイプを停止した後、セレクターを1回だけチェックしようとすることができます。
たとえば、簡単な実装:
使用法:
$("#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
}
}();
各キーストロークの後にチェックするのではなく、最後のキーストロークが押されてから1秒後にチェックすることもできます。この方法では、ユーザーが入力している間は常にチェックするのではなく、ユーザーが終了したときや入力を一時停止したときにチェックします。
フォローアップの質問:これは何ですか jQuery.text()との取引?どうしてですか とても遅いですか?
.text()
ではなく、 $(a)
(DOM要素をjQueryオブジェクトに変換するため)が遅いと思われます。
ジェイソンが言ったことに追加するには、このプラグインでそれを実現します。