クライアント側で C# と JavaScript を使用して、独自のオートコンプリート テキスト ボックス コントロールをプログラミングしています。クライアント側では、ユーザーが検索していた文字に一致する文字列内の文字を置き換えて強調表示したいと考えています。たとえば、ユーザーが「bue」という文字を検索していた場合、「marbuel」という単語のこの文字を次のように置き換えたいとします。
mar<span style="color:#81BEF7;font-weight:bold">bue</span>l
一致する部分に別の色を与えるために。オートコンプリートに 100 ~ 200 個のアイテムがある場合、これはかなりうまく機能しますが、500 個以上になると時間がかかりすぎます。
次のコードは、このロジックを実行する私のメソッドを示しています。
HighlightTextPart: function (text, part) {
var currentPartIndex = 0;
var partLength = part.length;
var finalString = '';
var highlightPart = '';
var bFoundPart = false;
var bFoundPartHandled = false;
var charToAdd;
for (var i = 0; i < text.length; i++) {
var myChar = text[i];
charToAdd = null;
if (!bFoundPart) {
var myCharLower = myChar.toLowerCase();
var charToCompare = part[currentPartIndex].toLowerCase();
if (charToCompare == myCharLower) {
highlightPart += myChar;
if (currentPartIndex == partLength - 1)
bFoundPart = true;
currentPartIndex++;
}
else {
currentPartIndex = 0;
highlightPart = '';
charToAdd = myChar;
}
}
else
charToAdd = myChar;
if (bFoundPart && !bFoundPartHandled) {
finalString += '<span style="color:#81BEF7;font-weight:bold">' + highlightPart + '</span>';
bFoundPartHandled = true;
}
if (charToAdd != null)
finalString += charToAdd;
}
return finalString;
},
このメソッドは、一致する部分の最初の出現のみを強調表示します。私は次のように使用します。リクエストがサーバーから戻ってきたら、各アイテムをループして一致するアイテムを含む html UL リストを作成し、各ループでこのメソッドを呼び出して一致する部分を強調表示します。
私が言ったように、最大100個のアイテムはかなりいいですが、500個以上には多すぎます.
速くする方法はありますか?多分正規表現または他の技術を使用して?
また、「setTimeOut」を使用して追加の機能で実行するか、現在表示されているアイテムに対してのみ実行することも考えました。これは、スクロールする必要があるアイテムがいくつかしか表示されていないためです。