How do we update URL or query strings using javascript/jQuery without reloading the page?
有没有一种方法可以在不重新加载页面的情况下通过程序更新URL?
编辑:我在文章的标题中添加了一些内容。我只是想清楚我不想重新加载页面。
是和否。所有常见的Web浏览器都有一个安全措施来防止这种情况发生。目标是防止人们创建网站的副本,更改URL使其看起来正确,然后能够欺骗人们并获取他们的信息。
但是,一些兼容HTML5的Web浏览器实现了一个历史API,可以用于类似于您想要的内容:
1 2 3 4 | if (history.pushState) { var newurl = window.location.protocol +"//" + window.location.host + window.location.pathname + '?myNewUrlQuery=1'; window.history.pushState({path:newurl},'',newurl); } |
我做了测试,效果很好。它不会重新加载页面,但只允许您更改URL查询。您将无法更改协议或主机值。
更多信息:
http://diveintohtml5.info/history.html
https://developer.mozilla.org/en-us/docs/web/guide/api/dom/operating_浏览器历史
是-
你也可以用同样的方法找回它。
1 2 | var myURL = document.location; document.location = myURL +"?a=parameter"; |
location对象也有许多有用的属性:
1 2 3 4 5 6 7 8 | hash Returns the anchor portion of a URL host Returns the hostname and port of a URL hostname Returns the hostname of a URL href Returns the entire URL pathname Returns the path name of a URL port Returns the port number the server uses for a URL protocol Returns the protocol of a URL search Returns the query portion of a URL |
编辑:设置document.location的哈希值不应重新加载页面,只需更改页面焦点所在的位置。因此,更新到
伊迪丝2:要说清楚,不仅仅是在评论中:如果不更改页面,就不能用javascript更新整个URL,这是一个安全限制。否则,你可以点击一个链接到一个随机的页面,精心设计的看起来像Gmail,并立即将URL更改为www.gmail.com并窃取人们的登录信息。您可以在一些浏览器上在域后更改部分,以处理Ajax样式的事情,但这已经被Osiris链接到了。更重要的是,你可能不应该这样做,即使你可以。该URL告诉用户他/她在您的网站上的位置。如果在不更改页面内容的情况下更改它,它会变得有点混乱。
你可以使用:
1 | window.history.pushState('obj', 'newtitle', newUrlWithQueryString) |
使用
window.history.replaceState({}, document.title, updatedUri);
在不重新加载页面的情况下更新URL
1 2 3 4 5 6 7 8 9 10 11 12 | var url = window.location.href; var urlParts = url.split('?'); if (urlParts.length > 0) { var baseUrl = urlParts[0]; var queryString = urlParts[1]; //update queryString in here...I have added a new string at the end in this example var updatedQueryString = queryString + 'this_is_the_new_url' var updatedUri = baseUrl + '?' + updatedQueryString; window.history.replaceState({}, document.title, updatedUri); } |
删除查询字符串而不重新加载页
1 2 3 4 5 | var url = window.location.href; if (url.indexOf("?") > 0) { var updatedUri = url.substring(0, url.indexOf("?")); window.history.replaceState({}, document.title, updatedUri); } |
是的
document.location是正常的方式。
但是document.location与window.location实际上是相同的,除了window.location在较旧的浏览器中更受支持,因此可能是首选的选择。
查看此线程,了解更多信息:
在javascript中window.location和document.location有什么区别?
在URL更改前加上哈希标记以避免重定向。
这种重定向
1 | location.href += '&test='true'; |
这不会重定向
1 | location.href += '#&test='true'; |
定义一个新的URL对象,将其指定为当前的URL,将参数附加到该URL对象,最后将其推送到浏览器状态。
1 2 3 4 | var url = new URL(window.location.href); //var url = new URL(window.location.origin + window.location.pathname) <- flush existing parameters url.searchParams.append("order", orderId); window.history.pushState(null, null, url); |
你需要更具体一些。"更新URL"是什么意思?这可能意味着自动导航到不同的页面,这当然是可能的。
如果只想更新地址栏的内容而不重新加载页面,请参见修改URL而不重新加载页面。
普通javascript:document.location='http://www.google.com';
这将导致浏览器刷新-如果需要更新URL以实现某种浏览历史记录而不重新加载页面,请考虑使用哈希。如果是这种情况,您可能需要查看jquery.hashchange。
是-用于查询的