jQuery 打开文件对话框在 Chrome 和 IE 中多次打开
Posted
技术标签:
【中文标题】jQuery 打开文件对话框在 Chrome 和 IE 中多次打开【英文标题】:jQuery open file dialog opens multiple times in Chrome and IE 【发布时间】:2020-01-14 18:03:17 【问题描述】:我正在使用 Django 创建一个网站来上传照片,遵循blog post。我一直在 Firefox 中进行开发,并且运行良好。我刚刚在 Chrome 和 Internet Explorer 中尝试过,它们都在选择文件后重新打开打开文件对话框。 IE 实际上在第一次之后开始上传(在重新打开的对话框后面)。 Chrome 在第二次选择之前不会开始上传,如果第一次选择关闭或取消,它将重新打开对话框。
我浏览了 SO 上的相关帖子,但似乎找不到任何对我有意义的内容。鉴于下面的代码,为什么对话框会打开两次?为什么它在 Firefox 中的行为会有所不同?
images_upload.html:
% extends "base_generic.html" %
% load staticfiles %
% block content %
<form method="post" enctype="multipart/form-data">
% csrf_token %
<!-- formE.as_p -->
</form>
% block javascript %
<script src="% static 'js/jquery-3.1.1.min.js' %"></script>
<script src="% static 'js/bootstrap.min.js' %"></script>
<script src="% static 'js/jquery-file-upload/vendor/jquery.ui.widget.js' %"></script>
<script src="% static 'js/jquery-file-upload/jquery.iframe-transport.js' %"></script>
<script src="% static 'js/jquery-file-upload/jquery.fileupload.js' %"></script>
<script src="% static 'photos/js/images-upload.js' %"></script>
% endblock %
% block image_content %
<div style="margin-bottom: 20px;">
<button type="button" class="btn btn-primary js-upload-photos">
<span class="glyphicon glyphicon-cloud-upload"></span> Upload photos
</button>
<input id="fileupload" type="file" name="image" multiple
style="display: none;"
data-url="% url 'ExifReader:image_upload' %"
data-form-data='"csrfmiddlewaretoken": " csrf_token "'>
</div>
<div class="modal" id="modal-progress" data-backdrop="static" data-keyboard="false">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">Uploading...</h4>
</div>
<div class="modal-body">
<div class="progress" style="height: 42px;">
<div class="progress-bar" role="progressbar" style="height: 42px; width: 0%;">0%</div>
</div>
<br>
<button id="done-button" type="button" class="btn btn-primary" style="display: block; margin: 0 auto;">
<span class="glyphicon glyphicon-cloud-upload"></span>
Done. View uploaded images.
</button>
</div>
</div>
</div>
</div>
% endblock %
% endblock %
images-upload.js:
$(function ()
console.log('HERE'); // Added Sep. 13 for debugging - prints twice
$(".js-upload-photos").click(function ()
$("#fileupload").click();
);
$("#fileupload").fileupload(
dataType: 'json',
sequentialUploads: false,
start: function (e)
$("#modal-progress").modal("show");
$("#done-button").css("visibility","hidden");
,
stop: function (e)
$("#modal-progress").modal("show");
$("#done-button").css("visibility","visible");
$("#done-button").click(function()
window.location = '/imagerydatasystem/image_display'
);
,
progressall: function (e, data)
var progress = parseInt(data.loaded / data.total * 100, 10);
var strProgress = progress + "%";
$(".progress-bar").css("width": strProgress);
$(".progress-bar").text(strProgress);
,
done: function (e, data)
if (data.result.is_valid)
$("#gallery tbody").prepend(
"<tr><td><a href='" + data.result.url + "'>" + data.result.name + "</a></td></tr>"
);
,
);
);
编辑:我在images-upload.js
的第 2 行添加了行console.log('HERE');
,并在控制台中打印了两次。我猜脚本以某种方式被调用了两次?
【问题讨论】:
我尝试参考该示例并发现在该示例中他们设置了sequentialUploads:false,而您已将其设置为false。出于测试目的,尝试将其设置为 true 并检查它是否解决了问题。如果问题仍然存在,您可以尝试在 IE 或 chrome 中逐步调试代码,这可以帮助您找到多次触发文件上传的原因。 感谢您的建议。我尝试将sequentialUploads
从false
更改为true
,但结果相同。现在尝试逐行调试,但是有额外的 Django 级别让我感到困惑。
我的猜测是您在页面上多次包含 images-upload.js,或多个 jqueries,或两者兼而有之。点击页面时查看您的网络标签。
网络选项卡确认脚本包含两次。根据我对 Django 的理解,可以多次包含静态文件而不会出现问题(例如 here)。这是不同的吗?我在我的问题中添加了完整的 html 模板。
【参考方案1】:
我终于找到了问题所在。在 base_generic.html
我有一个 javascript 块:% block javascript %% endblock %
尽管该块中没有任何内容,但它显然正在循环 images_upload.html
中的 javascript 块。解决方案:从base_generic.html
中删除块。
也许这很明显?显然我不太了解块标签。
【讨论】:
以上是关于jQuery 打开文件对话框在 Chrome 和 IE 中多次打开的主要内容,如果未能解决你的问题,请参考以下文章
jQuery UI 对话框中的 IFrame 有时不会在 Chrome 中加载内容,直到对话框被移动或调整大小(但适用于 FF 和 Edge)
MacOS下Chrome浏览器打开文件选择对话框快速切换路径的方法
MacOS下Chrome浏览器打开文件选择对话框快速切换路径的方法