在ie9及以下使用History.js时,页面刷新会返回主页

时间:2013-01-27 13:49:03

标签: javascript history.js

我已经构建了一个使用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()返回没有任何哈希的路径。

有什么建议吗?我见过一些使用这个插件的网站有同样的问题,这里有类似的问题,但没有解决方案。

提前致谢!

3 个答案:

答案 0 :(得分: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;
    });
}

您可以在https://github.com/gbishop/TarHeelReaderTheme

中查看main.js和controller.js中的所有代码

修改 进一步的探索导致了History.js使用初始URL而不是root的情况。这个黑客似乎处理了这种情况。

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;
    });
}

答案 1 :(得分: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 explained

答案 2 :(得分:1)

也许是一个解决方案: 你可以试试我的前叉的History.js非官方版本1.8a2: https://github.com/andreasbernhard/history.js

...并提供反馈意见?非常感谢你!