【发布时间】:2016-11-11 16:28:18
【问题描述】:
今天我遇到了一个有趣的错误,花了很多时间才弄清楚。
设置
页面上的表单。提交时,数据被捕获并用它创建new FormData() 对象。
该对象通过 xhr 请求发送到 .php 脚本,然后返回 ok / error 消息。
代码看起来像这样:(简化版,不需要绒毛)
<form name="frm" id="frm" action="" method="post" onsubmit="save(event, this);" enctype="multipart/form-data">
<input name="name" id="name" type="text" value="..." />
<input name="email" id="email" type="text" value="..." />
<input name="phone" id="phone" type="text" value="..." />
<input name="website" id="website" type="text" value="..." />
<textarea name="details" id="details"></textarea>
<input name="send" type="submit" value="Send" />
</form>
<script type="text/javascript">
function save(e, frm) {
if (document.getElementById('nume').value == '' ||
document.getElementById('email').value == '' ||
document.getElementById('telefon').value == '' ||
document.getElementById('site').value == '') {
alert('Forms empty');
} else {
var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
var r = JSON.parse(xhr.responseText);
if (r.code == 0) {
document.getElementById('message_ok').style.display = 'block';
} else {
document.getElementById('message_err').style.display = 'block';
}
}
};
xhr.open('POST', 'http://url', true);
var data = new FormData(frm);
xhr.send(data);
}
e.preventDefault();
}
</script>
将此发送到.php 将生成一个如下所示的数组:
Array
(
[name] => some name
[email] => some email
[phone] => 11111111
[website] => some site
[details] => some details
[send] => Send
)
而.php 将回复{"message":"ok","code":0} 或{"message":"error","code":1}
现在这是预期的行为。这是我在 Chrome、IE 或 Safari 上得到的。
问题
然而,在 Firefox 上,我得到相同的数组,但没有 submit 输入 (name="send") 键/值对:
Array
(
[name] => some name
[email] => some email
[phone] => 11111111
[website] => some site
[details] => some details
)
我在 Linux 和 Windows 上都试过了,以覆盖我的基础,但它仍然给出了同样不令人满意的结果。
解决方案
在网上搜索并出现空白后,我解决它的方法(更多的补丁,而不是真正解决)是覆盖send键/值:
var data = new FormData(frm);
data.append('send', 'Send');
xhr.send(data);
这是可行的,因为如果它已经定义(Chrome 等......),它会被覆盖,如果它不存在,它就会被创建。
问题
- 类似的 - 你有没有遇到过类似的事情?
- 修复 - 我认为我的解决方案是 hack,您有什么更好的修复方法吗?
【问题讨论】:
-
这是预期的行为。提交按钮只有在表单正常提交时才会自动发送。当您在 Javascript 中创建
FormData时,它不知道提交与特定的提交按钮相关,因此它无法将其自动添加到FormData。我很惊讶它在其他浏览器中的工作方式不同。 -
很抱歉,我不同意你的观点。文档中没有任何地方这么说。你可能是对的,但在我看到实际证据之前,我仍然相信这不是预期的行为。请参阅:developer.mozilla.org/en-US/docs/Web/API/FormData 和 developer.mozilla.org/en-US/docs/Web/API/FormData/…
-
我刚刚看到 Chrome 58 出现这种行为的页面,而使用 Chrome 53 的同事“很好”。也就是说,从表单创建了一个新的 FormData 对象,而我的不包括提交者,而他的包含。非常令人沮丧,因为表单上有几个提交按钮,它们有自己的名称和值。
标签: javascript forms firefox xmlhttprequest form-data