【问题标题】:jQuery Pagination shows two page buttons for one page of contentjQuery Pagination 为一页内容显示两个页面按钮
【发布时间】:2021-09-26 09:25:25
【问题描述】:

我正在使用表格来显示数据库中的值,并使用 JQuery 进行分页。这总体上是有效的。但是,当结果只有一页时,分页显示:

这不是我想要的;第 1 页的链接只能显示一次。

当它显示更多页面的数据时,它工作正常:

这是表格和按钮的代码

function getProducts() {
    $.get('/get-products', parameters).then(res => {
        console.log(res);
        let products = res.data;
        preview = res.current_page > 1 ? true : false;
        next = res.current_page < res.last_page ? true : false;
        preview ? $('#previous').removeAttr("disabled") : $('#previous').attr('disabled', 'disabled');
        next ? $('#next').removeAttr("disabled") : $('#next').attr('disabled', 'disabled');
        let table_body = $('#tbody');
        table_body.empty();
        var html = '';
        $.each(products, function(index, val) {
            html += "<tr> " +
                "<td>" + val.name + "</td>" +
                "<td>" + val.quantity + "</td>" +
                "<td>" + val.price +"<p> Lei </p>"+"</td>" +
                "<td>" + val.status.name + "</td>" +
                "<td>" + val.description + "</td>" +
                "<td>" + val.technics + "</td>" +
                "<td>" + "<a class='btn btn-warning' href='/editareprodus/"+ val.id +"'>Edit</a>" + "</td>" +
                "<td>" + "<a class='btn btn-danger' onclick=deleteItem("+ val.id +")>Delete</a>" + "</td>" +
            "</tr>";
        });
        table_body.append(html);
        $('.page_button').remove();
        var buttons = '';
        for(var i = 1; i < res.last_page+1; i++) {
            if(i == 1) {
                if(i == res.current_page) {
                    buttons += '<button type="button" class="btn btn-danger page_button" onclick="setPageParameter('+i+')">'+i+'</button>';
                } else{
                    buttons += '<button type="button" class="btn btn-primary page_button" onclick="setPageParameter('+i+')">'+i+'</button>';
                }
            }
            if(i == res.last_page) {
                if(i == res.current_page) {
                    buttons += '<button type="button" class="btn btn-danger page_button" onclick="setPageParameter('+i+')">'+i+'</button>';
                } else{
                    buttons += '<button type="button" class="btn btn-primary page_button" onclick="setPageParameter('+i+')">'+i+'</button>';
                }
            }
            if(i == res.current_page-2 && res.current_page-2 >= 2 ) {
                buttons += '<span class="page_button">...</span>';
            }
            if(i == res.current_page+2 && res.current_page+2 < res.last_page) {
                buttons += '<span class="page_button">...</span>';
            }
            if((i != 1 && i != res.last_page) && (i == res.current_page-1 || i == res.current_page || i == res.current_page+1)) {
                if(i == res.current_page) {
                    buttons += '<button type="button" class="btn btn-danger page_button" onclick="setPageParameter('+i+')">'+i+'</button>';
                } else {
                    buttons += '<button type="button" class="btn btn-primary page_button" onclick="setPageParameter('+i+')">'+i+'</button>';
                }
            }
        }
        $('#previous').after(buttons)
    });
}

我将添加上一页和下一页按钮的代码,以便您可以看到它们,但这些工作正常:

function previewPage() {
    if(preview) {
        parameters.page--;
        getProducts();
    }
}

function nextPage() {
    if(next) {
        parameters.page++;
        getProducts();
    }
}

function setPageParameter(page) {
    this.parameters.page = page;
    getProducts();
}

当我有一页而不是现在发生的两个按钮时,如何更改代码以显示一页按钮?

【问题讨论】:

  • 仅供参考:我已经编辑了您的问题,希望能让读者更容易理解。值得注意的是,我重写了标题,修复了一些小标点问题,删除了不必要的标签(例如html),并将图片移动到内联。这可能有助于您的问题获得更多关注。

