Javascript 在提交表单之前生成上载url

Javascript 在提交表单之前生成上载url,javascript,jquery,python,google-app-engine,blobstore,Javascript,Jquery,Python,Google App Engine,Blobstore,我试图通过在文件上传之前而不是在表单呈现时延迟它们的生成来解析过期的上传URL。我发现的一个解决方案是在表单提交或按钮单击事件中执行此操作,如: $('#btn-upload').click(function(event){ event.preventDefault(); var uploadUrl = ''; $.get( "/generate_upload_url", function(data) { uploadUrl = data; }); $('#my-

我试图通过在文件上传之前而不是在表单呈现时延迟它们的生成来解析过期的上传URL。我发现的一个解决方案是在表单提交或按钮单击事件中执行此操作,如:

$('#btn-upload').click(function(event){
  event.preventDefault();

  var uploadUrl = '';
  $.get( "/generate_upload_url", function(data) {
    uploadUrl = data;
  });

  $('#my-form').attr('action', uploadUrl);
});
class GenerateUploadUrlHandler(BaseHandler):
    def get(self):
        upload_url = blobstore.create_upload_url('/upload')
        self.response.headers['Content-Type'] = 'text/plain'
        self.response.out.write(upload_url)
在服务器端,我有一个处理程序,可以生成上传URL,如下所示:

$('#btn-upload').click(function(event){
  event.preventDefault();

  var uploadUrl = '';
  $.get( "/generate_upload_url", function(data) {
    uploadUrl = data;
  });

  $('#my-form').attr('action', uploadUrl);
});
class GenerateUploadUrlHandler(BaseHandler):
    def get(self):
        upload_url = blobstore.create_upload_url('/upload')
        self.response.headers['Content-Type'] = 'text/plain'
        self.response.out.write(upload_url)
我希望当我点击按钮生成新的上传url并在那里发出POST请求时,但是发生的情况是表单的操作被延迟填充,并且POST请求被发送到错误的url。我怀疑这可能是因为我正在执行异步GET请求,而我的表单是同时提交的,但我不太确定,因为我在这里看到了类似的示例:

有两件事需要尝试:

1) 把你的
$('#我的表单').attr('action',uploadUrl)$.get()成功回调中的code>


2) 如果这不起作用,请从
$.get()
切换到
$.ajax()
,并将
async
设置为false。

我通过将
$.get()
更改为
$.ajax({async:false})
解决了这个问题,所以我想我不应该通过异步请求来实现它

我真的不喜欢在使用ajax时将async设置为false。如果服务器没有响应,它可能会完全杀死您的页面

您可以尝试将事件处理程序绑定到表单提交事件,而不是按钮单击事件。并在ajax调用的成功事件中设置表单的action属性,然后触发表单的submit事件

$('#my-form').submit(function(event){
  event.preventDefault();

  var uploadUrl = '';
  $.get( "/generate_upload_url", function(data) {
    uploadUrl = data;
    $('#my-form').attr('action', uploadUrl);
    $('#my-form').trigger("submit");
  });


});

我看到您正在使用
event.preventDefault()单击提交按钮时,它将阻止您的表单被提交。是否确实调用了click事件?是的,需要使用
preventDefault()
,因为我正在通过其他地方的文件上载界面提交表单。这不是一个现实的解决方案。您确实不应该在web workers之外使用同步ajax请求。这样做可以很容易地在相当长的时间内锁定UI线程。看看这里提供的其他一些解决方案。很有意义。谢谢我回答我的问题太快了,没有看到其他答案。