2012-07-23 131 views
0

我想通过jQuery Ajax提交上传多个文件。如何防止浏览器在Ajax提交后重定向到FORM操作?

一切工作正常,除了提交后,浏览器转到表单中指定的网址,即使我添加一个Return False

如果我使用$("#upload").serialize(),而不是FormData,它不会被重新定向!这里是我的CoffeeScript代码:

# Initialization code 
$("#upload").submit -> 
    ajaxUpload() 
    return false 

# Handler 
ajaxUpload = -> 
    fd = new FormData() 
    files = $("#uploadFiles")[0].files 
    $.each files, (i, file) -> 
    fd.append("file" + i, file) 
    $.ajax 
    type: $("#upload").attr("method"), 
    url: $("#upload").attr("action"), 
    data: fd, 
    # data: $("#upload").serialize(), 
    success: (data, text, xhr) -> 
     debug "Success: " + JSON.stringify(data) 
     loadEventAgain() 
    error: (xhr, status) -> 
     debug "Error: " + JSON.stringify(xhr) 
    alert "done" 
    return false 
+1

你有没有试过'e.preventDeafult();'? – 2012-07-23 11:43:37

+0

我知道JS但不是CoffeeScript,所以也许这是一个愚蠢的问题,但是那个代码的最后一行返回false?这是全部在事件处理程序或什么? – nnnnnn 2012-07-23 11:44:52

+0

是页面上唯一的东西,因为Ajax基本上会重新加载页面的一部分。对于你的要求,我有点困惑。 – 2012-07-23 11:45:12

回答

0

在事件处理函数,你应该使用e.preventDefault(); 这样可以防止默认动作是在你的情况下提交表单。

+1

但是,OP返回false,这相当于同时执行'e.preventDefault()'和'e.stopPropagation()'... – nnnnnn 2012-07-23 11:46:26

+1

除非代码在返回false之前失败,否则您的页面将刷新/加载并且您错过任何可能会返回的错误消息。返回虚假就是这样一种笨拙的接近它的方式,在这种情况下几乎总是“错误的”方法。 – Tjkoopa 2012-07-23 12:04:47

0

提交事件处理程序通常会获取传递的事件对象。执行

ev.preventDefault(); 
//and optionally 
return false; 
0

原来的代码是失败...... 我需要包括:

processData: false 
contentType: false 

防止JQuery的做一些不那么理想的法宝。