6

History.js プラグインを使用してページ間を AJAX で移動し、それに応じて URL を更新するサイトを構築しました。IE 以外はすべて正常に動作します。ページを更新すると、基本的に、現在のページのコンテンツではなく、最初に表示されたページのコンテンツが読み込まれます。「まともな」ブラウザーでは、どのページからもコンテンツをロードせず、その URL のページ全体をロードするだけです。これは、IE が行うべきことです。

ハッシュをどうするか理解していないと思います。http://www.crownacre.voyced.com/contact-us/にアクセスすると正常に動作しますが、http://www.crownacre.voyced.com/#contact-us/ (ハッシュ付き) にアクセスすると、しません。

パス名に # が検出された場合はページをリダイレクトしようとしましたが、window.location.pathname としてこれを検出する方法はなく、History.getHash() はハッシュなしでパスを返します。

助言がありますか?このプラグインを使用しているいくつかの Web サイトで同じ問題や同様の問題が発生しているのを見てきましたが、解決策はありません。

前もって感謝します!

4

3 に答える 3

3

tarheelreader.org の書き直しで同じ問題に遭遇しました。History.js を使用していますが、IE8 の更新の問題を除いて正常に動作しています。このハックは私のために働いています。

最初のページの読み込み時にのみ実行される私のスタートアップ コードでは、次のようにします。

var url = window.location.href;
if (url.indexOf('#') > -1) {
    // ie refresh hack
    controller.stateChange();
}

controller.stateChange()すべての履歴の変更に使用する状態変更ハンドラーはどこにありますか。

function stateChange() {
    // handle changes in the URL
    var hist = History.getState(),
        url = hist.url,
        context = hist.data;
    renderUrl(url, context).then(function(title) {
        document.title = title;
    });
}

main.js と controller.js のすべてのコードは、https: //github.com/gbishop/TarHeelReaderTheme で確認できます。

編集 さらに調査した結果、History.js がルートではなく初期 URL を使用しているケースにたどり着きました。このハックはそのケースを処理するようです。

function stateChange() {
    // handle changes in the URL
    var hist = History.getState(),
        url = hist.url,
        bar = window.location.href,
        context = hist.data;
    //console.log("State changed...", url, context);
    if (url != bar && bar.indexOf('#') > -1) {
        //console.log('bar = ', bar);
        // I think we only get here in IE8
        // hack for hash mode urls
        var root = History.getRootUrl(),
            hashIndex = bar.indexOf('#');
        if (root != bar.slice(0, hashIndex)) {
            // try to fix the url
            url = root + bar.slice(hashIndex);
            //console.log('new url =', url);
            window.location.href = url;
        }
    }
    renderUrl(url, context).then(function(title) {
        document.title = title;
    });
}
于 2013-01-30T15:06:16.060 に答える
2

これは私のために働いた:

<script>
    var url = new String(document.location);
    if (url.indexOf("#") > -1) {
        alert("There is a Hash in the path");
    }
</script>

編集:

function LocationTest()
{
    var loc = window.location;
    alert(loc.href);
    alert(loc.protocol + "//" + loc.host + loc.pathname + loc.search + loc.hash);
    alert(loc.href == loc.protocol + "//" + loc.host + loc.pathname + loc.search + loc.hash);
}

サンプル ソース: window.location の説明

于 2013-01-29T17:02:15.080 に答える
1

おそらく解決策: https ://github.com/andreasbernhard/history.jsから私のフォークのHistory.js非公式バージョン1.8a2を試してみてください。

...フィードバックをお寄せください。どうもありがとうございました!

于 2013-01-29T17:59:09.880 に答える