Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Как сделать выполнение ф-ции только для видимых объектов на экране? (https://javascript.ru/forum/jquery/34831-kak-sdelat-vypolnenie-f-cii-tolko-dlya-vidimykh-obektov-na-ehkrane.html)

Randomizer 20.01.2013 23:36

Как сделать выполнение ф-ции только для видимых объектов на экране?
 
Суть задачи:
на странице есть очень много объектов с каждым из которых выполняется однотипное действие (вычисление), если нажать на кнопку.
Из-за того, что объектов много, а вычисления многоуровневые, то после нажатия на кнопку (которая запускает вычисления) браузер замирает на 5-10 сек (нагружается кучей операций).
Как сделать так, что бы после нажатия на кнопку вычисления выполнялись только над видимыми на данный момент объектами?
По аналогии с ajax загрузкой фоток или товаров по мере пролистывания страницы вниз.

Deff 21.01.2013 02:26

Randomizer,
Выложите код - стрёмно предлагать найти пути в минном поле, не видя карты.

Tim 21.01.2013 08:06

В jQuery есть такая штука .is(':visible')
Если нужно на чистом js можно посмотреть реализацию в jQuery

Randomizer 21.01.2013 11:44

:visible полагаю, что не подходит т.к. этот селектор не проверяет на нахождение объектов в области видимости экрана, а проверяет их на видимость в целом (типа display:none).

Ок, вот пример:
$('#starcalc').click(function() {
 $('.object').each(function(){
  $(this).find('.val').clone();
  $(this).find('.rnd').remove();
  ...еще куча операций...
 });
});

Tim 21.01.2013 11:53

Randomizer,
Можно нужно закешировать куда то ссылки на $(this).find('.val') и $(this).find('.rnd') тогда будет гораздо быстрее.

Цитата:

Функция getPosition - довольно медленная: она работает с DOM, и ей надо пройти по всей цепочке offsetParent. Выполнять ее каждый раз при движении мыши для поиска текущего акцептора - все равно что нажать на большой-большой тормоз.

Стандартным выходом в такой ситуации является кеширование координат акцепторов, а точнее - их ограничивающих прямоугольников, так чтобы код mouseMove был максимально прост.
Источник: http://javascript.ru/ui/draganddrop - (Drag and drop)

ksa 21.01.2013 14:02

Цитата:

Сообщение от Randomizer
Из-за того, что объектов много, а вычисления многоуровневые, то после нажатия на кнопку (которая запускает вычисления) браузер замирает на 5-10 сек (нагружается кучей операций).

Замирание "лечится" использованием
http://javascript.ru/setTimeout
http://javascript.ru/setInterval

Deff 21.01.2013 16:06

Цитата:

Сообщение от Deff
Randomizer,
Выложите код - стрёмно предлагать найти пути в минном поле, не видя карты.

Или ссылку на тестовую страницу, Вероятней всего принцип работы до задачи кривой.
С другой стороны, ежели лень копать прошлое, разбейте body на блоки высотой 400-700px и рассортируйте контент по ним. Пройтись по данным блоком - обнаружить три или менее их, входящих в поле зрения, и работатьь с ними


Часовой пояс GMT +3, время: 06:13.