【问题标题】:Paginations + Filter dropdown menus using JS使用 JS 的分页 + 过滤下拉菜单
【发布时间】:2022-01-14 19:10:46
【问题描述】:

我正在尝试使用 JS 添加过滤器下拉菜单和分页。过滤器下拉菜单工作正常。但是不知道怎么用JS添加分页功能。

我的问题是:

  1. 即使在用户单击过滤器菜单后,我是否可以在每页仅显示 8 个缩略图?
  2. 过滤结果小于8个时,是否可以隐藏分页?

这是图片和代码。任何建议将不胜感激。

<body>

<div class="container">
    <div class="row">
        <div class="select mb-3 mt-3">
            <select class="type mr-2">
                <option value="all">Type</option>
                <option value="one">one</option>
                <option value="two">two</option>
                <option value="three">three</option>
            </select>
            <select class="grade mr-2">
                <option value="all">Grade</option>
                <option value="one">one</option>
                <option value="two">two</option>
                <option value="three">three</option>
            </select>
            <select class="subject mr-2">
                <option value="all">Subject</option>
                <option value="one">one</option>
                <option value="two">two</option>
                <option value="three">three</option>
            </select>
        </div>
    </div>

    <div class="row">
        <div class="col-3 property-item" data-grade="one" data-type="two" data-subject="three"><img src="https://picsum.photos/200"><br />image one</div>
        <div class="col-3 property-item" data-grade="two" data-type="one" data-subject="one"><img src="https://picsum.photos/200"><br />image one</div>
        <div class="col-3 property-item" data-grade="four" data-type="one" data-subject="one"><img src="https://picsum.photos/200"><br />image one</div>
        <div class="col-3 property-item" data-grade="two" data-type="four" data-subject="two"><img src="https://picsum.photos/200"><br />image one</div>
        <div class="col-3 property-item" data-grade="one" data-type="two" data-subject="one"><img src="https://picsum.photos/200"><br />image one</div>
        <div class="col-3 property-item" data-grade="two" data-type="three" data-subject="one"><img src="https://picsum.photos/200"><br />image one</div>
        <div class="col-3 property-item" data-grade="three" data-type="one" data-subject="one"><img src="https://picsum.photos/200"><br />image one</div>
        <div class="col-3 property-item" data-grade="two" data-type="one" data-subject="one"><img src="https://picsum.photos/200"><br />image one</div>
        <div class="col-3 property-item" data-grade="one" data-type="three" data-subject="one"><img src="https://picsum.photos/200"><br />image one</div>

    <div class="mb-3 mt-3">
        <nav aria-label="...">
            <ul class="pagination">
                <li class="page-item disabled">
                    <a class="page-link" href="#" tabindex="-1">Previous</a>
                </li>
                <li class="page-item active"><a class="page-link" href="#">1</a></li>
                <li class="page-item">
                    <a class="page-link" href="#">2 <span class="sr-only">(current)</span></a>
                </li>
                <li class="page-item"><a class="page-link" href="#">3</a></li>
                <li class="page-item">
                    <a class="page-link" href="#">Next</a>
                </li>
            </ul>
        </nav>
    </div>
</div>
<script>
$("select.grade, select.type, select.subject").change(update);

function update() {
    var resourceGrade = $('select.grade').val();
    var resourceType = $('select.type').val();
    var resourceSubject = $('select.subject').val();

    $('.property-load-section')
        .find('.property-item')
        .hide()
        .filter(function () {
            var okResourceType = true;
            if (resourceType !== "all") {
                okResourceType = $(this).attr('data-type').split(',').includes(resourceType);
            }
            var okResourceGrade = true;
            if (resourceGrade !== "all") {
                okResourceGrade = $(this).attr('data-grade').split(',').includes(resourceGrade);
            }
            var okResourceSubject = true;
            if (resourceSubject !== "all") {
                var okResourceSubject = $(this).attr('data-subject').split(',').includes(resourceSubject);
            }
            return okResourceGrade && okResourceType && okResourceSubject;
        })
        .fadeIn('fast');
}</script>

【问题讨论】:

  • 您是否从后端服务器获取图像数据?
  • 没有。我没有使用数据。我将使用 html 代码来显示图像。

标签: javascript drop-down-menu pagination


【解决方案1】:

const itemPerPage = 2
$('select').change(function () {
    pagination(itemPerPage)
});

function filter() {
    const resourceGrade = $('select.grade').val();
    const resourceType = $('select.type').val();
    const resourceSubject = $('select.subject').val();
    return $('.property-load-section')
        .find('.property-item')
        .hide()
        .filter(function () {
            let okResourceGrade = resourceGrade === 'all' ? true : $(this).data('grade') === resourceGrade;
            let okResourceType = resourceType === 'all' ? true : $(this).data('type') === resourceType;
            let okResourceSubject = resourceSubject === 'all' ? true : $(this).data('subject') === resourceSubject;
            return okResourceGrade && okResourceType && okResourceSubject;
        })
}

