Coding Planet

jQuery, Java Script둜 νŽ˜μ΄μ§€λ„€μ΄μ…˜(pagination) κ΅¬ν˜„ν•˜κΈ° - μ½”λ“œ 포함 λ³Έλ¬Έ

πŸ’» Java Study

jQuery, Java Script둜 νŽ˜μ΄μ§€λ„€μ΄μ…˜(pagination) κ΅¬ν˜„ν•˜κΈ° - μ½”λ“œ 포함

jhj.sharon 2023. 6. 29. 10:17
λ°˜μ‘ν˜•

 

1. κ΅¬ν˜„ μ½”λ“œ

이 μ½”λ“œλŠ” νŽ˜μ΄μ§€λ„€μ΄μ…˜μ„ μ„€μ •ν•˜λŠ” `setupPagination` ν•¨μˆ˜μ™€ κ΄€λ ¨ κΈ°λŠ₯을 κ΅¬ν˜„ν•œ μ½”λ“œμž…λ‹ˆλ‹€. 

λ‹€μŒμ€ κ° λΆ€λΆ„μ˜ μ„€λͺ…μž…λ‹ˆλ‹€:

1. `setupPagination` ν•¨μˆ˜:
   - `rowsPerPage`: ν•œ νŽ˜μ΄μ§€μ— λ³΄μ—¬μ€„ ν•­λͺ© μˆ˜λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λ³€μˆ˜μž…λ‹ˆλ‹€.
   - `rows`: νŽ˜μ΄μ§€λ„€μ΄μ…˜μ„ μ μš©ν•  ν•­λͺ©λ“€μ˜ λ°°μ—΄μž…λ‹ˆλ‹€.
   - `rowsCount`: ν•­λͺ©μ˜ μ΄ κ°œμˆ˜λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λ³€μˆ˜μž…λ‹ˆλ‹€.
   - `pageCount`: μ „체 νŽ˜μ΄μ§€ μˆ˜λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λ³€μˆ˜μž…λ‹ˆλ‹€.
   - `numbers`: νŽ˜μ΄μ§€ λ²ˆν˜Έλ₯Ό ν‘œμ‹œν•˜λŠ” μš”μ†Œ(예: μˆ«μž λͺ©λ‘)λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λ³€μˆ˜μž…λ‹ˆλ‹€.
   - `prevPageBtn`, `nextPageBtn`: μ΄μ „ νŽ˜μ΄μ§€ λ° λ‹€μŒ νŽ˜μ΄μ§€λ‘œ μ΄λ™ν•˜λŠ” λ²„νŠΌμ„ λ‚˜νƒ€λ‚΄λŠ” λ³€μˆ˜μž…λ‹ˆλ‹€.
   - `pageActiveIdx`: ν˜„μž¬ νŽ˜μ΄μ§€ κ·Έλ£Ήμ˜ λ²ˆν˜Έλ₯Ό λ‚˜νƒ€λ‚΄λŠ” λ³€μˆ˜μž…λ‹ˆλ‹€.
   - `currentPage`: ν˜„μž¬ λ³΄κ³  μžˆλŠ” νŽ˜μ΄μ§€μ˜ λ²ˆν˜Έλ₯Ό λ‚˜νƒ€λ‚΄λŠ” λ³€μˆ˜μž…λ‹ˆλ‹€.
   - `maxPageNum`: νŽ˜μ΄μ§€ κ·Έλ£Ήμ˜ μ΅œλŒ€ κ°œμˆ˜λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λ³€μˆ˜μž…λ‹ˆλ‹€.

2. νŽ˜μ΄μ§€ λ²ˆν˜Έ μƒμ„±:
   - `numbers` μš”μ†Œμ— `pageCount` λ§ŒνΌμ˜ νŽ˜μ΄μ§€ λ²ˆν˜Έλ₯Ό μƒμ„±ν•˜μ—¬ μΆ”κ°€ν•©λ‹ˆλ‹€.
   - μƒμ„±λœ νŽ˜μ΄μ§€ λ²ˆν˜ΈλŠ” ν΄λ¦­ μ΄λ²€νŠΈμ— μ‘λ‹΅ν•˜κΈ° μœ„ν•΄ `numbersBtn` λ³€μˆ˜μ— ν• λ‹Ήλ©λ‹ˆλ‹€.

