【问题标题】:jQuery $(window).scrollTop(value) not working with a Jinja2 rendered Bootstrap 4 grid filled with imagesjQuery $(window).scrollTop(value) 不适用于 Jinja2 渲染的 Bootstrap 4 网格,其中填充了图像
【发布时间】:2026-01-11 14:15:01
【问题描述】:

我无法让 jQuery $(window).scrollTop(value) 代码与 Boostrapped Python-Flask-Jinja Web 应用程序中的特定页面一起使用。 jQuery 代码在 Web 应用程序的另外两个页面上运行良好。 我认为这与使用 Jinja 渲染此页面有关,但它也可能是 Bootstrap 的事情,我不确定。

如前所述,jQuery $(window).scrollTop(value) 正在同一个 Web 应用程序中的其他页面上工作。 此外,当我在故障页面的 Bootstrap 网格上方的段落 <p></p> 中添加几个中断 <br> 时,scrollTop 函数也开始在这里工作。至少到 Bootstrap 研究开始的地方。 似乎引导网格没有增加窗口高度。
删除 load_hide 类没有帮助。
删除用于在单击事件上设置窗口滚动位置的代码以及对 scrollTop 值进行硬编码无济于事。
删除 main 标签上的 container-fluid 没有帮助。

页面无效

{% extends "layout.html" %}

{% block title %}
    Sculptures
{% endblock %}

{% block main %}

<div class="load_hide">
    <div class="row no-gutters scroll_fix ">
        {% for row in entries %}

        <div class="col-sm-4 px-1 scroll_fix ">
            <a href="/carousel?Id_prod={{ row["Path"] }}">
                <div class="img_container scroll_fix ">
                    <img src="static/images/{{ row["Path"] }}/01.jpg" class="img-fluid" alt="{{ row["Name"] }}" id="{{ row["Id_prod"] }}">
                </div>
            </a>

            <div class="d-flex flex-column mb-2">
                <div class="p-0 flex_child">{{ row["Name"] }}</div>
                <div class="p-0 flex_child">{{ row["Material"] }}</div>
                <div class="p-0 flex_child">{{ row["Dimensions"] }}</div>
                <div class="p-0 flex_child">&euro;{{ row["Price"] }}</div>
            </div>
        </div>



        {% endfor %}
    </div>
    <p>...</p>
</div>

<script>
    $(document).ready(function () {
        // Prevent page shaking during page load caused by the scrollTop function
        $('.load_hide').show();
        $(window).scrollTop(localStorage.getItem('scrollPos_scu'));

        // Set window scroll position
        $(document).on('click', 'img', function () {
            var scrollPos = $(window).scrollTop();
            localStorage.setItem("scrollPos_scu", scrollPos);
        });
    });

</script>

{% endblock %}

工作页面

{% extends "layout.html" %}

{% block title %}
    Inventory
{% endblock %}

{% block main %}

