考虑这个形式:
<form action="http://www.blabla.com?a=1&b=2" method="GET">
<input type="hidden" name="c" value="3" />
</form>
当提交这个GET表单时,参数a和b将消失。 这有什么原因吗? 有没有办法避免这种行为?
考虑这个形式:
<form action="http://www.blabla.com?a=1&b=2" method="GET">
<input type="hidden" name="c" value="3" />
</form>
当提交这个GET表单时,参数a和b将消失。 这有什么原因吗? 有没有办法避免这种行为?
当前回答
回答你的第一个问题,是的,浏览器会这样做,原因是 浏览器并不关心动作URL中的现有参数 所以它会完全去除它们
为了防止这种情况发生使用我写的JavaScript函数 使用jQuery:
function addQueryStringAsHidden(form){
if (form.attr("action") === undefined){
throw "form does not have action attribute"
}
let url = form.attr("action");
if (url.includes("?") === false) return false;
let index = url.indexOf("?");
let action = url.slice(0, index)
let params = url.slice(index);
url = new URLSearchParams(params);
for (param of url.keys()){
let paramValue = url.get(param);
let attrObject = {"type":"hidden", "name":param, "value":paramValue};
let hidden = $("<input>").attr(attrObject);
form.append(hidden);
}
form.attr("action", action)
}
其他回答
这是对Efx上述帖子的回应:
如果URL已经包含了您想要更改的变量,那么它将再次作为隐藏字段添加。
下面是对该代码的修改,以防止重复URL中的变量:
foreach ($_GET as $key => $value) {
if ($key != "my_key") {
echo("<input type='hidden' name='$key' value='$value'/>");
}
}
在HTML5中,这是按规范的行为。
参见控件和表单的关联-表单提交算法。
请看“4.10.22.3表单提交算法”,第17步。在GET表单的情况下,一个http/s URI的查询字符串:
让destination是一个新的URL,它等于action 它的<query>组件被query(添加U+003F QUESTION 如果合适,标记字符(?)。
因此,您的浏览器将丢弃URI中现有的“?…”部分,并将其替换为基于您的表单的新部分。
在HTML 4.01中,规范产生了无效的uri -大多数浏览器实际上并没有这样做…
参见表单-处理表单数据,第四步- URI将有一个?附加,即使它已经包含一个。
你的建筑是违法的。不能在表单的操作值中包含参数。如果您尝试这样做,结果将取决于浏览器的特性。如果它只适用于一种浏览器而不适用于另一种浏览器,我不会感到惊讶。即使它看起来可以工作,我也不会依赖它,因为浏览器的下一个版本可能会改变这种行为。
“但是假设我在查询字符串和隐藏输入中有参数,我能做什么?”你能做的就是修复错误。不是讽刺,但这有点像问,“但是假设我的URL使用百分号而不是斜杠,我能做什么?”唯一可能的答案是,您可以修复URL。
回答你的第一个问题,是的,浏览器会这样做,原因是 浏览器并不关心动作URL中的现有参数 所以它会完全去除它们
为了防止这种情况发生使用我写的JavaScript函数 使用jQuery:
function addQueryStringAsHidden(form){
if (form.attr("action") === undefined){
throw "form does not have action attribute"
}
let url = form.attr("action");
if (url.includes("?") === false) return false;
let index = url.indexOf("?");
let action = url.slice(0, index)
let params = url.slice(index);
url = new URLSearchParams(params);
for (param of url.keys()){
let paramValue = url.get(param);
let attrObject = {"type":"hidden", "name":param, "value":paramValue};
let hidden = $("<input>").attr(attrObject);
form.append(hidden);
}
form.attr("action", action)
}
这不是隐藏参数开始的目的吗?
<form action="http://www.example.com" method="GET">
<input type="hidden" name="a" value="1" />
<input type="hidden" name="b" value="2" />
<input type="hidden" name="c" value="3" />
<input type="submit" />
</form>
我不会指望任何浏览器在操作URL中保留任何现有的查询字符串。
如规格(RFC1866,第46页;HTML 4。X节17.13.3)说明:
如果方法是“get”,操作是一个HTTP URI,用户代理将获取action的值,追加一个' ?然后追加使用“application/x-www-form-urlencoded”内容类型编码的表单数据集。
也许可以对action-URL进行百分比编码,以嵌入问号和参数,然后祈祷所有浏览器都能保留该URL(并验证服务器也能理解它)。但我绝不会依赖于此。
顺便说一下:对于非隐藏表单字段也没有什么不同。对于POST,操作URL可以包含一个查询字符串。