我正在尝试使用此代码获取网站的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只是一个空字符串。有谁知道什么了?
答案 0 :(得分:1)
我猜你试图获取与JavaScript不同的域名的HTML。这是一个跨域请求,在Javascript中是不允许的。这通常被视为脚本中的空响应。
JSONP标准描述了一种从不同域检索JSON的机制,但这需要在另一个站点上实现,并且不能与HTML一起使用。
Yahoo! Query Language(YQL)可以充当代理。雅虎!服务器将获取HTML并创建一个JSONP响应,您的脚本将收到该响应。这可以帮助您实现目标。 YQL有很多很酷的功能可以从其他网站检索内容,我建议你仔细阅读文档,看看是否有其他你可以使用的内容。
答案 1 :(得分:0)
从哪里执行javascript?您是否有同源政策违规行为?
我问,因为我在这些情况下看到过这种情况,我违反了政策,但要求仍然存在;只是响应是空的......浏览器发送请求没有任何意义,但它们都会以不同的方式处理它...
答案 2 :(得分:0)
您是否有理由自己编写此代码而不是使用jQuery等库?你会发现它更容易,他们已经找到了所有与浏览器互操作性相关的怪癖等。