为什么我的AJAX调用刷新页面?

时间:2016-01-25 作者:Keenan Diggs

我正在尝试通过AJAX表单上传音频文件。

这是我在个人资料编辑模板中的HTML。

<form method="post" id="my_upload_form" action="" enctype="multipart/form-data">
  <input type="file" name="file" id="my_file_input" accept="audio/*">                                      
  <input type="submit" class="btn-submit btn-sumary" value="upload audio file" name="submit" id="my_audio_submit">                                      
  <div id="my_error_report"></div>                                  
</form>
以下是我的jQuery:

$(\'#my_upload_form\').submit(function () {

    var css = \'font:Helvetica; color:red; font-size:1.5em; padding:inherit;\';
    var html = \'<strong><em> \' + \'<p style="\' + css + \'">\' + \'*\';
    var endHtml = \'</p></em></strong>\';

    var formData = new FormData();
    var fileArray = jQuery(\'#my_file_input\').prop(\'files\');

    if(fileArray.length > 0) {
        var theTrack = fileArray[0];
        formData.append("music", theTrack);
    } else {
      jQuery(\'#my_error_report\').html( html + \'no track selected\' + endHtml );
      return false;
    }

    $.ajax({
      url: \'/wp-admin/admin-ajax.php\',
      type: \'POST\',
      // async: false,
      data: {
          action      : \'my_track_upload\',
          some_data   : formData
      },
      // dataType: \'text\'
      }).success( function( data ) {
          /* You win! */
          alert(\'ajax was called success\');
      }).fail( function( data ) {
          /* You lose, show error */
          alert(\'ajax was called failure\');
    });
    return false;  
}); 
最后是我的插件代码:

add_action(\'wp_ajax_my_track_upload\', \'my_track_upload\');
function my_track_upload()
{
  die(\'hello\');
}
问题(还有更多):为什么页面会刷新?我在jQuery“submit”事件中返回false。

************************编辑********************

我将代码改为以下代码,现在可以使用了,但我不确定问题出在哪里。

。。。。。。。。。

var theTrack = fileArray[0];
        formData.append(\'action\', \'musistic_track_upload\');
        formData.append("music", theTrack);
enter code here
。。。。。。。。。

$.ajax({
  url: \'/wp-admin/admin-ajax.php\',
  type: \'POST\',
  data: formData,
  enctype: \'multipart/form-data\',
  contentType: false,
  processData: false,
  datatype: "script",
  beforeSend: function() {
    jQuery(\'#my_error_report\').html(\'\');
  }
}).complete(function( data ) {
  jQuery(\'#my_error_report\').html( html + data.responseText + endHtml );
  jQuery(\'#my_audio_submit\').val("Upload Audio File", function() {
    jQuery(this).prop(\'disabled\', false);
  });
});

return false;

2 个回复
最合适的回答,由SO网友:Keenan Diggs 整理而成

我在AJAX查询中遗漏了一行关键的内容。如果没有此选项,调用将失败,页面将刷新。

processData: false,

SO网友:Jeffrey Ponsen

尝试使用preventDefault(), 这是一个jQuery函数,用于防止浏览器调用默认操作。

首先,您应该通过启动提交者来调用事件处理程序。您可以按如下操作:

$(\'#my_upload_form\').submit(function (event) {

捕获提交并提供事件后,应防止默认刷新浏览器:

event.preventDefault();

现在,您的代码如下所示:

$(\'#my_upload_form\').submit(function (event) {

    event.preventDefault();

    var css = \'font:Helvetica; color:red; font-size:1.5em; padding:inherit;\';
    var html = \'<strong><em> \' + \'<p style="\' + css + \'">\' + \'*\';
    var endHtml = \'</p></em></strong>\';

    var formData = new FormData();
    var fileArray = jQuery(\'#my_file_input\').prop(\'files\');

    if(fileArray.length > 0) {
        var theTrack = fileArray[0];
        formData.append("music", theTrack);
    } else {
      jQuery(\'#my_error_report\').html( html + \'no track selected\' + endHtml );
      return false;
    }

    $.ajax({
      url: \'/wp-admin/admin-ajax.php\',
      type: \'POST\',
      // async: false,
      data: {
          action      : \'my_track_upload\',
          some_data   : formData
      },
      // dataType: \'text\'
      }).success( function( data ) {
          /* You win! */
          alert(\'ajax was called success\');
      }).fail( function( data ) {
          /* You lose, show error */
          alert(\'ajax was called failure\');
    });
});
顺便说一句:始终尝试放置preventDefault() 在函数顶部,它应该在执行任何其他操作之前阻止默认操作。