【问题标题】:Return data from webserver with ajax使用ajax从网络服务器返回数据
【发布时间】:2015-01-12 15:36:04
【问题描述】:

我使用此代码通过 ajax 上传文件。

$('form').submit(function(e) {
  e.preventDefault();
  var fd = new FormData(this);
  $.ajax({url: $(this).attr('action'),
          xhr: function() { // custom xhr (is the best)
    var xhr = new XMLHttpRequest();
    //load
    xhr.upload.addEventListener("load", function(evt) {
      $("#msg").text(evt.target.responseText);
    }, false);
    return xhr;
  },
  type: 'post',
  processData: false,
  contentType: false,
  data: fd,
  success: function(data) {
    // do something...    
  }});
});

我想在上传完成后在#msg div 中显示一条消息。该消息使用 php 在服务器端打印。通常evt.target.responseText 包含来自服务器的数据,但它包含[object XMLHttpRequestProgressEvent](它又被写入#msg)。我尝试打印evt.responseTextevt.response,但都返回[object XMLHttpRequestProgressEvent]

【问题讨论】:

  • 我不小心把标题改成了Return data from webserver with java而不是Return data from webserver with ajax,因为我很笨。谁能快速解决这个问题?

标签: php jquery ajax


【解决方案1】:

将行移至“成功”回调函数块。

AJAX 请求调用或其底层 XMLHttpRequestObject (XHR) 调用是异步执行的。 “加载”是通知调用脚本执行进度的 3 级事件。可以查询 evt 对象以用于文件上传器进度条等用例。

“成功”事件映射到readyState==4,由onreadystatechange回调函数检查。

使用原始 XHR:

xhr = new XMLHttpRequest();
xhr.open('GET', your_url, true);
xhr.onreadystatechange=function(){
  if (xhr.readyState==4){
    document.getElementById('res').innerHTML=xhr.responseText;
  } else {
    document.getElementById('res').innerHTML='loading...';
  }
}

xhr.send(null);

实际上,您可以在 XHR 调用之前显示加载文本。

跟踪文件上传进度不同:

xhr.upload.onprogress=function(e){
    if (e.lengthComputable)
       document.getElementById('res').innerHTML=Math.round(e.loaded*100/e.total)+'%';
    else document.getElementById('res').innerHTML='uploading...';
};

xhr.onload=function(e){
  //display success message
}

确保 xhr.upload 不为空。如果是,那么您的浏览器没有 3 级 AJAX 支持。

【讨论】:

  • 我在成功回调中进行了测试,但我想在“progress”事件中从服务器获取数据。
  • 让我编辑答案以反映这一点……不过,您想在加载过程中显示什么。部分结果或“加载”通知/动画?
  • 我想显示上传的剩余时间。在服务器端计算网速。所以我想在每个 ajax 请求中获得网速
  • 你应该提到它是用于文件上传的;因为上传进度的处理不同。让我再次更新答案...
  • 使用经过的时间和进度百分比来计算,而不是测量网络速度。速度在数学上被抵消了。让上传者先运行一段时间以收集更准确的统计数据。它还可以防止零除法。您看到的许多上传者只会在一段时间后给您一个估计,这是有原因的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多