当前位置: 首页 > 知识库问答 >
问题:

Next和prev按钮功能与分页

鲁博赡
2023-03-14

我想在分页中添加“下一页”和“上一页”按钮功能,这样我也可以在其中移动页面。在我的代码中,我只显示下一页或上一页,并在单击时查看第二页的内容,但不将所选按钮数从1移动到2,或者如果有更多,则移动到下一页,以此类推。上一次也一样。此外,如果我不能进入下一步/上一步,我希望禁用下一步/上一步按钮。

有人帮帮忙吗?

以下是我到目前为止所拥有的:

window.onload = function(){

var data = {
  "headings": {
    "propBook": "Book",
    "propAuthor": "Author",
    "propYear": "Year",
  },
  "items": [{
      "fields": {
        "propBook": "The Great Gatsby",
        "propAuthor": "F Scott Fitzgerald",
        "propYear": "1925",
      },
      "button": {
        "name": "View book",
        "propURL": "https://google.com"
      }
    },
    {
      "fields": {
        "propBook": "The Grapes of Wrath",
        "propAuthor": "John Steinbeck",
        "propYear": "1939",
      },
      "button": {
        "name": "View book",
        "propURL": ""
      }
    },
    {
      "fields": {
        "propBook": "A Wild Sheep Chase",
        "propAuthor": "Haruki Murakami",
        "propYear": "1982",
      },
      "button": {
        "name": "View book",
        "propURL": "https://google.com"
      }
    }
  ]
}


const HEADINGS = data.headings;
const ITEMS = data.items;
const TABLE_WRAPPER = document.querySelector('.book-component .table-wrapper');
const TABLE = document.createElement('table');
TABLE.setAttribute('class', 'pagination');
  TABLE.setAttribute('data-pagecount', 2);
TABLE_WRAPPER.appendChild(TABLE);


for (const field in data) {
  const TABLE_ROW = document.createElement('tr');
  TABLE_ROW.setAttribute('id', 'myRow');

  if (field == 'headings') {
    for (const child in HEADINGS) {
      const HEADER_CELL = document.createElement('th');
      TABLE_ROW.appendChild(HEADER_CELL);
      HEADER_CELL.setAttribute('class', 'sort-cta');
      HEADER_CELL.innerText = HEADINGS[child];
      TABLE.appendChild(TABLE_ROW);
    }
  } else if (field == 'items') {
    for (const child in ITEMS) {
      const TABLE_ROW = document.createElement('tr');
      let item = ITEMS[child].fields;
      let btn = ITEMS[child].button;      

      for (const row in item) {
        const TABLE_DATA = document.createElement('td');
        TABLE_ROW.appendChild(TABLE_DATA);
        TABLE_DATA.innerText = item[row];
        TABLE.appendChild(TABLE_ROW);       
      }
      
      
      if (btn.propURL !== '') {
        let link = document.createElement('a');
        link.setAttribute('href', btn.propURL);
        link.innerHTML = btn.name;
        x = TABLE_ROW.insertCell(-1);
        x.appendChild(link);
      } else {
        let link = document.createElement('span');
        link.innerHTML = 'Reserved';
        x = TABLE_ROW.insertCell(-1);
        x.appendChild(link);
      }
    }
  }
}

  let perPage = 10;
  function genTables() {
    let tables = document.querySelectorAll('.pagination');
    tables.forEach((table) => {
      perPage = parseInt(table.dataset.pagecount);
      createFooters(table);
      createTableMeta(table);
      loadTable(table);
    });
  }
  // based on current page, only show the elements in that range
  function loadTable(table) {
    let startIndex = 0;
    if (table.querySelector('th')) startIndex = 1;
    const START = parseInt(table.dataset.currentpage) * table.dataset.pagecount + startIndex;
    const END = START + parseInt(table.dataset.pagecount);
    const TABLE_ROWS = table.rows;
    for (var x = startIndex; x < TABLE_ROWS.length; x++) {
      if (x < START || x >= END) TABLE_ROWS[x].classList.add('inactive');
      else TABLE_ROWS[x].classList.remove('inactive');
    }
  }

  function createTableMeta(table) {
    table.dataset.currentpage = '0';
  }

  function createFooters(table) {
    const COUTING_WRAPPER = document.createElement('div');
    COUTING_WRAPPER.setAttribute('class', 'counting-wrapper');
    const COUNTING_MSG = document.createElement('p');
    COUTING_WRAPPER.appendChild(COUNTING_MSG);
    let TABLE_WRAP = document.querySelector('.table-wrapper');
    TABLE_WRAP.appendChild(COUTING_WRAPPER);

    let hasHeader = false;
    if (table.querySelector('th')) hasHeader = true;
    let ROWS = table.rows.length;
    if (hasHeader) ROWS = ROWS - 1;
    let NUM_PAGES = ROWS / perPage;
    let pager = document.createElement('div');
    // add an extra page
    if (NUM_PAGES % 1 > 0) NUM_PAGES = Math.floor(NUM_PAGES) + 1;
    pager.className = 'pager';
    let nextPage = document.createElement('button');
    nextPage.innerHTML = 'next';
    nextPage.className = 'item';
    let prevPage = document.createElement('button');
    prevPage.innerHTML = 'prev';
    prevPage.className = 'item';
    pager.appendChild(prevPage);
    pager.appendChild(nextPage);


    nextPage.addEventListener('click', () => {
      table.dataset.currentpage = parseInt(table.dataset.currentpage) + 1;
      loadTable(table);
    });

    prevPage.addEventListener('click', () => {
      table.dataset.currentpage = parseInt(table.dataset.currentpage) - 1;
      loadTable(table);
    })

    for (var i = 0; i < NUM_PAGES; i++) {
      var page = document.createElement('button');
      page.innerHTML = i + 1;
      page.className = 'pager-item';
      page.dataset.index = i;
      if (i == 0) page.classList.add('selected');
      

      page.addEventListener('click', function () {
        var items = pager.querySelectorAll('.pager-item');
        for (var x = 0; x < items.length; x++) {
          items[x].classList.remove('selected');
        }
        this.classList.add('selected');
        table.dataset.currentpage = this.dataset.index;
        loadTable(table);

       
      });
      pager.appendChild(page);
    }

    // insert page at the top of the table
    table.parentNode.insertBefore(pager, table);
  }
  genTables();


};
tr.inactive {
  display: none;
}

