2010-05-13 14 views
2

這是我的測試用例。如果發佈表單,則發送500錯誤響應。如果不是,則發送表單。使用jQuery表單插件通過Ajax上傳文件時不會調用錯誤處理程序

如果文件輸入標記被註釋掉,則調用錯誤處理程序。如果文件輸入標籤存在,則不調用錯誤處理程序。我認爲這可能與jQuery需要使用iframe來處理上傳和iframe的事實有關。don't seem to respond to the error handler

編輯: 如果我添加iframe: true傳遞給ajaxSubmit強制使用一個iframe的選擇,非文件上傳的情況下停止工作也,所以它肯定具有與iframe來辦。我正在使用jQuery Form Plugin

<?php 
    if($_SERVER['REQUEST_METHOD'] == 'POST') { 
     header('HTTP/1.1 500 Internal Server Error'); 
     die; 
    } else {?> 
    <html><head> 
     <script type='text/javascript' 
      src='http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js?ver=2.9.2'></script> 
     <script type='text/javascript' 
      src='http://github.com/malsup/form/raw/master/jquery.form.js?v2.43'></script> 
     <script type="text/javascript"> 
      jQuery(document).ready(function() { 
       jQuery('a').click(function() {jQuery('form').ajaxSubmit({error: function(){alert('error handler called');}})}); 
      }); 
     </script> 
    </head><body> 
     <form method="POST"> 
      <input type="text" name="mytext" /> 
      <input type="file" name="myfile" /><!-- comment this element out --> 
      <input type="hidden" name="blah" value="blah" /> 
      <a>submit</a> 
     </form> 
    </body></html> 

<?php } 

有沒有什麼辦法讓錯誤處理程序在這兩種情況下被調用?

+0

「ajaxSubmit」究竟是什麼?這是一個插件什麼的?你自己的代碼?它不在jQuery 1.4.2中。 – Pointy 2010-05-13 13:45:18

+0

對不起,我應該包含一個鏈接到問題標題中提到的插件:http://jquery.malsup。com/form/ – 2010-05-13 13:54:37

回答

1

據我所知,通過查看.ajaxSubmit代碼可以看出,在您提交到的情況下,不會嘗試檢測或處理錯誤。我懷疑這是因爲沒有辦法讓它瞭解針對的HTTP響應中從服務器返回的錯誤代碼。它確實稱之爲「成功」和「完整」插件,並且試圖使用它在中的DOM中找到的任何東西來拼湊假xhr對象。

+0

感謝您的正確方向。我分叉插件並在代碼路徑中添加了一些錯誤處理。 http://github.com/scompt/form – 2010-05-15 09:30:29

0

在我看來,你使用不正確的表格提交插件ajaxSubmit()。如果ajaxSubmit的代碼對應於http://be.twixt.us/jquery/formSubmission.php的代碼,則像{error:..}這樣的參數將被ajaxSubmit()忽略。

ajaxSubmit()使用.post的$使Ajax請求,這樣你就可以通過jQuery.ajaxSetup()定義你error回調(見http://api.jquery.com/jQuery.ajaxSetup/http://api.jquery.com/jQuery.ajax/

更新:我怎樣才能從你使用哪個插件的源代碼看到(見http://github.com/malsup/form/raw/master/jquery.form.js?v2.43 )$ .ajax(options);只會在以下if語句的其他部分使用:

if (files.length && options.iframe !== false) || options.iframe || found || multipart) { 
    if (options.closeKeepAlive) 
     $.get(options.closeKeepAlive, fileUpload); 
    else 
     fileUpload(); 
} else 
    $.ajax(options); 

所以在所有其他情況下,你不能使用error作爲ajaxSubmit()參數。因此,您可以將{closeKeepAlive: true}設置爲參數ajaxSubmit() and don't forget to set before錯誤callback by jQuery.ajaxSetup()`,如前所述。

+1

表單提交插件(http://jquery.malsup.com/form/#options-object)的文檔明確指出,允許使用標準的'.ajax'選項。此外,它在表單不包含文件上載時起作用。 – 2010-05-13 13:52:57

0

LTTP,但得到這個無需使用叉jquery.form插件工作,設置dataType選項'json'

form.ajaxSubmit({ datatype: 'json', ...

然後讓服務器返回成功微不足道的反應(這被解釋爲有效的JSON),而不是單純的200 OK響應。可以這麼簡單:

header('HTTP/1.1 200 OK'); 
echo(0);

這說服插件處理5XX錯誤響應。

相關問題