2013-06-06 5 views
2

Я делаю маленькую карусель с пейджером. Карусель отображает элементы 6 на 6, и у меня есть 36 элементов для отображения. У меня есть следующая и предыдущая кнопка. Первыми отображаемыми элементами являются [0, 6]. Если я нажимаю предыдущую кнопку и нет предыдущих элементов (например, я на первой странице), она должна обернуться и перейти к концу. То же самое относится к последним элементам и следующей кнопке.Держите указатель в пределах и оберните вокруг

Мой код выглядит следующим образом:

$('#img_prev').click(function (e) { 
    # change this line so it wraps around 
    imgIndex = (imgIndex - 6) % 36; 
    alert(imgIndex) 
    refreshImages(imgIndex); 
    e.preventDefault(); 
    return false; 
}); 
$('#img_next').click(function (e) { 
    imgIndex = (imgIndex + 6) % 36; 
    refreshImages(imgIndex); 
    e.preventDefault(); 
    return false; 
}); 

И не жалко, потому что -6% 36 -6, а не 30. Я мог бы с этим справиться, если (index < 0) ..., но я предпочел бы состояние с по модулю, что лучше всего захватить поведение обертывания.

Как это сделать, чтобы обернуть (см. 2-я строка)?

+2

_ «И это терпит неудачу, потому что -6% 36 - это -6, а не 30.» _ - тогда добавьте еще 36 (так что '+ 30' с вычитанием 6 за один шаг уже), прежде чем выполнять модульное div ... – CBroe

+0

@CBroe Да на самом деле это эквивалентно тому, что я имел в виду (см. мой ответ) –

+0

'imgIndex = ((imgIndex - 6) + 36)% 36;' который является '(imgIndex + 30)% 36', хотя это труднее читать. – Orbling

ответ

6

Одним из возможных решений было бы с this answer:

function mod(x, m) { 
    return (x%m + m)%m; 
} 

$('#img_prev').click(function (e) { 
    # this line has been changed, now it wraps around 
    imgIndex = mod(imgIndex - 6, 36); 
    ... 
+0

Вам не нужно делать по модулю с тем же «делителем» дважды, 'return (x + m)% m' должно быть достаточно. – CBroe

+0

@CBroe У автора функции mod (@ShreevatsaR) должна быть веская причина для этого. Я думал, может быть, для некоторых случаев краев с отрицательными числами. Но я не могу понять, что какие-либо были: (x + m)% m' и '(x% m + m)% m' разные. Так хорошо. –

+0

Нет, вы на самом деле правы - если индекс, который мы пытаемся «содержать» здесь, уже был уже вне границ (используется в другом месте кода или что-то еще), так например '-41', тогда мы получим' (-41 +36)% 36 = -5' с моим предложением - так что modulo на входном значении сначала имеет право на участие: '(-41% 36 + 36)% 36 = 31' – CBroe

1

Вы можете попробовать это:

var maxElements = 36; 
$('#img_prev').click(function (e) { 
    // change this line so it wraps around 
    imgIndex = (maxElements - 1) - (imgIndex % maxElements); 
    alert(imgIndex) 
    refreshImages(imgIndex); 
    e.preventDefault(); 
    return false; 
}); 
$('#img_next').click(function (e) { 
    imgIndex = (imgIndex % maxElements); 
    refreshImages(imgIndex); 
    e.preventDefault(); 
    return false; 
}); 

Вот fiddle показывает выход:

(imgIndex % maxElements) 

и

(maxElements - 1) - (imgIndex % maxElements); 
Смежные вопросы