我有一个HTML表单,它使用隐藏的输入来管理PHP处理脚本中的行为。
在浏览器测试中,我发现该表单在Chrome和IE中运行良好,但Firefox存在问题。
Firefox浏览器(使用39.0)删除隐藏的输入值。他们只是完全消失,只留下value=""
。这反过来会弄乱我的PHP。
我已经广泛搜索有关此问题的信息,但一无所获。
为什么Firefox会在我的HTML表单中删除(或忽略)隐藏的输入值?
在原始文件中
在Chrome开发者工具中
在Firefox Inspector中
更新(根据发布的评论)
浏览器测试。该表单已经过所有主要浏览器的桌面和移动版本测试。该表单适用于所有浏览器(包括Firefox移动版),但无法在Firefox桌面(39.0)中完全运行,因为隐藏的输入值已被删除。
更新2
重新启动并重新安装Firefox无法解决问题。
更新3
删除了所有客户端脚本并检查了HTML验证(没有错误)。问题依然存在。
更新4
这似乎是与Firefox缓存数据和处理POST请求的方式有关的问题。
当我“清除所有历史记录”(包括Cookie,缓存等)时,表单按预期工作... ONCE。
在所有后续提交中,value
属性都有一个空值,并且没有数据传递给PHP,直到我再次“清除所有历史记录”。
在其他浏览器中不会发生这种情况。
答案 0 :(得分:1)
我有完全一样的问题。没有使用客户端脚本。我将隐藏字段嵌套在div中,然后一切正常。
这有效:
<div>
<input type="hidden" value="<?=($_SESSION['CSRF-TOKEN'] ?? 'token')?>"name="_token">
</div>
复制了帖子中描述的确切行为:
<input type="hidden" value="<?=($_SESSION['CSRF-TOKEN'] ?? 'token')?>"name="_token">
以上两种变体均适用于Chrome。该问题仅出现在台式机Firefox 63.0.1(64位)上。
更新(2018-11-15)实际上,就我而言,问题是HTML格式不正确(name属性前没有空格)。 Chrome似乎对此宽容,而Firefox对此却不太宽容。 Firefox会一次提交该值,除非清除了缓存,否则不会再次提交。纠正HTML可以纠正Firefox出现的这种奇怪行为。更正的HTML:
<input type="hidden" value="<?=($_SESSION['CSRF-TOKEN'] ?? 'token')?>" name="_token">