我有多个页面使用有效的GET数据,例如http://website.com/?id=12345
我有一个通用的HTML表单,使用php的“require”将其拉到许多不同的页面上,然后使用POST提交。无论此表单位于哪个页面,它都应该始终提交回同一页面。但是,在提交表单后,我希望删除?id = 12345。
因此,例如,如果用户在http://website.com/new.php?id=12345,则应该回发到http://website.com/new.php。如果用户在http://website.com/old.php?id=12345上,那么该格式应该发布回old.php
之前我发现的最佳解决方案是将表单设置为样式:
<form action="?" method="POST">
哪个会更改http://website.com/new.php的所有链接?还是http://website.com/old.php?这非常接近,但并不完美。
事实证明,我终于通过使用JavaScript找到了解决问题的方法:
url = location.href;
qindex = url.indexOf("?");
这可以将地址栏上的任何内容作为字符串拉出来并找到第一个索引?标记。从那里:
if(qindex != -1)
告诉我有一个?标记
var plainUrl = url.substring(0, qindex);
作为一个字符串,可以获得一切吗?标记,但不是之后。最后:
window.location.replace(plainUrl);
将地址栏重写为普通网址,不包括?或者之后发生的任何事情,并且不需要重定向浏览器。
答案 0 :(得分:1)
由于您的页面不会进行任何服务器端处理,因此您可以通过以下两种技巧组合实现您的目标。 首先,将您的特定查询字符串更改为哈希值,然后可以直接编辑而不会触发页面重新加载:
http://yourdomain.com/page.html#search=value
然后根据传入的查询字符串修改这样的脚本以执行您想要执行的操作。
<script type='text/javascript'>
// grab the raw "querystring"
var query = document.location.hash.substring(1);
// immediately change the hash
document.location.hash = '';
// parse it in some reasonable manner ...
var params = {};
var parts = query.split(/&/);
for (var i in parts) {
var t = part[i].split(/=/);
params[decodeURIComponent(t[0])] = decodeURIComponent(t[1]);
}
// and do whatever you need to with the parsed params
doSearch(params.search);
</script>
现在您可以通过以下方式删除查询字符串后缀:
如其他地方详述的那样,hide variables passed in URL,可以在现代浏览器中使用JavaScript的历史记录API。
history.replaceState({}, null, "/index.html");
这会导致您的网址显示为/index.html而不重新加载页面
这个小宝石在这里有更详细的解释:
https://developer.mozilla.org/en-US/docs/Web/API/History_API