编辑:这是关于同步的,ajax调用是异步的,所以它不会阻止代码的执行。
我有一个JavaScript代码,使用JQuery.ajax()上传用户提供的文件,如果成功提交表单,则会显示错误并停止提交表单。
我已经放置了alert();在所有重要的地方,要密切注意代码的流动。问题是警报没有按照我期望的方式出现,一切都搞砸了。
如果ajax调用成功,我们首先应该看到alert('1'),如果文件上传成功,我们应该看到alert('2')否则我们应该看到alert('3'),如果ajax调用失败由于某种原因,我们应该看到警报('4'),最后我们应该看到警报('5');
但实际上警报显示如下:
alert('5')
alert('4')
alert('5')
And the alert('4') shows even before alert('5') goes away(without doing anything).
我错过了什么?
文件上传但结果未在代码的成功函数中返回。
的JavaScript
var files;
$( document ).ready ( function ( ) { $ ( '#user_file' ).on ( 'change', prepareUpload ); }
function prepareUpload ( event ) { files = event.target.files; }
$( 'myform' ).submit( function ( event )
{
var gender = $ ( 'input[name=gender_group]:checked', 'myform' ).val ( );
var data = new FormData ( );
data.append ( 'userfile', files [ 0 ] );
data.append ( 'gender', gender );
data.append ( 'ajaxUpload', 'true' );
$returnvalue = false;
$.ajax ( {
method : 'POST', url : scriptUrl, data : data, cache : false, processData: false, contentType: false, dataType : 'json',
success : function ( data, textStatus, jqXHR ) {
alert ( '1' );
if ( typeof data.error === 'undefined' )
{
alert ( '2' ); $returnvalue = true;
}
else
{
alert ( '3' ); $returnvalue = false;
}
},
error : function ( xhr, ajaxOptions, thrownError ) {
alert ( '4' ); $returnvalue = false;
}
});
alert ( '5' ); return $returnvalue;
}
控制器
if ( $this->input->post ( 'gender' ) && $this->input->post ( 'ajaxUpload' ) )
{
$this->load->model ( 'My_model' );
echo json_encode ( $this->My_model>do_upload ( ) );
}
模型(My_model)
public function do_upload ( ) {
$this->load->library ( 'upload' );
$data = array ( );
// The cofiguration for the upload call is saved in a config file - config/upload.php
if ( ! $this->upload->do_upload ( ) ){
$data [ 'error' ] = 'true';
} else {
$data [ 'screen_name' ] = $screen_name;
}
return $data;
}