3. νŽ˜μ΄μ§€λ„€μ΄μ…˜ λ²ˆν˜Έ μˆ¨κΈ°κΈ°:
   - `numbersBtn` λ°°μ—΄μ„ μˆœνšŒν•˜λ©° κ° νŽ˜μ΄μ§€ λ²ˆν˜Έλ₯Ό μˆ¨κΉλ‹ˆλ‹€.

4. νŽ˜μ΄μ§€ λ²ˆν˜Έ ν΄λ¦­ μ΄λ²€νŠΈ:
   - `numbersBtn`의 κ° μš”μ†Œμ— ν΄λ¦­ μ΄λ²€νŠΈ λ¦¬μŠ€λ„ˆλ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€.
   - ν΄λ¦­ μ‹œ `displayRow` ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜μ—¬ ν•΄λ‹Ή νŽ˜μ΄μ§€μ˜ ν•­λͺ©μ„ ν‘œμ‹œν•©λ‹ˆλ‹€.

5. `displayRow` ν•¨μˆ˜:
   - νŽ˜μ΄μ§€ λ²ˆν˜Έμ— ν•΄λ‹Ήν•˜λŠ” ν•­λͺ©μ„ ν‘œμ‹œν•˜κ³  λ‚˜λ¨Έμ§€ ν•­λͺ©μ€ μˆ¨κΉλ‹ˆλ‹€.
   - `start`와 `end` λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ λ³΄μ—¬μ€„ ν•­λͺ©μ˜ λ²”μœ„λ₯Ό κ³„μ‚°ν•©λ‹ˆλ‹€.
   - `rowsArray` λ°°μ—΄μ„ μˆœνšŒν•˜λ©° κ° ν•­λͺ©μ˜ ν‘œμ‹œ μ—¬λΆ€λ₯Ό κ²°μ •ν•©λ‹ˆλ‹€.
   - μ„ νƒλœ νŽ˜μ΄μ§€ λ²ˆν˜Έμ˜ λ²„νŠΌμ— `active` ν΄λž˜μŠ€λ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€.

6. νŽ˜μ΄μ§€ κ·Έλ£Ή ν‘œμ‹œ ν•¨μˆ˜ (`displayPage`):
   - νŽ˜μ΄μ§€ λ²ˆν˜Έλ₯Ό ν•΄λ‹Ή νŽ˜μ΄μ§€ κ·Έλ£Ήμ— λ§žκ²Œ ν‘œμ‹œν•˜κ³  λ‚˜λ¨Έμ§€λŠ” μˆ¨κΉλ‹ˆλ‹€.
   - `totalPageCount` λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μ „체 νŽ˜μ΄μ§€ κ·Έλ£Ή μˆ˜λ₯Ό κ³„μ‚°ν•©λ‹ˆλ‹€.
   - `pageArr` λ°°μ—΄μ„ μˆœνšŒν•˜λ©° κ° νŽ˜μ΄μ§€ λ²ˆν˜Έμ˜ ν‘œμ‹œ μ—¬λΆ€λ₯Ό κ²°μ •ν•©λ‹ˆλ‹€.
   - ν˜„μž¬ νŽ˜μ΄μ§€ κ·Έλ£Ήμ˜ μΈλ±μŠ€μ— λ”°λΌ μ΄μ „ νŽ˜μ΄μ§€ λ° λ‹€μŒ νŽ˜μ΄μ§€ λ²„νŠΌμ˜ ν‘œμ‹œ μ—¬λΆ€λ₯Ό κ²°μ •ν•©λ‹ˆλ‹€.

7. λ‹€μŒ νŽ˜μ΄μ§€ λ° μ΄μ „ νŽ˜μ΄μ§€ λ²„νŠΌ ν΄λ¦­ μ΄λ²€νŠΈ:
   - `nextPageBtn` λ° `prevPageBtn`에 ν΄λ¦­ μ΄λ²€νŠΈ λ¦¬μŠ€λ„ˆλ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€.

$(document).ready(function() {
  setupPagination();
});

