Zostałem ugryziony przez błąd Chrome/Webkit 71305, w którym ukrywanie dużej liczby węzłów powoduje zawieszanie się Chrome. (Występuje również w Safari).Obejmij filtrowanie na żywo 1500+ elementów z jQuery w przeglądarce Chrome
jestem filtrowania element listy, które będą znajdować się w menu rozwijanym z poniższym:
jQuery.expr[':'].Contains = function(a, i, m) {
return $.trim((a.textContent || a.innerText || "")).toUpperCase().indexOf(m[3].toUpperCase()) == 0;
};
var input = $('input');
var container = $('ul');
input.keyup(function(e) {
var filter = $.trim(input.val());
if (filter.length > 0) {
// Show matches.
container.find("li:Contains(" + filter + ")").css("display", "block");
container.find("li:not(:Contains(" + filter + "))").css("display", "none");
}
else {
container.find('li').css("display", "block");
}
});
fragment znaczników:
<input type="text" />
<ul>
<li>
<div>
<span title="93252"><label><input type="checkbox">3G</label></span>
</div>
</li>
</ul>
Czas potrzebny dla Javascript, aby wykonać jest znikome. Chodzi o to, kiedy Chrome musi przerysować elementy po usunięciu tekstu z zawieszonej w nim wersji. Nie występuje w FF6/IE7-9.
Zrobiłem JSFiddle do zilustrowania problemu: http://jsfiddle.net/uUk7S/17/show/
Czy istnieje inne podejście mogę wziąć zamiast ukrywanie i pokazywanie elementów, które nie spowodują Chrome powiesić? Próbowałem klonowania ul
, przetwarzania w klonie i zastępowania w całości klonem DOM, ale mam nadzieję, że jest lepszy sposób, ponieważ jest znacznie wolniejszy w IE.
brakuje nawiasu zamykającego dla elementów "span". czy to mogła być przyczyna? –
@William, to tylko błąd, który popełniłem podczas czyszczenia znaczników w Vimie. Naprawię skrzypce, ale problem nadal będzie występował. (Zwłaszcza, że działa dobrze w innych przeglądarkach). – Soliah