使用YQL执行跨域AJAX请求时什么也得不到

时间:2013-06-26 14:42:26

标签: javascript ajax jquery cross-domain yql

我使用以下代码使用YQL执行跨域AJAX请求

function requestCrossDomain( site, callback ) {

function cbFunc(data) {
// If we have something to work with...
alert("inside call back");
if ( data.results[0] ) {
    // Strip out all script tags, for security reasons.
    // BE VERY CAREFUL. This helps, but we should do more. 
    data = data.results[0].replace(/<script[^>]*>[\s\S]*?<\/script>/gi, '');

    // If the user passed a callback, and it
    // is a function, call it, and send through the data var.
    if ( typeof callback === 'function') {
        callback(data);
    }
}
// Else, Maybe we requested a site that doesn't exist, and nothing returned.
else throw new Error('Nothing returned from getJSON.');
}   
// If no url was passed, exit.
if ( !site ) {
    alert('No site was passed.');
    return false;
}

// Take the provided url, and add it to a YQL query. Make sure you encode it!
var yql = 'http://query.yahooapis.com/v1/public/yql?q=' + encodeURIComponent('select * from html where url="' + site + '"') + '&format=xml&callback=cbFunc';

// Request that YSQL string, and run a callback function.
// Pass a defined function to prevent cache-busting.
$.getJSON( yql, cbFunc );
console.log("outside call back");

}

并按以下方式调用上述内容:
    requestCrossDomain('http://www.cnn.com', function(results) {
alert(results);
});

当我在firefox中运行上面的代码时,虽然响应(在firebug控制台中)显示回调函数(cbFunc)内部的网站内容但它没有显示任何警告。
也是{{的结果1)}第5行未在firebug控制台中打印。

任何人都可以建议我哪里出错了或者上面有什么解释吗?
顺便说一句,我已经通过了:
http://tek-insight.blogspot.in/2010/05/cross-domain-ajax-request-proxy-json.html http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-cross-domain-ajax-request-with-yql-and-jquery/ 相关stackoverflow问题中的可能解释。

1 个答案:

答案 0 :(得分:1)

$.getJSON接受“成功”响应的回调函数。但是如果错误被返回(404,500等),那么它就不会调用这个函数 您需要添加额外的功能以捕获其他响应方案:

$.getJSON( yql, cbFunc)
  .done(function() { console.log( "second success" ); })
  .fail(function(jqxhr, textStatus, error) { console.log( "error", textStatus, error ); })
  .always(function() { console.log( "complete" ); });