.table-wrapper {
  display: flex;
  flex-direction: column-reverse;
}

.pager {
  display: flex;
  justify-content: center;
  padding: 0;
  margin-top: 10px;
  font-weight: 800;
}

.pager-item.selected {
  outline: none;
  border-color: #0077cc;
  background: #0077cc;
  color: #fff;
  cursor: default;
}
<div class="book-component">
  <div class="table-wrapper">
  </div>
</div>

共有1个答案

和谦
2023-03-14

您的loadTable函数正在根据应用程序的当前状态更新DOM。您可以扩展它以设置prev/Next按钮的禁用状态,并设置页码按钮的选定类。

下面是一个由loadTable函数设置按钮状态的示例。点击事件处理程序只应更新当前页面(即设置应用程序的状态)。然后可以在loadTable函数中呈现状态。

// based on current page, only show the elements in that range
function loadTable(table) {
  let startIndex = 0;
  if (table.querySelector('th')) startIndex = 1;
  const START = parseInt(table.dataset.currentpage) * table.dataset.pagecount + startIndex;
  const END = START + parseInt(table.dataset.pagecount);
  const TABLE_ROWS = table.rows;
  for (var x = startIndex; x < TABLE_ROWS.length; x++) {
    if (x < START || x >= END) TABLE_ROWS[x].classList.add('inactive');
    else TABLE_ROWS[x].classList.remove('inactive');
  }
  
// You should move this calculation outside of the function
  const ROWS = table.rows.length - 1;
  const NUM_PAGES = Math.ceil(ROWS / perPage);
  
  const prevPage = document.getElementsByName('pagination-prev-button')[0];
  const nextPage = document.getElementsByName('pagination-next-button')[0];

  const isNextDisabled = +table.dataset.currentpage >= NUM_PAGES - 1;
  const isPrevDisabled = +table.dataset.currentpage === 0;

  if (isNextDisabled) {
    nextPage.setAttribute('disabled', true);
  } else {
    nextPage.removeAttribute('disabled');
  }

  if (isPrevDisabled) {
    prevPage.setAttribute('disabled', true);
  } else {
    prevPage.removeAttribute('disabled');
  }

  const items = document.querySelectorAll('.pager-item');
  for (var x = 0; x < items.length; x++) {
    if (x === +table.dataset.currentpage) {
      items[x].classList.add('selected');
    } else {
      items[x].classList.remove('selected');
    }
  }
}

