1

我有以下 jquery 脚本来打开指向新页面的链接并具有滚动效果。但是,我无法让它在 Firefox 11.0 中运行。

var jump = function (e) {
    if (e) {
        e.preventDefault();
        var target = $(this).attr("href");
    } else {
        var target = location.hash;
    }

    $('html,body').animate(
{
   scrollTop: $(target).offset().top
}, 2000, function () {
   location.hash = target;
});

}

$('html, body').hide();

$(document).ready(function () {
    $('a[href^=#]').bind("click", jump);

    if (location.hash) {
        setTimeout(function () {
            $('html, body').scrollTop(0).show();
            jump();
        }, 1000);
    } else {
        $('html, body').show();
    }
});

它只是不断循环过去 setTimeout 的这一部分,然后继续从头开始。

$('html, body').scrollTop(0).show();
jump();

这只发生在 Firefox 11.0 有谁知道如何解决这个问题或解决方法?

4

3 回答 3

1

尝试使用window.setTimeout,因为我认为这就是它应该被调用的方式。另外,您使用的超时时间为 0,那么,为什么?

于 2012-04-11T18:44:48.550 回答
0

使用setTimeout超时 0 基本上就好像你根本没有使用setTimeout一样,我猜 Firefox 不喜欢它。

于 2012-04-11T18:51:30.143 回答
0

错误出现在 MVC 框架中。Petr Vostrel 是发现它的人,所以我把功劳归功于他。这是他发现的。

MicrosoftAjax 组件尝试管理某些浏览器的历史记录,并为此使用 URL 的哈希部分,这是一个有效的标准过程,直到现在。在初始化时,Sys$_Application$initialize()通过_navigate()应用_raiseNavigate()程序方法。而这个专门为 Firefox 做了一些舞蹈:

// Name:        MicrosoftAjax.debug.js
// Assembly:    System.Web.Extensions
// Version:     4.0.0.0
// FileVersion: 4.0.20526.0

if ((Sys.Browser.agent === Sys.Browser.Firefox) && window.location.hash &&
(!window.frameElement || window.top.location.hash)) {
window.history.go(0);
}

三个条件:

browser is Firefox
address carries a hash portion after the URL
it is not inside a frame

所有这些都在你的情况下通过,野兽被释放:

window.history.go(0);

这指示浏览器的历史管理器按照作为参数给出的距离后退或前进。-2 后退一步,1 前进一步。因此 0 有效地重新加载页面。并在每个页面加载时为页面提供任何散列。无论如何都想不出这条线的任何有效目的......

果然,如果我注释掉那些相当毛茸茸且毫无意义的线条,它就起作用了!这似乎是 Firefox 3.5 或更低版本的向后兼容尝试,所以我会说删除它或更好地更新你的 MVC。

于 2012-04-12T19:17:46.757 回答