<h5 class="p-3">Inventory</h5>
<div class="row no-gutters load_hide">
    <div class="table-responsive-sm p-2">

        <table class="table">
            <thead>
                <tr>
                    <th class="w-2 td_pad"></th>
                    <th class="w-2 td_pad"></th>
                    <th class="w-5">No</th>
                    <th class="w-5">Show</th>
                    <th class="w-10">Photo</th>
                    <th class="w-15">Name</th>
                    <th class="w-25">Material</th>
                    <th class="w-10">Dimensions</th>
                    <th class="w-10">Price [&#8364;]</th>
                    <th class="w-5">Year</th>
                    <th class="w-5 p-1" colspan="2"><span class="float-left"><a href="/add_item" class="btn btn-primary btn_create">Create new</a></span></th>
                </tr>
            </thead>

            <tbody>

                {% for row in entries %}
                <tr>
                    <td class="td_pad">
                        <a href="/move_up?Id_prod={{ row["Id_prod"] }}" class="btn btn-primary btn-sm btn_priority">&#8593;</a>
                        <a href="/move_down?Id_prod={{ row["Id_prod"] }}" class="btn btn-primary btn-sm btn_priority">&#8595;</a>
                    </td>
                    <td class="td_pad">
                        <a href="/move_top?Id_prod={{ row["Id_prod"] }}" class="btn btn-primary btn-sm btn_priority">&#8648;</a>
                        <a href="/move_bot?Id_prod={{ row["Id_prod"] }}" class="btn btn-primary btn-sm btn_priority">&#8650;</a>
                    </td>

                    <td style="word-break: break-all">{{ row["Priority"] }}</td>

                    {% if row["Show"] == 1 %}
                    <td class="td_checkbox_pad">
                        <div class="custom-control custom-checkbox">
                            <input type="checkbox" class="custom-control-input " id="{{ row["Id_prod"] }}" checked>
                            <label class="custom-control-label" for="{{ row["Id_prod"] }}"></label> <!--A label is required with for="" referencing to the id="" value-->
                        </div>
                    </td>
                    {% else %}
                    <td class="td_checkbox_pad">
                        <div class="custom-control custom-checkbox">
                            <input type="checkbox" class="custom-control-input" id="{{ row["Id_prod"] }}">
                            <label class="custom-control-label" for="{{ row["Id_prod"] }}"></label> <!--A label is required with for="" referencing to the id="" value-->
                        </div>
                    </td>
                    {% endif %}

                    <td><img src="static/images/{{ row["Path"] }}/00.jpg" class="img-fluid"></td>
                    <td style="word-break: break-all">{{ row["Name"] }}</td>
                    <td style="word-break: break-all">{{ row["Material"] }}</td>
                    <td style="word-break: break-all">{{ row["Dimensions"] }}</td>
                    <td style="word-break: break-all">{{ row["Price"] }}</td>
                    <td style="word-break: break-all">{{ row["Year"] }}</td>

                    <td class="td_pad"> <a href="/edit_item?Id_prod={{ row["Id_prod"] }}" class="btn btn-primary btn-sm btn_edit_delete ">Edit</a></td>
                    <td class="td_pad"> <a href="/delete?Id_prod={{ row["Id_prod"] }}" class="btn btn-danger btn-sm btn_edit_delete confirm">Detele</a></td>
                </tr>

                {% endfor %}
            </tbody>
        </table>

    </div>

</div>

<script>
    $(document).ready(function () {
        // Prevent page shaking during page load caused by the scrollTop function
        $('.load_hide').show();
        $(window).scrollTop(localStorage.getItem('scrollPos_inv'));

        // Set window scroll position
        $("a").click(function () {
            var scrollPos = $(window).scrollTop();
            localStorage.setItem("scrollPos_inv", scrollPos);
        });
    });
</script>

{% endblock %}


布局页面

<!DOCTYPE html>

<html lang="en">

<head>

    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1"> <!--MOD-->
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" rel="stylesheet">

    <link href="/static/favicon.ico" rel="icon">

    <link href="/static/styles.css" rel="stylesheet">

    <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script>

    <title><!-- ..... -->: {% block title %}{% endblock %}</title>

</head>

<body>
    <nav>
       <!-- ............ -->
    </nav>


    {% if get_flashed_messages() %}
    <header>
        <div class="alert alert-primary border text-center" role="alert">
            {{ get_flashed_messages() | join(" ") }}
        </div>
    </header>
    {% endif %}


    <main class="container-fluid py-1 px-0">
        <!--MOD  container-fluid -->
        {% block main %}{% endblock %}
    </main>


    <footer class="page_footer ">
        <!-- ........ -->
    </footer>

</body>

</html>

我不明白是什么导致了两个页面之间的行为差​​异。
谁能告诉我是什么问题?

编辑:
我从不工作的页面中删除了完全不必要的 Jinja 代码,该代码每 3 个图像创建一个新的网格行(行的溢出由 Bootstrap 自动处理)。但这并没有解决问题。

        <!-- if last column in row -->
        {% if loop.index is divisibleby 3 %}
    </div><div class="row no-gutters scroll_fix ">
        {% endif %}</strong>

编辑:
Stack 上的这个线程似乎接近我的问题。根据这个线程,问题与引导网格的 浮动 行为有关。不幸的是,我无法解决我的特定问题。
scrollTop not working with Bootstrap grid

【问题讨论】:

    标签: jquery python-3.x flask bootstrap-4 jinja2


    【解决方案1】:

    经过一天的搜索,我设法解决了问题。

    $(window).scrollTop(value) 函数在一个页面上工作而不在另一个页面上工作的原因是页面内容的差异(表格与填充图像的引导网格)以及触发$(window).scrollTop(value) 的时刻。

    对于两个页面,$(window).scrollTop(value)$(document).ready(function (){}); 之后触发。不幸的是,$(document).ready(function (){}); 只能确保所有 HTML 内容都已加载,而不是图像。不工作的页面几乎完全由图像和一点点 HTML 代码组成。因此,在文档就绪事件中,所有 HTML 代码都适合屏幕,并且没有可滚动的窗口高度。

    不工作页面的解决方案是,在所有图像加载后触发$(window).scrollTop(value) 函数。为确保加载所有图像,$(document).ready(function (){}); 必须替换为$(window).on('load', function () {});,请参见以下解决方案:

    <script>
    
    $(window).on('load', function () {
        // Prevent page shaking during page load caused by the scrollTop function
        $('.load_hide').show();
        $(window).scrollTop(localStorage.getItem('scrollPos_scu'));
    
        // Set window scroll position
        $(document).on('click', 'img', function () {
            var scrollPos = $(window).scrollTop();
            localStorage.setItem("scrollPos_scu", scrollPos);
        });
    });
    </script>
    

    请注意,此解决方案仅适用于 jQuery 1.8 及更高版本,根据以下线程: why $(window).load() is not working in jQuery?

    我正在使用 jQuery 3.3.1,我浪费了很多时间试图解决 $(window).load(function () {}); 的问题,它只对 jQuery 1.8 之前的 jQuery 版本有效。

    虽然我很高兴找到了解决方案,但我仍然担心加载屏幕出现空白,以防要渲染的图像数量增加。

    【讨论】: