javascript更改get参数而不重定向[重复]

Posted

技术标签:

【中文标题】javascript更改get参数而不重定向[重复]【英文标题】:javascript changing the get parameter without redirecting [duplicate] 【发布时间】:2010-12-02 01:40:49 【问题描述】:

如何在不重定向的情况下只更改 get 参数?

parent.location.search = "?after=20"; 
// ok that changes, but also redirect to the new page

有什么解决办法吗?或者答案是否定的,如果不是,请写大号。

【问题讨论】:

ajax 目的,保持 ajax 正常工作并让用户在需要时与其他人共享链接 AJAX 的标准范例是使用锚点而不是查询字符串。我会顺其自然。 是的,但是检测锚中的值并加载它需要额外的工作,如果用户禁用了 javascript,那么您还必须呈现 url 并查看锚标记中是否有任何变量,如果是的话,然后赋值。这样它将可用于 javascript 或没有 javascript。换句话说,它有很多额外的工作哈哈。 如果 JS 被禁用,你首先如何更改查询字符串或锚点?也许您应该解释一下使用您想要实现的目标。 如果我与你分享链接 www.domain.com/#after=20.. javascript 可以渲染它并显示,而不是让 javascript rander,我只会让 php 渲染而不是javascript 和显示。 【参考方案1】:

更新

由于这是公认的答案,并且不再正确,请参阅 this duplicate question 了解最新信息。

原答案如下:


没有

您可以通过location 对象的hash 属性访问URL 的锚点部分

parent.location.hash = "whatever value you want";

【讨论】:

我更喜欢@ates-goral 的答案,但很遗憾,并非所有浏览器都支持它。加上它不会是安全风险,如果有人更改查询字符串,它不像人正在更改完整的路径或域。即使用户可以更改路径,但这并不意味着它存在安全风险,因为域仍然是相同的,除非它是一个博客站点。 我喜欢这个,但你需要注意#值永远不会发送到服务器***.com/questions/774136/…【参考方案2】:

如果您的目标是使用查询字符串来存储一些以后可以从书签中恢复的状态,那么您应该使用锚点。

但是,如果您出于某种原因必须更改查询字符串,实际上有办法。但是,我不赞同这一点。我只是为了完整性而提及它。

当服务器返回204 No Content 响应时,大多数浏览器不会做任何事情——即甚至不会尝试转换到另一个页面,甚至不会擦除当前页面。您可以做的是让后端在向刚刚提供的同一页面发出请求时仅发出 204 响应,并更改查询参数。

【讨论】:

所以这个方法真的依赖于浏览器,如果浏览器重定向,那么没有办法阻止它..对吗?我可以设置 204 响应,前提是我知道缺点 您可以放心地假设所有现代浏览器的行为方式都相同——即。保持在同一页面上。 你在最新的浏览器上测试过吗? 我记得让它可以在 Firefox 和 IE 上运行。您绝对应该自己测试一下。但是,我再次恳请您改用锚点! :) 在 Safari 4 中试过这个,它在收到 204 响应时清除查询字符串。【参考方案3】:

现在答案是YES

至少在 html5 中,这意味着所有主流浏览器 (IE10+)Does Internet Explorer support pushState and replaceState?http://caniuse.com/#feat=history

您也可以查看我对另一个 SO 问题的回答:How can I change the page URL without refreshing the page?

【讨论】:

【参考方案4】:

呃,不 - 如果您更改 URL 参数,您的浏览器将加载新页面。

【讨论】:

不一定...如果服务器返回204,浏览器将停留在同一页面上。【参考方案5】:

如果不从服务器重新加载页面,您将无法更改查询字符串(即以 ? 为星号的部分)。但是,您可以使用像 http://www.example.com/page.html#anchorname 这样的页面锚来影响 url,而无需从服务器重新加载页面。

【讨论】:

【参考方案6】:

您不能这样做,因为如果可以这样做会带来安全风险....如果页面可以更改 URL 栏中的值,则网络钓鱼者发布的页面很容易将该值更改为似乎是您银行网站上的一个页面。

【讨论】:

更改查询字符串和更改路径的其余部分之间存在很大差异。如果您当前的主机名没有欺骗任何人,那么当您更改它时它不会再欺骗任何人,特别是因为您仍然可以更改它并控制输出内容,即使它确实会去服务器检索新 URL。 就像我在下面说的:我更喜欢@ates-goral 的答案,但它并非所有浏览器都支持,非常遗憾。加上它不会是安全风险,如果有人更改查询字符串,它不像人正在更改完整的路径或域。即使用户可以更改路径,但这并不意味着它存在安全风险,因为域仍然是相同的,除非它是一个博客站点。 我真的不认为应该由浏览器来决定地址栏中 URL 的哪些部分可以安全更改...对于浏览器来实现,你知道不同的浏览器会有所不同。 是的,我同意,但是浏览器应该让用户更改路径(不是域),因为现在每个人都喜欢使用 ajax 来做事,而更改路径只是为了让用户使用与其他人共享链接当前页面的用户。是的,我知道你也可以用哈希来做到这一点,但它让人们与不同媒体的标题共享链接令人困惑,但他们共享不同的页面,因为他们是从 ajax 获得的……显然还有其他一些解决方案……但是理想的做法是让域所有者更改他们拥有的路径。

以上是关于javascript更改get参数而不重定向[重复]的主要内容,如果未能解决你的问题,请参考以下文章

jquery:更改URL地址而不重定向? [复制]

通过单击链接发送 AJAX 请求而不重定向用户

使用 .htaccess 重定向 404 而不重定向尾部斜杠

附加链接而不重定向

如何仅重定向子目录而不重定向内容?

重定向进入空白页面而不重定向到路由 Laravel 5.8