1

答えが見つからないため、おそらくこれは ASP.NET MVC では不可能です。私がやりたいのは、リンクをクリックしてターゲットページをロードし、スクロールしてそのページに固定することです。これの完璧な例は、この質問で回答されました。

ただし、これを JavaScript/jQuery で動作させるにはどうすればよいですか?

更新: このコードでは、setTimeOut 定義を除いてすべてが機能しています。停止をクリックするまでスクリプトを実行し続け、アンカーまでスクロールダウンします。何故ですか?

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();
        }, 0);
    } else {
        $('html, body').show();
    }        

});
4

4 に答える 4

2

私はasp.netについて何も知りませんが、これが起こっていると思います:

ASP.NET MVC の MicrosoftAjax モジュールは、場所にハッシュが指定されている場合、初期化時にページを再読み込みします。

MVC フレームワーク、つまりその 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);
}

3 つの条件:

  1. ブラウザは Firefox
  2. アドレスは URL の後にハッシュ部分を運ぶ
  3. それはフレームの中にありません

それらのすべてがあなたのケースで通過し、獣が解き放たれます:

window.history.go(0);

これは、ブラウザーの履歴マネージャーに、引数として指定された距離だけ前後に移動するように指示します。-2一歩後退、1一歩前進。したがって0、ページを効果的にリロードします。そして、ページに与えられたハッシュのすべてのページ読み込みでそれを行います。とにかく、この行の有効な目的は考えられません...

かなり毛むくじゃらで無意味な行をコメントアウトすれば、案の定、うまくいきます! これは Firefox 3.5 以前との下位互換性を保つための試みのようです。そのため、削除するか、MVC を更新することをお勧めします。

于 2012-04-12T15:02:14.647 に答える
1

jQuery では問題ありません。あなたの見解では、いくつかのコードを入れる必要があります。

<script>
  $(function () }

     var hash = window.location.hash;
     var achor = hash.substring(hash.indexOf('#'));

     $('html,body').animate({scrollTop: $("#"+achor).offset().top} 

  });
</script>
于 2012-04-10T18:54:56.527 に答える
0

これは実際にはASP.NETMVCに関するものではなく、クライアント側のスクリプト(Javascript)に関するものです。ルーティングに関連するハッシュ(#)については、このSOスレッドを参照してください...ASP.NetMVCに関連する唯一のアイテムだと思います...

于 2012-04-10T14:38:22.703 に答える
0

私は自分の質問に部分的に答えました。私は常に Firefox を使用しているため、テストは Firefox 11.0 で行いました。IEで簡単に確認したところ、うまくいきました。以前のバージョンの Firefox でテストしたところ、うまくいきました。Firefox 11.0 では動作しません。この質問を閉じて、適切な問題に対処する新しい質問を開きます。

于 2012-04-11T18:20:37.013 に答える