Мне нужно выяснить, какой элемент в списке находится в верхней части страницы. Мое решение состоит в том, чтобы использовать jQuery для циклического перемещения элементов и просмотра позиции.
Это прекрасно работает, но производительность ухудшается, когда есть много элементов. См. Эту скрипту для упрощенного примера
Вот странные вещи, которые я замечаю
Есть ли лучшее решение для того, что я пытаюсь сделать?
Вот код
<p>Log:
<div id="log">
</div>
</p>
Items:
<ul id="items">
</ul>
for (var i = 0; i < 10000; i++) {
$("#items").append("<li id='item_" + i + "'>" + i + "</li>");
}
var top = new Date().getTime();
$("li[id^='item_']").each(function() {
var start = new Date().getTime();
var top = $(this).position().top;
var end = new Date().getTime();
var time = end - start;
if (time > 1) {
$("#log").append($(this).attr('id') + ": " + time + "<br/>");
}
});
var bottom = new Date().getTime();
var overalltime = bottom - top;
$("#log").append("Overall Time: " + overalltime + "<br/>");
Хороший вопрос, несколько идей:
Вы, вероятно, не знаете, насколько медленнее jQuery, когда вы делаете такую интенсивную работу, как это, он делает кучу дополнительной работы, чтобы сделать все немного проще в использовании. Попробуйте использовать собственные функции JavaScript, и вы обязательно заметите разницу в производительности.
// get all <li> elements
var lis = document.getElementsByTagName('li');
// get all class="item" elements
var items = document.getElementsByClassName('item');
// offsetTop is the top position of the element
items[0].offsetTop;
Если у вас есть знания о том, насколько высоки элементы (или примерно как высока), вы можете измерить/оценить это значение и только проверить диапазон элементов, которые вам нужны. Например, если вы знаете, что на странице будет всего около 50 элементов, просто проверьте эти элементы.
Вы можете отложить большую часть работы на потом, чтобы браузер только обрабатывал управляемый объем работы, проверяя только текущие экраны и немного больше, это в основном та же идея, что и загрузка по мере того, как вы попадаете в нижнюю часть Twitter/Google+/и т.д..
Убедитесь, что вы проверяете только каждую десятую высоту элемента, если это имеет значение, вы можете сделать это в цикле for
, используя i += 10
в конце.
for (var i = 0; i < 10000; i += 10)