我有一个带有一些数据和上传功能的表单。只有在成功接收和处理数据后,才能启动上传。为此,我进行了ajax调用,其中我:
- 发送数据,
- 检查其结果,
- 触发click()方法以打开文件对话框。
使用click()方法似乎无法打开上传窗口,因为异步调用会阻止它。只有当我设置async: false
时,它才可以工作。
我在文档和这个网站上找不到任何信息,想知道问题出在哪里,以及如何使其异步调用仍然起作用?
示例:
$.ajax({
type: "POST",
url: "/Save",
data: jsonText,
dataType: "json",
//async: false [1]
}).done(function (msg) {
$("#upload").click();
});
//$("#upload").click(); [2]
演示:http://jsfiddle.net/c2v00uxn/
注意:
- 如果取消注释[1]或[2],它会起作用(文件对话框会按预期出现)。
- 用trigger('click')替换click()不起作用。
- 用live()/on()替换click()也没有帮助。
- 文件上传控件与示例一样可见(所以不是因为控件被隐藏了)
- ajax的超时设置也无济于事。
更新
问题不在于如何进行"click"操作,而是关于如何在异步ajax调用之后进行点击操作(目前只能在非异步调用中工作)。
$("#upload").click();
的调用仍然在由用户生成事件(触发ajax的按钮点击)创建的调用堆栈中。Ajax实际上与您的问题无关——完成处理程序已成功触发。这本质上就像在控制台中运行$("#upload").click();
。 - Bryan Downing