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

Javascript 滚动时获取IE8中的当前页面位置,javascript,jquery,internet-explorer,scroll,scrollbar,Javascript,Jquery,Internet Explorer,Scroll,Scrollbar,参考资料如下: 有关文件: 该页面在Firefox和Chrome中的工作方式与预期相同,当用户滚动时,窗口的位置将根据我的子菜单的位置进行检查,因此在它被滚动出视图之前,其位置将设置为固定 然而,在IE8中,窗口位置永远不会随着用户滚动而更新。我的测试表明IE可以完成所有功能,但只在页面加载时更新windowPos变量 如何使该页面在IE中的行为与在FF和Chrome中的行为相同?这来自jquery文档: “.offset()方法允许我们检索元素相对于文档的当前位置。” 我不明白为什么FF或C

参考资料如下:

有关文件:

该页面在Firefox和Chrome中的工作方式与预期相同,当用户滚动时,窗口的位置将根据我的子菜单的位置进行检查,因此在它被滚动出视图之前,其位置将设置为固定

然而,在IE8中,窗口位置永远不会随着用户滚动而更新。我的测试表明IE可以完成所有功能,但只在页面加载时更新windowPos变量


如何使该页面在IE中的行为与在FF和Chrome中的行为相同?

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

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

$(文档).ready(函数(e){
//警报(“子命令:+子命令”);
//首先找到要粘东西的位置
子菜单=$(“#子”);
//子菜单removeClass(“无js”);
subPos=$(“#sub”).position();
subPos=subPos.top;
var preScrollHtml=document.getElementsByTagName('html')。项(0)。scrollTop;
var preScrollBody=document.getElementsByTagName('body')。项(0)。scrollTop;
var checkPos=函数(){
var scrolledHtml=document.getElementsByTagName('html')。项(0)。scrollTop;
var scrolledBody=document.getElementsByTagName('body')。项(0)。scrollTop;
如果(预滚动HTML!==滚动HTML){
windowPos=滚动HTML;
}
否则{
windowPos=滚动体;
}
preScrollHtml=滚动HTML;
预滚动体=滚动体;
计算();
}
var calculate=函数(){
次级方案=64;
如果(windowPos>=子系统){
$(“#子”).addClass(“固定”);
$(#minestre”).css(“marginTop”、“50px”);
}
else if(窗口位置<子项){
$(“#子”).removeClass(“固定”);
$(#minestre”).css(“marginTop”、“0px”);
}
//设置文本字段以显示所有内容的值有助于调试
$(#windowpos”).val(windowpos);
美元(“#子项”).val(子项);
}
//每次窗口滚动时,此功能都会运行
如果($(窗口)。滚动){
$(窗口)。滚动(checkPos);
}
else if(window.onscroll){
window.onscroll=checkPos;
}
});

我知道这是个老问题,但对于新来的人来说,你可能想看看安迪对一个类似问题的回答(这似乎也解决了这个问题):

所以这对IE和FF有效,但对chrome无效。我用if/else让chrome使用我以前做过的东西,但它计算窗口位置的方式不同,所以这是一个全新的蠕虫。不过,这很有帮助:)我现在看到的唯一解决方法是在scroll事件处理程序中检查“body”或“html”的.scrollTop属性是否已更改,并为windowPos分配相应的值。我将编辑我的答案以演示
$(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;
    }

});