【发布时间】:2021-02-23 05:05:22
【问题描述】:
我“精心设计”了这段 jQuery + html 来完成以下任务:
用户可以单击一个占位符图像,从而打开一个文件选择对话框。一旦选择了一个文件,相应的多部分表单就会上传到服务器。我试图模仿此文件上传的 AJAX 行为,因此我还使用不可见的 iframe 来接收服务器响应。
让我先给出代码,这样会更容易解释问题
jQuery("#myInput").change(function () { // Submit form upon file selection
// alert("myInput.val() = " + $('#myInput').val()); // alert 1
$('#form1').submit();
// alert("myInput.val() = " + $('#myInput').val()); // alert 2
});
<form id="form1" action="/do_upload.php" method="post" enctype="multipart/form-data" target="target_frame">
<input id="myInput" type="file" name="userfile" /><br>
</form>
<img src="/img/placeholder.png" onclick="$('#myInput').click();" >
<iframe id="target_frame" name="target_frame" src="#" style="width:0;height:0;border:0px solid #fff;"></iframe>
代码在新的 Chrome/Firefox/Safari 上完美运行。 (有趣的是,如果我在myInput 上设置visibility: hidden;,它甚至可以工作。所以显然这不是什么安全问题)。但是 IE 9 和 10 都显示相同的行为:单击图像成功弹出对话框,文件路径在“alert 1”中正确设置,但在“alert 2”中消失了,并且表单没有提交.另一方面,直接点击myInput的浏览按钮会正确弹出对话框并提交表单。
我对这种行为怎么可能发生感到非常困惑!任何有关如何消除烦人的 IE 的建议将不胜感激:)
【问题讨论】:
-
控制台有错误吗?
-
您可以尝试将图像的 onclick 回调中的 .click() 更改为 .change() 即 onclick="$( '#myInput').change();"?
-
click方法总是对我不好。在研究了其他库如何解决它之后,我选择了用input元素覆盖图像的方法,设置它的不透明度值,使其对人不可见,但相对于opacity值不可见。所以用户总是会进行真正的点击。 -
所有这些聪明的 jQuery,但仍然使用内联
onclick处理程序。为什么? -
是的。 IMO,当有替代方案时,内联 JavaScript 处理程序是丑陋且不必要的。完全分开时也更容易阅读/排除故障。
标签: html jquery ajax file-upload jquery-events