有没有一种方法可以在不重新加载页面的情况下修改当前页面的URL?

如果可能,我想访问#哈希之前的部分。

我只需要更改域之后的部分,所以我不会违反跨域策略。

 window.location.href = "www.mysite.com/page2.php";  // this reloads

当前回答

正如Thomas Stjernegaard Jeppesen所指出的,当用户浏览Ajax链接和应用程序时,您可以使用History.js修改URL参数。

距离这个答案已经过去了将近一年,History.js不断发展,并变得更加稳定和跨浏览器。现在,它可以用于管理兼容HTML5的历史状态,也可以用于许多仅支持HTML4的浏览器。在本演示中,您可以看到它如何工作的示例(以及如何尝试其功能和限制)。

如果您在如何使用和实现这个库方面需要任何帮助,我建议您查看演示页面的源代码:您会发现它非常容易做到。

最后,要全面解释使用哈希(和hashbangs)的问题,请查看Benjamin Lupton的链接。

其他回答

只需使用,它不会重新加载页面,只会重新加载URL:

$('#form_name').attr('action', '/shop/index.htm').submit();

正如Vivart和geo1701所提到的,HTML5 replaceState就是答案。但是,并非所有浏览器/版本都支持此功能。History.js包装了HTML5状态特性,并为HTML4浏览器提供了额外的支持。

这段代码对我很有用。我在ajax应用程序中使用了它。

history.pushState({ foo: 'bar' }, '', '/bank');

一旦使用ajax将页面加载到ID中,它会自动更改浏览器url,而无需重新加载页面。

这是下面的ajax函数。

function showData(){
    $.ajax({
      type: "POST",
      url: "Bank.php", 
      data: {}, 
      success: function(html){          
        $("#viewpage").html(html).show();
        $("#viewpage").css("margin-left","0px");
      }
    });
  }

示例:从任何页面或控制器(如“Dashboard”),当我单击银行时,它会使用ajax代码加载银行列表,而无需重新加载页面。此时,浏览器URL将不会更改。

history.pushState({ foo: 'bar' }, '', '/bank');

但是当我在ajax中使用这段代码时,它会在不重新加载页面的情况下更改浏览器url。下面是完整的ajax代码。

function showData(){
        $.ajax({
          type: "POST",
          url: "Bank.php", 
          data: {}, 
          success: function(html){          
            $("#viewpage").html(html).show();
            $("#viewpage").css("margin-left","0px");
            history.pushState({ foo: 'bar' }, '', '/bank');
          }
        });
      }

注意:如果你使用的是HTML5浏览器,那么你应该忽略这个答案。从其他答案中可以看出,这现在是可能的。

在不重新加载页面的情况下,无法在浏览器中修改URL。URL表示最后加载的页面。如果您更改它(document.location),它将重新加载页面。

一个明显的原因是,你在www.mysite.com上写了一个看起来像银行登录页面的网站。然后你将浏览器的URL栏更改为www.mybank.com。用户将完全不知道他们真的在看www.mysite.com。

位置的任何更改(window.location或document.location)都将导致对新URL的请求,如果您不仅仅是更改URL片段。如果更改URL,则更改URL。

如果您不喜欢当前使用的URL,请使用服务器端URL重写技术,如Apache的mod_rewrite。