下面是完整的工作示例。https://jsfiddle.net/aloshea/r68gtvmc/

 类似资料:
  • Verity Sense 配有一个按钮,根据使用情况和按下时长具有不同功能。参见下文,了解按钮在不同模式下的功能以及不同颜色 LED 的含义。 按钮功能 打开/关闭传感器 短按按钮可打开传感器。 按住按钮可关闭传感器。 选择训练模式 要选择训练模式,请短按按钮进行切换,直至所需模式旁的 LED 灯亮起。 您可通过短按按钮来查看已锁定的训练模式。侧边的状态 LED 灯在心率模式下亮蓝色,在记录模式下

  • 手表有五个按钮,根据使用情况有不同功能。请查看下表了解各个按钮在不同模式中具有的功能。 时间视图和菜单 背光灯 返回 OK 向上/向下 启动背光 在时间视图中,按下查看电池状态符号 长按可锁定按钮和触控显示屏 进入菜单 返回至上一个水平 保留设置不变 取消选择 长按可从菜单返回至时间视图 在时间视图中,长按以开始配对和同步 确认显示屏上所示的选择 长按进入训练准备模式 按下查看有关手表面显示信息的

  • 手表有五个按钮,根据使用情况有不同功能。请查看下表了解各个按钮在不同模式中具有的功能。 时间视图和菜单 背光灯 返回 OK 向上/向下 启动背光 在时间视图中,按下可查看电池状态符号 长按可锁定按钮和触控显示屏 进入菜单 返回至上一个水平 不更改设置 取消选择 长按可从菜单返回至时间视图 在时间视图中,长按以开始配对和同步 确认显示屏上所示的选择 长按进入训练准备模式 按下查看有关手表面显示信息的

  • 经过长时间的研究,我找到了一个向DIV元素添加自定义滚动条的解决方案。它叫SimpleBar。文件可以在这里找到。 HTML结构和JS代码非常简单: 工作演示 通过,我可以向任何div添加自定义滚动条。 只有一件事我解决不了。我想在scroll元素中添加prev/next箭头。按钮应该跳转到DIV中的prev/next元素,该元素紧挨着DIV的左侧/右侧,并且还没有滚动(部分)。 并且JS应该适用

  • 这个版本新增 next(),prev(),parent(),parents() 这4个选择元素的方法还是比较常用的 首先我们需要一个func来过滤我们需要的dom function sibling(cur, dir) { while ((cur = cur[dir]) && cur.nodeType !== 1) {} return cur; } 上面那段比较简单,就是普通的过滤

  • 按钮功能 A300 有五个按钮,根据使用情况有不同功能。请查看以下图表了解各个按钮在不同模式中具有的功能。 实用建议 在任何视图中(除训练期间外),按 上、下开始或 返回打开以调暗背光。如果要开启明亮背光,请按 灯光按钮。 要将按钮锁定或解锁,请在时间视图中或训练时长按“灯光”。 长按时间视图中的“向上”可更改时钟画面。 长按时间视图中的“返回”可使 A300 与 Flow 应用程式同步。 长按“