2011-06-04 43 views
3

我使用jQuery的scrollTop()方法获取页面加载的滚动条的垂直位置。我需要在执行url中的锚后获取此值(前链接:www.domainname.com#foo)。我可以使用下面的代码,它在Firefox和IE浏览器的工作原理:当url包含锚点时,获取页面加载的网页的滚动条的垂直位置

前网址:www.domainname.com#富

$(document).ready(function() {  
    if ($(this).scrollTop() > 0) { 
     // then a conditional statement based on the scrollTop() value 
     if ($(this).scrollTop() > $("#sidenav").height()) { ... 

但在Safari和Chrome的document.ready()似乎前执行在这种情况下,锚点scrollTop()会在页面加载时返回0。在Chrome和Safari中执行定位点后,如何在页面加载时访问scrollTop()值?

回答

4

你可能只是想为它需要从Chrome或Safari浏览器得到它可靠

var MAX_CHECKS = 5;    // adjust these values 
var WAIT_IN_MILLISECONDS = 100; // however works best 
var checks = 0; 

function checkScroll() { 
    if ($(this).scrollTop() > 0) { 
    // then a conditional statement based on the scrollTop() value 
    if ($(this).scrollTop() > $("#sidenav").height()) { 
     ... 
    } 
    } else { 
    if (++checks < MAX_CHECKS) { 
     // just to make sure, you can try again 
     setTimeout(checkScroll, WAIT_IN_MILLISECONDS); 
    } 
    } 
} 

$(document).ready(function() { 
    // You can also throw in an if statement here to exclude 
    // URLs without # signs, single out WebKit browsers, etc. 
    setTimeout(checkScroll, WAIT_IN_MILLISECONDS); 
    ... 
}); 

请注意,您还可以使用if ($.browser.webkit)然而,许多毫秒做一些快速和脏象setTimeout,虽然这个功能已被弃用,并可能被移动到插件而不是主jQuery(有利于功能检测)。

+0

我希望有一个更简单的方法来做到这一点没有计时器。但是,这个答案将起作用。谢谢 – Greg 2011-06-04 13:59:15

+1

@Greg当然,这是一个合理的希望,但我认为没有任何事情会发生,你可以使用。顺便说一下,另一个选项是获取锚点元素的偏移高度(基于URL)并使用它。 – brymck 2011-06-04 18:41:45

+0

感谢关于使用offset()与anchor元素而不是scrollTop()的提示。这对Firefox和Webkit中的我非常有用! – Greg 2011-06-06 18:55:39