强制哈希变换的最佳方法是什么?

时间:2013-08-14 04:37:41

标签: javascript ajax jquery

我的网站使用hashchange触发的AJAX(使其更友好)。我遇到的问题是,当我点击表单中的“提交”时,serialize()通过$.post()发送的所有表单数据都会丢失。我知道这是因为我点击提交后收到“Flag 1”警告,其他各种测试(警报,回显等)都表明这是真的。

这是我目前的代码:

$(document).ready(function() {

var data = '';
var hash = '';
newPage();
alert('Flag 1');

$(window).bind('hashchange', function() {
    hash = window.location.hash;
    if (hash == '') {
        path = window.location.pathname;
        hash = '#' + path.replace(/^\/+/, '');
    }
    data += '&func=' + hash;
    var xhr = $.post(hash, data, function(result) {
        $("maincontent").html(result);
    })
    .done(newPage);
});
// Initialize vars and handle new form elements
function newPage() {
    data = '';
    $('form').submit(function() {
        data = $(this).serialize();
        // Flag 2 - What do I do here?
    });
}
// Load ajax content on first run of document
if ($('#maincontent').html() == '')
    $(window).trigger('hashchange');

});

我想要做的是手动触发hashchange事件,同时也更改URL。问题是,如果我只是设置window.location.hash = $(this).attr('action');然后return false;“标记2”注释,那么我最终会在URL中收到不需要的垃圾,这可能是由于为网址编码了哈希标记( ......%23等。

我想知道设置哈希的最佳方法是什么,以及是否有更简单的方法来做我想要开始做的事情。

(我也欢迎提出建议我试图实现导航风格的替代方法的评论)

1 个答案:

答案 0 :(得分:0)

嗯,我知道这样做有很多错误。但我们有其他选择,您肯定会喜欢:

  1. jQuery历史插件:http://plugins.jquery.com/history/(演示:http://4nf.org/
  2. 历史JS:https://github.com/browserstate/history.js/
  3. 但如果您愿意避免使用较旧的浏览器支持,我会推荐HTML5 history.pushState。 (演示:https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Manipulating_the_browser_history
  4. 祝你好运!!