Javascript HTTP GET html / text返回null / empty?

时间:2010-07-20 17:42:33

标签: javascript html http get xmlhttprequest

我正在尝试使用此代码获取网站的HTML:

 function catchData(req) {
   console.debug("i got a reply!");
   var returnXML = req.responseXML;
   console.debug(returnXML);
   if (!returnXML)
   {
    console.debug("html is bad");
    return;
   }
   if (speed != currentSpeed)
    moveToNewSpeed(speed);
   currentSpeed = speed;
   var error = returnXML.getElementsByTagName('message')[0].firstChild;
   if (error) {
    document.getElementById('errorMessage').innerHTML = error.nodeValue;
    document.getElementById('errorMessage').style.visibility = 'visible';
   }
   else
    document.getElementById('errorMessage').style.visibility = 'hidden';
   }

 function sendRequest(url,callback,postData) {
   console.debug(url);
   console.debug(postData);
   var req = createXMLHTTPObject();
   if (!req) return;
   var method = (postData) ? "POST" : "GET";
   console.debug(method);
   req.open(method,url,true);
   console.debug("request Opened");
   req.setRequestHeader('User-Agent','XMLHTTP/1.0');
   req.setRequestHeader('User-Agent','XMLHTTP/1.0');
   if (postData)
   {
    req.setRequestHeader('Content-type','application/x-www-form-urlencoded');
    console.debug("set post data");
   }
   req.onreadystatechange = function () {
    if (req.readyState != 4)
    {  
     console.debug("bad ready state");
     return;
    }
    console.debug(req);
    console.debug("responseText:");
    console.debug(req.responseText);
    callback(req);
    console.debug("callback finished");
   }
   if (req.readyState == 4) return;
   req.send(postData);
  }

var XMLHttpFactories = [
 function () {return new XMLHttpRequest()},
 function () {return new ActiveXObject("Msxml2.XMLHTTP")},
 function () {return new ActiveXObject("Msxml3.XMLHTTP")},
 function () {return new ActiveXObject("Microsoft.XMLHTTP")}
];

function createXMLHTTPObject() {
 var xmlhttp = false;
 for (var i=0;i<XMLHttpFactories.length;i++) {
  try {
   xmlhttp = XMLHttpFactories[i]();
  }
  catch (e) {
   continue;
  }
  break;
 }
 return xmlhttp;
}

当我执行wireshark抓取时,我看到服务器返回html,但req.responseText只是一个空字符串。有谁知道什么了?

3 个答案:

答案 0 :(得分:1)

我猜你试图获取与JavaScript不同的域名的HTML。这是一个跨域请求,在Javascript中是不允许的。这通常被视为脚本中的空响应。

JSONP标准描述了一种从不同域检索JSON的机制,但这需要在另一个站点上实现,并且不能与HTML一起使用。

Yahoo! Query Language(YQL)可以充当代理。雅虎!服务器将获取HTML并创建一个JSONP响应,您的脚本将收到该响应。这可以帮助您实现目标。 YQL有很多很酷的功能可以从其他网站检索内容,我建议你仔细阅读文档,看看是否有其他你可以使用的内容。

答案 1 :(得分:0)

从哪里执行javascript?您是否有同源政策违规行为?

我问,因为我在这些情况下看到过这种情况,我违反了政策,但要求仍然存在;只是响应是空的......浏览器发送请求没有任何意义,但它们都会以不同的方式处理它...

答案 2 :(得分:0)

您是否有理由自己编写此代码而不是使用jQuery等库?你会发现它更容易,他们已经找到了所有与浏览器互操作性相关的怪癖等。