在未更改代码的页面上开始出现一个奇怪的问题。我已经把事情搞砸了,现在已经把问题弄清了,但我无法理解它。
如果我只输入文本字段,则在此表单上,Safari不会发送表单(尽管不会发生错误)。当只输入文本字段时,它会在Firefox中发送。
如果图片字段包含文件,或者我完全删除了图片,Safari将发送表单。因此,由于某些原因,图像字段中缺少数据导致表单无法在Safari中发送。
似乎很重要的是,文本字段是由Javascript创建的,如果我只是使用常规文本输入来创建页面而不会发生问题。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script type="text/javascript" language="javascript">
function sendForm(){
var formElement = document.querySelector("#upload");
var formData = new FormData(formElement);
var request = new XMLHttpRequest();
request.open("POST", "test.php");
request.send(formData);
}
</script>
</head>
<body>
<form name="upload" id="upload" >
<h2>Image</h2>
<input name="image" type="file" />
<p onclick="sendForm()" />SEND</p>
</form>
<script>
for (var f = 0; f < document.forms.length; f++) {
new_input = document.createElement('input');
new_input.type = 'hidden';
new_input.name = 'title';
new_input.value = 'test';
document.forms[f].appendChild(new_input);
}
</script>
</body>
</html>
我正在跟踪发送的数据:
<?php
$title = $_REQUEST['title'];
$file = 'output.txt';
$current = file_get_contents($file);
file_put_contents($file, $title."\n");
?>
此外,如果request.send(formData);
更改为request.send("test");
,则会在所有情况下发送“test”,因此Safari似乎遇到了FormData对象的问题。
我已经使用fetch()API对此进行了测试,同样的事情发生了。