TL;DR:如何强制 IE7 加载所有被可滚动 div 隐藏的元素?
我正在构建一个“可折叠”菜单来浏览一组页面。这个菜单有两种状态,内爆和爆炸。
菜单项就像一本书的章节,当用户浏览内容时,“事件”菜单项会向下移动。
页面加载后,我想要 <div>
元素所在的位置立即向下滚动(!)到事件菜单项,减去一些偏移量。
像往常一样,这在 chrome 和 ff 上完美运行,但在 ie7 上不行。
在分解状态下,当页面加载时不可见时,ie7 似乎不会费心“加载”元素。发生的事情是 ie7 在没有滚动条(或非常小的滚动条)的情况下启动菜单 div。当我将 scrollTop 设置为所需的数量时。 div 只是向下滚动,直到滚动条“撞到”“div 的底部”,然后 ie7 开始加载下一部分内容,我可以进一步滚动直到找到另一个“底部”,等等。
我设法通过使用长度为 1000 毫秒的动画(只是选择了一个数字)来解决这个问题。它不符合指定的要求(而且看起来很丑),我想知道如何在请求之前强制 ie7 加载此内容,因为它似乎没有加载它。
IE7 用户是我们最大的目标群体,所以没有跳过这一点。在没有 javascript 的情况下向用户提供内容是一个巨大的优势。
在内爆状态下没有问题,我尝试在爆炸状态下使用部分内爆状态 CSS,然后将它们设置为正确的值,但没有帮助。
这是一些代码:
scrollToCurrent = function(length){
var prev = $("div.scroller div.selected").prev();
// Check if previous exists
if($(prev).length > 0) {
// number of previous items * height of an item - half an items height
var scrollY = ($(prev).prevAll().length * $(prev).outerHeight()) - ($(prev).outerHeight() / 2);
if(length === 0) {
$("div.scroller").scrollTop(scrollY);
} else {
$(".scroller").animate({
scrollTop : scrollY
}, length);
}
}
};
如果您需要更多,请告诉我。
编辑: 基本的jsfiddle: http://jsfiddle.net/AmazingDreams/keeUY/ http://jsfiddle.net/AmazingDreams/keeUY/embedded/result/
最佳答案
更新
最终的解决方案被证明非常简单。由于似乎没有任何效果并且修复了一种情况破坏了另一种情况(所选元素最初是否可见之间存在重大差异)我决定将 sh*t 从滚动条中删除:
我删除了所有旧的“修复”
scrollToCurrent = function(length){
var prev = $("div.scroller div.selected").prev();
// Check if previous exists
if($(prev).length > 0) {
// number of previous items * height of item - half an items height
var scrollY = ($(prev).prevAll().length * $(prev).outerHeight()) - ($(prev).outerHeight() / 2);
if(length === 0) {
var i = 0;
var maxpushes = 100;
// Push just as long as needed to get the scrollbar to where we want it to (fixes ie7 issue)
while($("div.scroller").scrollTop() < scrollY) {
$("div.scroller").scrollTop(scrollY);
// Make sure it can never turn into an endless loop
i++;
if( i > maxpushes) {
break;
}
}
} else {
$(".scroller").animate({
scrollTop : scrollY
}, length);
}
}
};
旧的无效尝试
我设法通过将它作为一个额外的元素来“修复”它:更新修复如下
<div class="cycle inactive">
<?php // I fix IE7 issues ?>
</div>
我认为 <div>
中的换行符完成 99% 的工作。所以把那条线放在那里。
我不认为这是“解决”问题,我会保留这个问题,首先我希望这个东西稳定一段时间。
编辑:
好吧,这个“重大更新”只是解决了这个问题(即内爆停止工作,爆炸工作)。更新修复:
<?php // Only show if menu starts exploded ?>
<?php if( ! $imploded): ?>
<div class="cycle inactive">
<?php // I fix IE7 issues ?>
</div>
<?php endif; ?>
关于jquery - IE7 在滚动之前不会加载可滚动的 div 中的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17572860/