function setupPagination(){
const rowsPerPage = 12;
const rows = document.querySelectorAll('.product-list li');
const rowsCount = rows.length;
const pageCount = Math.ceil(rowsCount / rowsPerPage);
const numbers = document.querySelector('#numbers');
const prevPageBtn = document.querySelector('.pagination .fa-arrow-left');
const nextPageBtn = document.querySelector('.pagination .fa-arrow-right');
let pageActiveIdx =0; //ν˜„μž¬ νŽ˜μ΄μ§€ 그룹의 번호
let currentPage = 0;  //ν˜„μž¬ λ³΄κ³ μžˆλŠ” νŽ˜μ΄μ œλ„€μ΄μ…˜ 번호
let maxPageNum =3; //νŽ˜μ΄μ§€κ·Έλ£Ή μ΅œλŒ€ 개수

console.log("rowsCount",rowsCount);
console.log("rowsCount",pageCount);

for (let i = 1; i <= pageCount; i++) {

    numbers.innerHTML += `<li><a href="">${i}</a></li>`;
}

//νŽ˜μ΄μ§€λ„€μ΄μ…˜ 클릭
const numbersBtn = numbers.querySelectorAll('a');


//νŽ˜μ΄μ§€λ„€μ΄μ…˜ 번호 감좔기
for(nb of numbersBtn){
    nb.style.display = 'none';
}


numbersBtn.forEach((item, idx)=>{
    item.addEventListener('click',(e)=>{
        e.preventDefault() // κΈ°λ³ΈκΈ°λŠ₯ 막기

         displayRow(idx)
    })

})

function displayRow(idx) {

    let start = idx * rowsPerPage;
    let end = start + rowsPerPage;
    let rowsArray = [...rows];


    //let rowsArray = Array.from(rows);
    for(ra of rowsArray) {
        //μ•ˆλ³΄μ΄κ²Œ ν•˜κΈ°
        ra.style.display = 'none';
    }

    let newRows =rowsArray.slice(start, end);
    for(nr of newRows) {
        nr.style.display = '';
    }

    //css μ‘°μ •
    for(nb of numbersBtn){
        nb.classList.remove('active');
    }
    numbersBtn[idx].classList.add('active');

    //console.log("idx::",idx);

}//displayRow

//νŽ˜μ΄μ§€ λžœλ”λ§μ‹œ νŽ˜μ΄μ§€λ„€μ΄μ…˜ λ°”λ‘œ 적용
displayRow(0);

//νŽ˜μ΄μ§€λ„€μ΄μ…˜ κ·Έλ£Ή ν‘œμ‹œ ν•¨μˆ˜
function displayPage(num) {
    //νŽ˜μ΄μ§€λ„€μ΄μ…˜ 번호 감좔기
    for(nb of numbersBtn){
        nb.style.display = 'none';
    }

    let totalPageCount = Math.ceil(pageCount / maxPageNum);
    let pageArr = [...numbersBtn];
    let start =num*maxPageNum;
    let end = start + maxPageNum;
    let pageListArr = pageArr.slice(start, end);

    for(pa of pageListArr) {
        pa.style.display = 'block';
    }

    //μ²«νŽ˜μ΄μ§€μ— ν™”μ‚΄ν‘œ μ•ˆλ³΄μ΄κ²Œν•˜κΈ°
    if(pageActiveIdx == 0){
        prevPageBtn.style.display = 'none';
    }else{
        prevPageBtn.style.display = 'block';
    }

    if(pageActiveIdx == totalPageCount-1){
        nextPageBtn.style.display = 'none';
    }else{
        nextPageBtn.style.display = 'block';
    }

}

displayPage(0);

nextPageBtn.addEventListener('click', ()=>{ 
    let nextPageNum = pageActiveIdx*maxPageNum+maxPageNum;
    displayRow(nextPageNum);
    ++pageActiveIdx;
    displayPage(pageActiveIdx);

});

prevPageBtn.addEventListener('click', ()=>{

    let prevPageNum = pageActiveIdx*maxPageNum-maxPageNum;
    displayRow(prevPageNum);
    --pageActiveIdx;
    displayPage(pageActiveIdx);
});

}
//-----------pagination End----------------------------------------

 

 

 

2. μ‹€μ œ κ΅¬ν˜„λœ λͺ¨μŠ΅

λ°˜μ‘ν˜•
Comments