2010-02-19 66 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 2010-02-19 14:44:17

回答

1
  1. current + after爲39(36 + 3)在這裏,所以難怪它會顯示「...」而不是39,增加「後」1來修復這個
  2. 看了幾分鐘的代碼後,我沒有一個線索爲什麼它應該永遠運行:)你有沒有試着在控制檯上寫「i」來檢查它需要什麼值,以及爲什麼它永遠達不到它的「最終價值」?
2

請修正你的循環,你使用它的所有地方afterafter + 1在兩個地方。

而且,我不知道您的代碼將正常工作的邊緣情況(例如在當前== 2) - 你可能想測試

+0

事實上,他不能只是改變變量,因爲'(頁面 - (+ 1)之後)== 46'。第二種選擇更好,因爲它會在第二個實例中產生'(頁面 - + 1之後)== 48',這是正確的代碼。 – 2010-02-19 14:42:54

0

在大多數語言中,數組使用從零開始的索引是有原因的:數學更簡單。在你的情況,因爲你顯然不能使用從零開始的索引,你只需要修復的off-by-一個錯誤:

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頁

實施例:
- [X]是在當前頁
- 在這種情況下,總頁數是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; 
}