标签: javascript jquery pagination jquery-pagination


【解决方案1】:

问题是由于您的 for 循环中的逻辑问题。您有几个条件可以编写按钮:

  • 如果按钮是首页页面;即,

    i == 1
    
  • 如果按钮是最后页;即,

    i == res.last_page
    
  • 如果按钮在当前页面之前或之后,但不是第一页或最后一页;即,

    (i != 1 && i != res.last_page) && (i == res.current_page-1 || i == res.current_page || i == res.current_page+1)
    

关键问题是前两个是非排他性的;即,当您只有一个页面时,您的按钮可以同时代表 both 第一页 以及 最后 页。因此,您完全可以在该场景中看到两个按钮。

解决排他性

只需将第二个条件的逻辑从if 更改为else if,即可轻松解决此问题;例如,

if (i == 1) 
{
    if (i == res.current_page) {
      buttons += '<button type="button" class="btn btn-danger page_button" onclick="setPageParameter(' + i + ')">' + i + '</button>';
    } 
    else
    {
        buttons += '<button type="button" class="btn btn-primary page_button" onclick="setPageParameter(' + i + ')">' + i + '</button>';
    }
}
else if (i == res.last_page) // Only show if not also the first button
{
    if (i == res.current_page)
    {
        buttons += '<button type="button" class="btn btn-danger page_button" onclick="setPageParameter(' + i + ')">' + i + '</button>';
    } 
    else
    {
        buttons += '<button type="button" class="btn btn-primary page_button" onclick="setPageParameter(' + i + ')">' + i + '</button>';
    }
}       

整合逻辑

以上解决了您的核心问题,但是由于它们生成了 exact 相同的标记,您不妨使用|| 运算符将它们折叠成一个条件,从而在合并的同时保持相同的结果代码:

if (i == 1 || i == res.last_page) 
{
    if (i == res.current_page)
    {
        buttons += '<button type="button" class="btn btn-danger page_button" onclick="setPageParameter(' + i + ')">' + i + '</button>';
    } 
    else
    {
        buttons += '<button type="button" class="btn btn-primary page_button" onclick="setPageParameter(' + i + ')">' + i + '</button>';
    }
}

重构for循环

这远远超出了您最初问题的范围,但即使在巩固了之前的条件之后,仍有清理的余地。这是因为,目前,您在函数中重复了大量标记。

作为开发人员,您应该努力不重复代码。为什么?因为除了让代码变长之外,还可以更容易引入bug。例如,如果您决定更改按钮的样式,则需要在四个地方更改它们。在这种情况下,很容易无意中忽略了一个,从而引入了不一致。

鉴于此,您应该能够进一步巩固您的逻辑,如下所示:

for (var i = 1; i < res.last_page + 1; i++) {
    if (i == 1 || i == res.last_page || i == res.current_page - 1 || i == res.current_page || i == res.current_page + 1) {
        buttons += '<span class="page_button">...</span>';
    }
    else if (
        (i == res.current_page - 2 && res.current_page - 2 >= 2) ||
        (i == res.current_page + 2 && res.current_page + 2 < res.last_page)
    ) {
        buttons += '<button type="button" class="btn btn-"' + (i == res.current_page? "danger" : "primary") + '" page_button" onclick="setPageParameter(' + i + ')">' + i + '</button>';
    }
}

这个逻辑可以再简化一点,但为了一致性和可读性,我保留了您的原始表达式,同时重构它们以避免重复标记。这不仅解决了最初的问题,而且导致代码块更短。

【讨论】:

  • 非常感谢您的时间和经验!我现在明白问题出在哪里以及如何简化工作。再次感谢您!
  • @PaulCatalin:没问题!我很高兴能帮上忙。另外,我确定您已经注意到了这一点,但我不小心在重构的代码中包含了两次 for 循环。这显然是不需要或不希望的。我已更新帖子以包含该修复程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-06
  • 1970-01-01
  • 1970-01-01
  • 2014-05-03
  • 1970-01-01
  • 2020-05-17
相关资源
最近更新 更多