【问题标题】:Jquery asynchronous form submission in RailsRails 中的 Jquery 异步表单提交
【发布时间】:2013-05-01 08:02:21
【问题描述】:

我正在尝试使用异步提交表单来上传图片,这是我的 Rails HTML:

<%= form_for(:image, :url => {:controller=> 'questions',:action => 'upload_Qimage'}, :html => {:id=>'qimage_upload'}) do |f| %>
<%= f.file_field :image, :onchange => " return uploadImage() ; "  %>
<%= f.hidden_field :id , :value => Digest::MD5.hexdigest((current_user.id + Time.now.to_i).to_s )[0,7] %>
<% end %>

这是我的js函数uploadImage():

function uploadImage ()
    {
       $('#qimage_upload').submit() ; 
    $('#qimage_upload').submit( function() {  
                    return false ;   
       }

忽略提交函数中的ajax代码,即使注释掉我也无法获得第二个警报。我现在整天都在做这件事,不知道有什么问题。

更新:请注意上面代码中的更新,使用没有回调的简单 submit() 可以工作,但它不符合我的目的,因为它尝试为操作呈现视图。这是 jQuery 版本的问题吗?

第二次更新

这就是我的控制器动作的样子:

def upload_Qimage

       @image = Image.new(params[:image])
       @image.save

   end

无论我尝试使用 jQuery 和 html 做什么,它仍然会尝试渲染视图。该文件与当前更新的 js 一起保存,但是当我不希望它执行任何操作或者只是返回一些数据(不是部分渲染,只是数据)时,它仍然会尝试渲染视图

【问题讨论】:

  • 你试过 :remote => true in form_for 标签吗?
  • 是的,什么都不做。我的问题是提交功能中的警报。它应该触发,不管里面还有什么。
  • submit 事件将在您提交表单时被调用。但是在您的表单中没有提交。

标签: javascript jquery ruby-on-rails file-upload asynchronous


【解决方案1】:

无论 AJAX 发生了什么,您都想触发警报?

http://api.jquery.com/jQuery.ajax/#jqXHR

jqXHR.always(function(data|jqXHR, textStatus, jqXHR|errorThrown) { });

这将在任何情况下触发,无论是成功还是 AJAX 调用失败。

您还缺少捕获事件并阻止它进一步执行。看一下events(这对 vanilla JavaSCript 也有效)。

$('#qimage_upload').submit() ; //This triggers and submitts the form  
$('#qimage_upload').submit( function() {  //therefore, you will never reach this when the new page has been loaded
    ... }

因此,阻止事件发生

$('#qimage_upload').submit(function(event){
event.preventDefault();

....

return false;
});

我知道return false 就足够了,但这是处理它的正确方法。

【讨论】:

  • 请注意上面的更新,警报用于调试。似乎问题在于用 submit 描述回调函数。请提供相同的建议。
  • 我没有说清楚,我刚才用第一次提交作为调试的一部分。原始代码不会有两个 submits 。只是第二个带有回调的。我希望带有回调的提交工作。但目前只有不带回调的提交工作。我没有一起使用它们,而是在使用另一个时注释掉一个。
  • 我实际上需要在提交后停止渲染新页面,只需异步加载图像就可以了。
【解决方案2】:

了解.submit().submit(handler) 之间的区别:第一种方法提交表单,而第二种方法只是将事件处理程序绑定到事件。因此不会出现警报,因为您绑定了事件处理程序但实际上并未提交表单。尝试在 绑定处理程序后运行 $('#qimage_upload').submit()

$('#qimage_upload').submit(function() {  
    alert(1);
    $.ajax({
        // blah-blah-blah
    });
    return false; 
}); 
$('#qimage_upload').submit();

【讨论】:

  • 谢谢,这让事情变得清晰起来。但我正在关注这个问题的答案:stackoverflow.com/questions/6723334/… 使用 .submit() rails 尝试为操作呈现视图。我想以异步方式静默上传图像。我该怎么做?
  • 嘿,我想我明白了。谢谢!!
  • 嘿,之后提到提交实际上并没有因为活页夹而调用提交,唯一的选择似乎是编写一个上传图像文件的 ajax 请求,这是一个凌乱的任务。在活页夹之前调用提交会使活页夹无用(检查我的第二次更新)
猜你喜欢
  • 2012-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-22
  • 2017-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多