http://www.phpletter.com/Demo/AjaxFileUpload-Demo/のAjaxFileUploadプラグインを使用しています。
Jqgridのフォーム編集ボックスからファイルをアップロードしようとしています。他のフィールドも更新する編集フォーム(Jqgridフォーム編集)でファイルのアップロードを行っているため、AjaxFileUpload関数の呼び出しをJqgridのbeforeSubmitイベントにリンクしています。これにより、他のフォームデータが送信される前に、AjaxFileUploadからJqgridに応答を返すことができます。そのため、ファイルのアップロードでエラーが発生した場合、Jqgridにエラーを返すことができますが、フォームは送信されません。(フォームは、ファイルのアップロードが成功した場合にのみ送信されます。)
ただし、上記が機能するためには、AjaxFileUploadがデフォルトのように非同期ではなく同期的に機能する必要があります。async:falseを設定しましたが、それでも非同期で動作しているようです。Firebugでsuccess関数とerror関数にブレークポイントを追加すると(ファイルのアップロードが完了するまで実行が数秒間一時停止されるように)、すべてが期待どおりに100%機能するためです。ただし、ブレークポイントを削除して実行がリアルタイムで行われるようにした瞬間、成功関数またはエラー関数によって返される応答はまだ定義されていません。
AjaxFileUploadを同期的に動作させるにはどうすればよいですか?以下の私のコードの抜粋:
function ajaxFileUpload(formid)
{
var uploadresponse = [false, "by default"];
$.ajaxFileUpload(
{
url:'EditData.aspx?MyIdentifier=' + $("#MyIdentifier").val(),
secureuri:false,
fileElementId:'filename',
dataType: 'JSON',
data: {id: formid},
async:false,
success: function (dataIn, status)
{
var errorResponse = $.parseJSON(dataIn);
if((errorResponse != null)&&(typeof(errorResponse.error) != 'undefined'))
{
if(errorResponse.error != '')
{
uploadresponse = [false, errorResponse.explanation];
}
}
else
{
uploadresponse = [true, "Successfully uploaded file"];
}
},
error: function (datain, status, e)
{
uploadresponse = [false, e];
}
}
);
return uploadresponse;
}
(上記のコードでは、ブレークポイントを設定しない場合、uploadresponseの応答は常に[false、 "デフォルト"]ですが、ブレークポイントを設定すると、uploadresponseは成功関数とエラー関数に従って正しく設定されます。)