【问题标题】:Keep scroll-position on ajax-request在ajax请求上保持滚动位置
【发布时间】:2014-10-31 15:36:44
【问题描述】:

我有一个单页网站,里面有很多容器。

每个容器的内容都是通过 ajax 加载的(异步,意味着不是每个容器都同时填充数据)。

容器有一个动态高度(高度:自动)。

网站由智能路由系统控制(如果您输入特定的网址,网站会在加载时滚动到给定的元素)。

如何滚动到一个容器(例如容器 5)并将此容器保持在相同的滚动位置(应该可以通过用户滚动更改)同时加载其他容器?如果容器具有固定的高度,则整个工作都不会出现任何问题,但此时,滚动位置会在每次装载或更改任何这些容器时发生变化。

你知道解决这个问题的插件或好方法吗?

问题示例:http://jsfiddle.net/b6sno9cv/

// Global variable to define start-container:
var initialWidgetIdx = 10;

预期结果:

滚动到容器 10 并停留在那里(滚动位置在这个容器上),即使其他容器没有完全加载。

(一旦每个容器都被加载(现在已经固定高度),滚动工作没有任何问题)

【问题讨论】:

  • 您能否限制容器的高度,然后用户overflow: scroll 以便用户可以在每个容器内滚动以查看所有内容?
  • 这是不可能的,容器必须具有动态高度。
  • 嗯,你有没有考虑像规范推荐的那样为容器 1-9 中的图像添加宽度和高度属性?
  • 那么我认为您只需要等到所有内容都呈现后才能滚动。无法提前知道高度是多少,尤其是因为它可能会因浏览器、屏幕尺寸等而有很大差异。
  • @Brian 即使我这样做,内容也是通过 Ajax 加载的,并且大小并不总是相同...

标签: javascript jquery html css


【解决方案1】:

您可以使用offsetHeight 来获取元素的高度。在您的情况下,您可以在 ajax 请求中检查 div 的高度,然后使用 scrollBy,像这样

xmlhttp.onreadystatechange=function(){
    if (xmlhttp.readyState != 4) return
        if (xmlhttp.status == 200) {
            //do some stuff you need

            var scroll_value = document.getElementById('div_that_loaded').offsetHeight();
            window.scrollBy(0,scroll_value);
            }
        }

【讨论】:

  • 嗯,有趣的想法...是否可以在后台加载容器的全部内容(图像和其他元素)以及加载整个内容后显示固定高度和其他内容,显示它并重置滚动位置?如果是的话,我该怎么做(只是等待的东西,其他我可以自己做的事情)?
  • @JakeParis 是的,他的“解决方案”不起作用,但如果你反转 scroll_value 变量它可能会起作用,还是我错了?
  • 我相信你有一个做ajax的功能,所以每次加载div时都会滚动窗口?
  • 是的,我有一个执行 ajax-request 的函数(带有回调的事件),但窗口只被 JS 滚动一次,这是在页面加载...
  • 这个想法是在每个 div 完全加载后立即获取它的高度,这样我们就知道需要向下滚动多少。如果你的 div 有一些初始高度,你只需要改进 scroll_value
猜你喜欢
  • 1970-01-01
  • 2014-11-24
  • 1970-01-01
  • 1970-01-01
  • 2011-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多