如何判断页面是否已跳转到javascript中的锚点(#)?

我有一些javascript可以出现在许多不同的页面上。 有时这些页面是通过包含锚引用的URL(例如#comment-100)访问的。 在那些情况下,我希望javascript延迟执行,直到窗口跳转。 现在我只是使用延迟,但这非常hackish,显然在所有情况下都不起作用。 我似乎无法找到任何与窗口“跳转”相对应的DOM事件。

除了简单的延迟之外,我提出的唯一解决方案是让JS在URL中查找锚点,如果找到了,请注意scrollTop中的更改。 但这似乎有些错误,我并不是100%确定我的脚本在滚动发生之前总会被触发,所以只有当用户手动滚动页面时它才会运行。 无论如何,我真的不喜欢这个解决方案,并且更喜欢更多事件驱动的东西。 有什么建议?

编辑澄清:

我不是想检测哈希变化。 采用以下示例:

  1. Page index.php包含post.php#comment-1的链接
  2. 用户单击post.php#comment-1的链接
  3. post.php#comment-1加载
  4. $(文件).ready fires
  5. 不久之后,浏览器向下滚动到#comment-1

我正试图可靠地检测第5步发生的时间。

好像你可以使用window.onscroll 。 我刚刚测试了这段代码:

   

这似乎工作。

编辑:嗯,它在IE8中不起作用。 它适用于Firefox和Chrome。

编辑:jQuery有一个.scroll()处理程序,但它在浏览IE之前触发,似乎不适用于Chrome或Firefox。

您可以在现代浏览器中查看window.onhashchange。 如果您想要交叉兼容,请查看http://benalman.com/projects/jquery-hashchange-plugin/

此页面还有关于window.onhashchange的更多信息。

编辑:你基本上用类似的链接约定替换所有锚名称,然后使用.scrollTo来处理滚动:

 $(document).ready(function () { // replace # with #_ in all links containing # $('a[href*=#]').each(function () { $(this).attr('href', $(this).attr('href').replace('#', '#_')); }); // scrollTo if #_ found hashname = window.location.hash.replace('#_', ''); // find element to scroll to ( or anything with particular id) elem = $('a[name="' + hashname + '"],#' + hashname); if(elem) { $(document).scrollTo(elem, 800,{onAfter:function(){ //put after scroll code here }}); } }); 

请参阅jQuery:调用URL时滚动到锚点,替换浏览器行为以获取更多信息。

要检测元素何时出现在屏幕上,请使用出现的插件:

 $('#comment-1').appear(function() { $(this).text('scrolled'); });