滚动时获取IE8中的当前页面位置

时间:2011-11-01 19:45:17

标签: javascript jquery internet-explorer scroll scrollbar

参考是这个页面: http://demo.mypreviewbetasite.com/laverona/menu.html

有问题的文件:http://demo.mypreviewbetasite.com/laverona/scripts/menu.js

该页面在Firefox和Chrome中按预期工作,当用户滚动时,窗口的位置将根据我的子菜单的位置进行检查,以便在滚动到视图之外时,其位置设置为固定的。

但是,在IE8中,窗口位置永远不会随着用户滚动而更新。我的测试表明IE浏览了所有函数,但只在页面加载时更新了windowPos变量。

可以做些什么,以便此页面在IE中的行为与在FF和Chrome中的行为相同?

2 个答案:

答案 0 :(得分:0)

这是来自jquery文档:   “.offset()方法允许我们检索元素相对于文档的当前位置。” 我无法理解为什么FF或Chrome返回$('html')。offset()。相对于客户端屏幕的顶部/似乎IE的方法更具可预测性。

尝试(使用DOM元素的.scrollTop属性而不是.offset()。top):

$(document).ready(function(e){
    //alert("subPos: " + subPos);

    //first find the position of the things to sticky
    submenu = $("#sub");
    //submenu.removeClass("no-js");
    subPos = $("#sub").position();
    subPos = subPos.top;

    var preScrollHtml = document.getElementsByTagName('html').item(0).scrollTop;
    var preScrollBody = document.getElementsByTagName('body').item(0).scrollTop;

    var checkPos = function(){
    var scrolledHtml = document.getElementsByTagName('html').item(0).scrollTop;
    var scrolledBody = document.getElementsByTagName('body').item(0).scrollTop;
    if (preScrollHtml !== scrolledHtml) {
    windowPos = scrolledHtml;
    }
    else {
    windowPos = scrolledBody;
        }
    preScrollHtml = scrolledHtml;
        preScrollBody = scrolledBody;
    calculate();
    }

    var calculate = function() {
    subPos = 64;
    if (windowPos >= subPos){
    $("#sub").addClass("fixed");
    $("#minestre").css("marginTop", "50px");
    }
    else if (windowPos < subPos){
    $("#sub").removeClass("fixed");
    $("#minestre").css("marginTop", "0px");
    }
    //Setting text fields to show the values of everything can help in debugging
    $("#windowpos").val(windowPos);
    $("#subp").val(subPos);
    }




//every time the window scrolls, this function is run
    if ($(window).scroll){
        $(window).scroll(checkPos);
    }
    else if(window.onscroll){
        window.onscroll = checkPos;
    }

});

答案 1 :(得分:0)

我知道这已经过时了,但是对于那些提出这个问题的新人来说,你可能想看看Andy对类似问题的答案(这似乎也解决了这个问题):https://stackoverflow.com/a/11396681/1793128