我想在分页中添加“下一页”和“上一页”按钮功能,这样我也可以在其中移动页面。在我的代码中,我只显示下一页或上一页,并在单击时查看第二页的内容,但不将所选按钮数从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>
您的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 应用程式同步。 长按“