我正在尝试获取YouTube视频的标题。所以我使用jQuery来解析json。但它是异步工作的,所以答案是在页面加载后。结果是:
我该如何解决?
感谢。
<html>
<head>
<script src="http://code.jquery.com/jquery-1.8.3.min.js"></script>
<script>
var link = "http://www.youtube.com/watch?v=Ym0hZG-zNOk";
var videoID = link.substring(link.indexOf("=") + 1, link.length);
document.writeln("<a target='_blank' href='" + link + "'>" + link.bold() + "</a> (" + name(videoID) + ")<br>");
function name(value) {
var source = "http://gdata.youtube.com/feeds/api/videos/" + value + "?v=2&prettyprint=true&alt=jsonc&callback=?";
var fin;
$.getJSON(source, function(json) {
fin = json.data.title;
console.log(fin);
});
return fin;
}
</script>
</head>
<body>
</body>
</html>
答案 0 :(得分:3)
HY,
这是解决方案:)
<script type="text/javascript">
function name(value) {
var source = "http://gdata.youtube.com/feeds/api/videos/" + value + "?v=2&prettyprint=true&alt=jsonc";
$.ajax({
type: 'GET',
url: source,
contentType: "application/json",
dataType: 'json',
success: function (json) {
alert("here is the title: "+json.data.title+" .Use it how you want!");
},
error: function (e) {
alert("error");
}
});
}
$(document).ready(function() {
var link = "http://www.youtube.com/watch?v=Ym0hZG-zNOk";
var videoID = link.substring(link.indexOf("=") + 1, link.length);
name(videoID);
});
</script>
如果您想要获得数据同步,请使用以下版本:
$.ajax({
type: 'GET',
url: source,
async: false,
contentType: "application/json",
dataType: 'json',
success: function (json) {
alert("here is the title: "+json.data.title+" .Use it how you want!");
},
error: function (e) {
alert("error");
}
});
}
答案 1 :(得分:1)
getJSON
是异步的,所以当达到return fin;
时,尚未提取数据。
依赖于JSON 必须 的所有内容都在成功回调中。
答案 2 :(得分:0)
如果您愿意,还可以同步获取数据。查看jQuery.ajax() documentation async
参数。
编辑:只是想到你正在使用JSONP加载你的数据,并且不可能同步这样做。您需要使用异步回调。
答案 3 :(得分:0)
我没有玩过他们的api,但是快看看
https://developers.google.com/youtube/2.0/developers_guide_json
表示它们支持jsonp回调,因此您可以预先添加一个将数据发送到回调函数的脚本(只需将&amp; callback = yourFunction添加到url的末尾)
function prependScriptFromUrl(s){
var a=document.createElement("script");
var b=document.getElementsByTagName('head')[0];
a.src=s;
b.insertBefore(a,b.firstChild)
}