2010-02-19 1 views
2

У меня есть довольно простой алгоритм разбиения на страницы, но он не работает так, как мне бы хотелось.Ошибка алгоритма разбиения на страницы

В настоящее время он показывает, как этот

1 2 3 ... 33 34 35 [36] 37 38 ... 47 48 49 50 

Когда следует отображать как этот

1 2 3 ... 33 34 35 [36] 37 38 39 ... 48 49 50 

Вот мой код, я написал очень быстро. Он также, кажется, постоянно работает (цикл не останавливается), но я не знаю, почему.

$(function(){ 
      var pages = 50;     //Total number of pages 
      var current = 36;    //The current page we are on 
      var before = 3;     //Number of links to display before current 
      var after = 3;     //Same as above but after 
      var start = (current - before); //The number of the first link 
      var end = (current + after); //Number of the end link 

      for(var i = 1; i <= pages; i++){ 
       if(i == (before + 1)){ 
        i = start; 
        document.write('...'); 
       } 
       else if(i == (current + after)){ 
        i = (pages - after); 
        document.write('...'); 
       } 
       if(i == current){ 
        document.write(' ['+i+'] '); 
       } 
       else{ 
        document.write(' '+i+' '); 
       } 
      } 
     }); 
+1

+1 так как я не могу понять, почему это должно быть -1. – Mizipzor

ответ

1
  1. current + after составляет 39 (36 + 3) здесь, так неудивительно, что он отображает «...» вместо 39, увеличит «после» на 1, чтобы исправить это
  2. после просмотра кода в течение нескольких минут, у меня нет подсказки, почему он должен работать вечно :) У вас есть попробовал написать «i» на консоли, чтобы проверить, какие значения он принимает и почему он никогда не достигает своего «окончательного значения»?
2

Исправьте after в after + 1 в 2 места во всех местах в вашем цикле, где вы используете его.

Кроме того, я не уверен, что ваш код будет корректно работать на крайние случаи (например, когда ток == 2) - вы можете проверить, что

+0

Собственно, он не может просто изменить переменную, так как '(страницы - (после + 1)) == 46'. Второй вариант лучше, так как он произведет '(pages - after + 1) == 48', правильный код во втором экземпляре. –

0

Существует причина, по которой в большинстве языков используются индексирование с нулевым индексом: математика просто проще. В вашем случае, так как вы, очевидно, не может использовать индексацию с нуля, вы просто должны зафиксировать вне череде ошибок:

else if(i == (current + after + 1)){ 
    i = (pages - after + 1); 
    document.write('...'); 
} 
2

Если (current + after) > (pages - after) и (current + after) < pages, то этот код будет работать вечно из-за:

else if(i == (current + after)){ 
    i = (pages - after); 
    document.write('...'); 
} 

Каждый раз, когда i достигает current + after, она будет снижена до pages - after, и цикл будет продолжаться бесконечно

0

следующая алгоритм дает 5 страниц вокруг текущей страницы

Пример:
- [Х] текущая страница
- В этом случае общее количество страниц 20

<[1] 2 3 4 5> 
<1 [2] 3 4 5> 
<1 2 [3] 4 5>   
<2 3 [4] 5 6> 
... numbers in between ... 
<15 16 [17] 18 19> 
<16 17 [18] 19 20> 
<16 17 18 [19] 20> 
<16 17 18 19 [20]> 

или в случае общего количества страниц меньше 5, скажем, 3 ...
результаты выглядят

<[1] 2 3> 

И так далее.

function (page, totalPages) { 
    var leftBoundry = Math.max(1, page - 2) 
    var rightBoundry = Math.min(totalPages, page + 2) 
    var arr = [] 
    var emptyRight = 2 - (rightBoundry - page) 
    var emptyLeft = 2 - (page - leftBoundry) 

    leftBoundry = Math.max(1, leftBoundry - emptyRight) 
    rightBoundry = Math.min(totalPages, rightBoundry + emptyLeft) 

    for (var i = leftBoundry; i <= rightBoundry; i++) { 
     arr.push(i) 
    } 

    return arr; 
} 

.

 Смежные вопросы

  • Нет связанных вопросов^_^