参考是这个页面: http://demo.mypreviewbetasite.com/laverona/menu.html
有问题的文件:http://demo.mypreviewbetasite.com/laverona/scripts/menu.js
该页面在Firefox和Chrome中按预期工作,当用户滚动时,窗口的位置将根据我的子菜单的位置进行检查,以便在滚动到视图之外时,其位置设置为固定的。
但是,在IE8中,窗口位置永远不会随着用户滚动而更新。我的测试表明IE浏览了所有函数,但只在页面加载时更新了windowPos变量。
可以做些什么,以便此页面在IE中的行为与在FF和Chrome中的行为相同?
答案 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