1

我最近的任务是弄清楚如何为我公司的内部 SharePoint 2010 网站维护滚动条定位。不幸的是,开箱即用的“MaintainScrollPositionOnPostBack”并没有得到我们想要的结合文本框聚焦要求的结果(包括隐藏字段中持久值的问题)。

在我最有希望的解决方案中,我在 javascript 中为滚动的 SharePoint div ('#s4-workspace') 设置滚动值,以便在按下浏览器后退/前进按钮时运行它。(在这种情况下,我将滚动值存储在 sessionStorage 中,但我仍在尝试使用其他持久媒体)。

我使用以下代码重新加载滚动位置,为共享点站点中的主可滚动 div 传入“s4-workspace”。

function RestoreScrollState(workspaceID) {
    var itemScrollDataIdentifier = pageScrollDataIdentifier + '-' + workspaceID;
    var coordStr = sessionStorage[itemScrollDataIdentifier];
    if (coordStr) {
        var scrollable = $('#' + workspaceID);
        var coords = $.parseJSON(coordStr);
        scrollable.scrollLeft(coords.x);
        scrollable.scrollTop(coords.y);
        return coords;
    }
    return null;
}

这在 IE8、IE9 和 Chrome 中效果很好,但我在 Firefox (17.0.1) 中遇到了问题。当我调用这个函数时,滚动条被设置到正确的位置,但是's4-workspace' div 中的内容仍然滚动到顶部(换句话说,内容没有随着滚动条滚动)。有趣的是,如果我在 setTimeout 中调用此函数并等待两秒钟,它会滚动正常(但是,较短的值不会)。

setTimeout(function () { RestoreScrollState('s4-workspace'); }, 2000);

我已经尝试搜索了一段时间,但没有发现任何有用的东西。有没有人遇到过这样的问题,除了长时间的超时之外,还有另一种解决方法吗?

4

1 回答 1

0

在将我的头撞到墙上几个小时后终于找到了解决方案:似乎问题是由于 SharePoint 仍在加载其内容的过程中(来自“sp.js”),并且因为时髦的东西它与设置滚动条有关,我的脚本驱动更改必须在 SP 滚动条完全初始化之前应用。所以这里是必须做的:

$(document).ready(function(){
    ExecuteOrDelayUntilScriptLoaded(runAfterSharePointIsDoneBeingStupid, 'sp.js');
});

function runAfterSharePointIsDoneBeingStupid(){
    //code to persist scrollbar position here
}

请原谅我在命名中表达的任何粗鲁情绪...SharePoint 和我的关系非常复杂... ;)

于 2012-12-08T17:08:17.300 回答