function pagination(itemPerPage = 8) {
    $("#pagin").html('')
    //Pagination
    let pageSize = itemPerPage;
    let currentPage = 0;

    let pageCount = filter().show().length / pageSize;

    $("#pagin").append(prevButton())

    for (let i = 0; i < pageCount; i++) {
        $("#pagin").append('<li class="page-item"><a href="#" class="page-link">' + (i + 1) + '</a></li> ');
    }

    $("#pagin").append(nextButton())

    let showPage = function (page) {
        $("#pagin li").removeClass('active');
        $("#pagin li").eq(page).addClass("active");
        currentPage = page
        if (page === 1) {
            $("#pagin li.btn-prev").addClass('disabled')
        } else {
            $("#pagin li.btn-prev").removeClass('disabled')
        }

        filter().each(function (n) {
            if (n >= pageSize * (page - 1) && n < pageSize * page) {
                $(this).show();
            }
        });
    }

    function nextButton() {
        const next = $('<li class="page-item btn-next"><span class="page-link">Next</span></li>')
        $(next).click(function () {
            if (!$(this).is('.disabled')) {
                if (currentPage < Math.ceil(pageCount)) {
                    showPage(currentPage + 1)
                }
            }
            return false;
        })
        return next;
    }

    function prevButton() {
        const prev = $('<li class="page-item btn-prev"><span class="page-link">Prev</span></li>')
        $(prev).click(function () {
            if (!$(this).is('.disabled')) {
                showPage(currentPage - 1)
            }
        })
        return prev;
    }

    showPage(1);

    $("#pagin li a").click(function () {
        $("#pagin li").removeClass("active");
        $(this).addClass("active");
        showPage(parseInt($(this).text()));
    });
}

pagination(itemPerPage)
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
          integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<div class="container">
    <div class="row">
        <div class="select mb-3 mt-3">

            <select class="grade mr-2">
                <option value="all">Grade</option>
                <option value="one">one</option>
                <option value="two">two</option>
                <option value="three">three</option>
            </select>
            <select class="type mr-2">
                <option value="all">Type</option>
                <option value="one">one</option>
                <option value="two">two</option>
                <option value="three">three</option>
            </select>
            <select class="subject mr-2">
                <option value="all">Subject</option>
                <option value="one">one</option>
                <option value="two">two</option>
                <option value="three">three</option>
            </select>
        </div>
    </div>

    <div class="row main property-load-section">
        <div class="col-3 property-item" data-grade="one" data-type="two" data-subject="three"><img
                src="https://picsum.photos/200"><br/>Page 1 one two three
        </div>
        <div class="col-3 property-item" data-grade="two" data-type="one" data-subject="one"><img
                src="https://picsum.photos/200"><br/>Page 2 two one one
        </div>
        <div class="col-3 property-item" data-grade="four" data-type="one" data-subject="one"><img
                src="https://picsum.photos/200"><br/>Page 3 four one one
        </div>
        <div class="col-3 property-item" data-grade="two" data-type="four" data-subject="two"><img
                src="https://picsum.photos/200"><br/>Page 4 two four two
        </div>
        <div class="col-3 property-item" data-grade="one" data-type="two" data-subject="one"><img
                src="https://picsum.photos/200"><br/>Page 5 one two one
        </div>
        <div class="col-3 property-item" data-grade="two" data-type="three" data-subject="one"><img
                src="https://picsum.photos/200"><br/>Page 6 two three one
        </div>
        <div class="col-3 property-item" data-grade="three" data-type="one" data-subject="one"><img
                src="https://picsum.photos/200"><br/>Page 7 three one one
        </div>
        <div class="col-3 property-item" data-grade="two" data-type="one" data-subject="one"><img
                src="https://picsum.photos/200"><br/>Page 8 two one one
        </div>
        <div class="col-3 property-item" data-grade="one" data-type="three" data-subject="one"><img
                src="https://picsum.photos/200"><br/>Page 9 one three one
        </div>

    </div>
    <div class="mb-3 mt-3">
        <nav aria-label="...">
            <ul id="pagin" class="pagination">

            </ul>
        </nav>
    </div>
</div>


<!-- Optional JavaScript -->
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"
        integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"
        crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"
        integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1"
        crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"
        integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM"
        crossorigin="anonymous"></script>

【讨论】:

  • 完美运行。非常感谢!
  • 如果我的回答对你有帮助。请接受或投票。
  • 很遗憾,我现在只有 11 个声望,因为我是上周开户的。当我获得 15 个声望时,我一定会支持你的帖子。再次感谢您的帮助!
  • 您能帮忙添加“上一个”和“下一个”按钮吗?
  • 我更新了答案,prevnext 按钮可以用了,你可以试试。
猜你喜欢
  • 2018-09-06
  • 2015-04-02
  • 2012-02-22
  • 2023-03-11
  • 1970-01-01
  • 2012-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多