警告:这是非常旧版本的 Safari 和 Chrome 的兼容性代码。现代浏览器都支持 FileReader API;这是一个教程:https : //developer.mozilla.org/en-US/docs/Using_files_from_web_applications
此代码现在仅在出于某种原因需要支持 Safari 5 及更早版本或 Chrome 6 及更早版本时才有用。
一种可能性是使用SwellJS 中使用的方法:
<input type="file" multiple="multiple" />
像这样使用:
<form method="post" enctype="multipart/form-data" id="uploadform">
<input type="file" name="dragupload[]" multiple="multiple"
onchange="if (this.value) document.getElementById('uploadform').submit();" />
</form>
输入元素的样式可以设置为opacity: 0
(绝对)在接受上传的元素上。整个表单可以放在一个iframe
类似于“伪 Ajax”的行为中。上传元素可以是一个隐藏的图层,直到有东西拖到它上面。
这样的 iframe 看起来像:
<script>
<!--
var entered = 0;
-->
</script>
<body ondragenter="entered++;document.getElementById('uploadelement').style.display='block'" ondragleave="entered--;if (!entered) document.getElementById('uploadelement').style.display='none'">
<form method="post" enctype="multipart/form-data" id="uploadform">
Things can be dragged and dropped here!
<input type="file" id="uploadelement" name="dragupload[]" multiple="multiple" onchange="if (this.value) { document.getElementById('uploadform').submit(); }" style="display:none;position:absolute;top:0;left:0;right:0;bottom:0;opacity:0;" />
</form>
</body>
这应该仅在检测到 Safari 或 Chrome 时执行(因为其他浏览器不支持拖放到<input type="file" />
元素上),并且可以与drop
Firefox 3.6+的 HTML5事件结合使用。
我不知道这是否是 Gmail 使用的方法,但它当然也适用。