0

这是我的代码:

function getTitle(url) {
    var urlToGet = "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20where%20url%3D%22" + encodeURIComponent(url) + "%22%20and%20xpath%3D'%2F%2Ftitle'&format=json";
    $.ajax({
        type: "GET",
        url: urlToGet,
        contentType: "application/json; charset=utf-8",
        dataType: "jsonp",
        success: function(data) {
            var result = JSON.stringify(data);
            if(JSON.parse(result).query.results !== null) {
                return JSON.parse(result).query.results.title;
            }
        }
    });
}

它使用YQL来获取给定 url 的标题。但是,getTitle("http://www.google.com")返回undefined,因为它是一个异步过程。所以我在互联网上搜索了解决这个问题的方法,确实,我看到了很多讨论,但没有真正的解决方案。有人可以清楚地说明我该如何解决这个问题吗?(注意:我无法在服务器端做任何事情)

谢谢!

4

2 回答 2

0

最好的方法可能是将回调传递给您的getTitle方法......

function getTitle(url, callback) {
    var urlToGet = "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20where%20url%3D%22" + encodeURIComponent(url) + "%22%20and%20xpath%3D'%2F%2Ftitle'&format=json";
    $.ajax({
       type: "GET",
       url: urlToGet,
       async:false,
       contentType: "application/json; charset=utf-8",
       dataType: "jsonp",
        success: function(data) {
            var result = JSON.stringify(data);
            callback(JSON.parse(result).query.results.title);
        }
    });
}

并这样称呼它:

getTitle("http://www.google.com", function(title) {
    alert(title);
});
于 2012-09-03T05:24:22.323 回答
0

你可以这样做:

function getTitle(url) {
    var title = "";
    var urlToGet = "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20where%20url%3D%22" + encodeURIComponent(url) + "%22%20and%20xpath%3D'%2F%2Ftitle'&format=json";
    $.ajax({
        type: "GET",
        url: urlToGet,
        async:false,
        contentType: "application/json; charset=utf-8",
        dataType: "jsonp",
        success: function(data) {
            var result = JSON.stringify(data);
            if(JSON.parse(result).query.results !== null) {
                title = JSON.parse(result).query.results.title;
            }
        }
    });
  return title;
}

我已添加async:false到将在成功回调中设置的选项和标题变量。这样 getTitle 将像常规函数一样返回标题,但它会停止执行任何其他脚本(如果我没有遗漏某些内容,可能会导致界面冻结),直到请求完成。

唯一的其他选择是在成功回调中使用该标题执行您需要的操作(使用回调函数,如此处的另一个答案或直接将所需的代码放置在成功回调函数中)。嗯。但根据 jquery 文档:

跨域请求和 dataType: "jsonp" 请求不支持同步操作。

所以只有一种选择)

于 2012-09-03T05:32:24.467 回答