4

ダイアログを表示するには、ウィンドウの現在のスクロール位置を知る必要があります。これは$(document).ready、jQuery のブロック内で行われます。

ただし、Internet Explorer では、スクロール位置を記憶しなければならない場合に問題が発生します。

これを試すには、次の HTML コードを IE で開き、少し下にスクロールしてリロードを押します (申し訳ありませんが、フィドルを作成していません。スクロールが機能しないためです)。

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"     
type="text/javascript" charset="utf-8"></script>

<script type="text/javascript" charset="utf-8">
  $(document).ready(function() {
    alert(document.body.scrollTop);
    alert(document.body.scrollTop);
  });
</script>

<div style="height:4000px;">
</div>

1つ目alert0、2 つ目は正しい数値を示しています。また、(私の場合) 20 ミリ秒を使用して待機すると、最初のアラートがなくても機能します。setTimeoutもちろん、他の状況ではさらに時間がかかる可能性があるため、解決策にはなりません。

問題は、IEが最初に上にスクロールし、いくつかのことを行い、しばらくしてから以前のスクロール位置を復元することだと思います(おそらく、このスクロール位置がまだ存在することを確認するために、最初にレンダリングする必要があります)。

ブラウザのスクロールを一度に正しくする適切な方法はありますか?

4

1 に答える 1

0

ページのスクロールを取得するためのプロパティがいくつかあり、ブラウザごとに異なります。正しいスクロールを受け取るために私が書いた関数は次のとおりです。

関数 getScroll(型)
{
    タイプ = タイプ || '上';

    var 結果 = 0;
    var スクロール = 0;
    if (type === 'トップ')
    {
        if (ISQ.Http.browser.app !== 'ie' || ISQ.Http.browser.isIE9)
            scroll = window.pageYOffset;
        if (ISQ.Http.browser.app !== 'ie')
            scroll = returnMaxScroll(scroll, window.scrollY);
        scroll = returnMaxScroll(scroll, document.body.scrollTop);
        scroll = returnMaxScroll(scroll, document.documentElement.scrollTop);
        scroll = returnMaxScroll(scroll, document.body.parentNode.scrollTop);
    }
    そうでなければ (タイプ === '左')
    {
        if (ISQ.Http.browser.app !== 'ie' || ISQ.Http.browser.isIE9)
            scroll = window.pageXOffset;
        if (ISQ.Http.browser.app !== 'ie')
            scroll = returnMaxScroll(scroll, window.scrollX);
        scroll = returnMaxScroll(scroll, document.body.scrollLeft);
        scroll = returnMaxScroll(scroll, document.documentElement.scrollLeft);
        scroll = returnMaxScroll(scroll, document.body.parentNode.scrollLeft);
    }
    else if (type === '高さ')
    {
        スイッチ (ISQ.Http.browser.app)
        {
            ケース "クローム":
            ケース "ff":
            ケース「オペラ」:
            ケース「サファリ」:
                // iframe
                if (window.top === ウィンドウ)
                    scroll = document.documentElement.scrollHeight;
                // ウインドウ上部
                そうしないと
                    scroll = document.body.scrollHeight;
                壊す;
            デフォルト:
                scroll = returnMaxScroll(scroll, document.body.scrollHeight);
                scroll = returnMaxScroll(scroll, document.documentElement.scrollHeight);
                scroll = returnMaxScroll(scroll, document.body.parentNode.scrollHeight);
                壊す;

        }
    }
    else if (type === '幅')
    {
        scroll = returnMaxScroll(scroll, document.body.scrollWidth);
        scroll = returnMaxScroll(scroll, document.documentElement.scrollWidth);
        scroll = returnMaxScroll(scroll, document.body.parentNode.scrollWidth);
    }

    スクロールを返します。
}
関数 returnMaxScroll(value1, value2)
{
    if (value1 > value2) return value1;
    戻り値2;
}
参考までに: これらのブール値を実装する必要があるかもしれません:
- ISQ.Http.browser.app !== 'すなわち'
- ISQ.Http.browser.isIE9

お役に立てば幸いです:)

于 2012-08-20T22:23:19.777 に答える