我正在创建一个AJAX表单,其中包括指定背景颜色或上传背景图像的选项。目标是如果已为bgImg
字段指定了文件,则忽略bgColor
字段。
<label>Color: <input type="color" name="bgColor" value="#000000"></label><br>
<label>Image: <input type="file" name="bgImg" accept="image/png"></label><br>
我认为收集表单数据最简单的方式当然是使用FormData API:
var fd = new FormData(document.getElementById('myForm'));
问题是,我不知道如何检查FormData对象是否选择了文件。无论文件输入是否为空,fd.has('bgImg')
都会返回true,因为该字段存在 - 这很合理。但是,如果指定了文件,
fd.get('bgImg')
可以正常工作,我可以验证正面案例,但是当文件输入为空时,同一行代码会直接使我的浏览器崩溃!(我只在Firefox中进行了检查,但它在我的实际脚本或来自浏览器控制台时始终如一。)不幸的是,“检查是否有文件”的操作是可识别但不可判定的,因此是无效的。那么我应该如何确定bgImg
字段是否为空呢?我意识到我还可以检查表单的
elements ['bgImg'] .files
对象,但是FormData API已经存在,而且更整洁,如果它似乎没有被致命地破坏,那么使用它将更容易!那我错过了什么吗?如果这不是使用方便的FormData对象的正确方式,那么我应该做些什么?检查files
集合实际上是唯一的解决方案吗?编辑:进一步调查发现,除Firefox之外的浏览器对此API的支持非常差,因此实际上检查
element.files
可能是更好的解决方案。但我仍然对为什么这会导致Firefox崩溃感到困惑。如果不久之后没有关于这个问题的答案,我可能会提交自己的答案。
(element.files||element.value).length>0||element.file
(或类似的东西)是唯一的解决方案...FormData
get
和getAll
也会使我的浏览器崩溃。Bugzilla 上是否已经有此问题的 Bug 报告?到目前为止我找不到任何信息... - Sebastian Simon