0

filedrag.js提供的代码开始,我实现了上传文件异步功能。

问题是通话完成后我无法检索文本。实际上,我确定返回了文本,因为一旦 POST 请求完成,它就会显示在 firebug 控制台中。问题是我的代码没有将它添加到页面中。

这是代码:

if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
    xmlhttp=new XMLHttpRequest();
} else {// code for IE6, IE5
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}

function showHint(str,action,target,url) {
    xmlhttp.open("POST",url,true);
    xmlhttp.setRequestHeader("enctype","multipart/form-data");
    var fd = new FormData;
    fd.append('filexls', str);
    xmlhttp.send(fd);

   console.log(xmlhttp.status); 
      if (xmlhttp.readyState==4 && xmlhttp.status==200) {
            $('#successup').html(xmlhttp.responseText);
      }
}

我已经做了一些测试,我认为问题出在代码的最后一部分。如果我将语句放在语句console.log(xmlhttp.status)之前if,它会返回0(请求末尾的萤火虫会返回200),而如果我将它放在if控制台中,则什么都不会显示。所以我最好的猜测是问题在于该if语句在实际请求完成之前运行,因此它返回false

4

1 回答 1

1

您需要将事件侦听器分配给xmlhttp.onreadystatechange.

在侦听器内部,您可以使用 . 检查新的 readyState xmlhttp.readyState。一个 readyState4意味着完成。然后,您可以访问以下属性:xmlhttp.statusxmlhttp.responseText。您还可以通过使用xmlhttp.getAllResponseHeaders()或类似的方式访问标题xmlhttp.getResponseHeader("Content-Type")

如果请求状态是虚假的(用 进行检查if(!xmlhttp.status)),则请求失败。否则状态是响应的 HTTP 状态代码。

你可以这样做:

xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState==4 && xmlhttp.status==200) {
                $('#successup').html(xmlhttp.responseText);
    }
}

注意:您也可以使用同步 xm​​lhttprequests,但它们会在完成之前阻塞整个 UI,所以它不是那么实用,除非在 web worker 中完成。请参阅MDN 上的文档

此外,根据http://blogs.msdn.com/b/xmlteam/archive/2006/10/23/using-the-right-version-of-msxml-in-internet-explorer.aspx,建议使用new ActiveXObject("Msxml2.XMLHTTP"). Microsoft.XMLHTTP标识符已弃用。请注意,本文来自 2006 年!

“Microsoft”命名空间实际上更旧,并且仅在 MSXML3 中实现以提供旧版支持。不幸的是,我们在旧版本上使用了“更好”的名称,但在实例化对象时坚持使用“msxml2”命名空间。

于 2013-05-14T10:42:17.453 回答