【问题标题】:Youtube API: How to grab video ID? JQuery/JsonYoutube API:如何获取视频 ID? jQuery/Json
【发布时间】:2012-07-14 15:23:18
【问题描述】:

目前正在使用以下代码从 YouTube 上的搜索中获取第一个视频,但是当调用 docready 时,未设置 ID。代码不会等待 ajax 结果返回,而是继续执行,不返回任何内容。

我用 ajax 尝试了 async:false,认为它可能会使其“等待”,但仍然没有返回任何内容。我将如何解决这个问题以便设置所有 id?

$(document).ready(function () {
    docready();
});

function docready() {
    var id1 = grabid("cat");
    var id2 = grabid("dog");
    var id3 = grabid("goldfish");
    alert(id1);
}

function grabid(keyword) {
    var url = 'http://gdata.youtube.com/feeds/api/videos?q=' + encodeURIComponent(keyword) + '&format=5&max-results=1&v=2&alt=jsonc';
    $.ajax({
        async: false,
        type: "GET",
        url: url,
        dataType: "jsonp",
        success: function (responseData, textStatus, XMLHttpRequest) {
            if (responseData.data.items) {
                var videos = responseData.data.items;
                videoid = videos[0].id;
                alert(videoid);
                return videoid;
            }
        }
    });
}

更新:我刚刚更改了上面的代码,以使我的问题更清楚一点。当代码运行时,它会按预期提示真正的“videoid”3 次。但是当它到达 alert(id1) 时,它会返回 undefined - 因此“返回 videoid”会被忽略,并且不会将其传递回变量。

更新 2 仍未解决

【问题讨论】:

  • 你能告诉我们最重要的部分——JSON编码的响应吗?
  • 我不知道为什么这会是相关的?当我在返回之前添加 alert(videoid) 时,它会这样做,所以它可以获取数据。
  • 反正......id=grabid(keyword1)什么是keyword1?该变量是在全球其他地方设置的吗?它没有提供,也不在 docready 函数的范围内。您将变量 keyword1 传递给函数,该函数在组件字符串中使用 keyword1。这是正确的变量吗?您还没有提供它,因此很难调试。你说response is not waiting,但是任何被正确调用的代码都会有足迹。你知道如何使用网络检查器吗?检查 XHR 请求以查看它是否已运行。如果没有,你知道breakpoints 是什么吗?
  • 我过早地问了,因为我认为问题的标题与您的需求一致。然而,这与 API 无关,而是与让函数传递变量有关。
  • @Ohgodwhy 你是对的。但是标题的命名是为了吸引熟悉 YouTube API 并且可能对我所面临的问题有经验的人。我已经根据您的 cmets 更新了我的代码示例。我希望它有所帮助。

标签: javascript jquery youtube youtube-api youtube-javascript-api


【解决方案1】:

首先你的 ajax 调用有问题试试这个..

 $.ajax({
     type: "GET",
     url: url,
     dataType: "jsonp",
     success: function (responseData) {
                  var videos = responseData.data.items;
                  var videoid=videos[0].id;
                   alert(videoid);
                  //pass this videoid to anyother JS function it should work
                },
     error: function (xhr, textStatus, XMLHttpRequest) {
                 alert(xhr.responseText);
                }   

 });

编辑:

更新了从 ajax 调用中获取返回的代码:

 function grabid(keyword){
   var url = 'http://gdata.youtube.com/feeds/api/videos?q='+encodeURIComponent(keyword)+'&format=5&max-results=1&v=2&alt=jsonc';
  return $.ajax({
     type: "GET",
     url: url,
     dataType: "jsonp"       
    });   

}



function getVideoId(key) {
  key.success(function(respdata) {
      var videos = respdata.data.items;
      var videoid=videos[0].id;
     alert(videoid)
   });
  }

var ids = grabid(123);
getVideoId(ids);

删除所有的加载或文档准备功能,这应该可以工作。

编辑:

你唯一能做的就是做 async:false,它会等待 ajax 调用完成并返回一个值......但是 CROSS DOMAIN 调用不是同步的,所以我可以说你不走运......你需要重新思考ajax调用的逻辑。

同样从 jQuery 1.8 开始,不推荐使用 async: false。

【讨论】:

  • 我使用与上面相同的关键字。不幸的是,我需要它返回 videoid 以便它可以在文档函数中使用,而不是将它传递给另一个(因为上面的代码已经可以做到这一点)。还有其他想法吗?
  • 再次感谢,但是当我运行它时,我得到'密钥未定义'。已添加供您查看jsfiddle.net/9wC2a
  • @user1516606 : 对不起,伙计不能从我这边复制同样的内容。我已经在 IE、chrome 和 mozilla 中测试了上面相同的代码 .. 一切都很好..
  • 啊,太棒了。我正在通过“google.load”加载 Jquery - 将其更改为 cdn 链接,它似乎已经解决了这个问题。你真是个天才,一直在努力解决这个问题。谢谢你:)
  • @user1516606 : 很高兴它对你有用.. 你可以通过勾选箭头标记来接受答案:) :)
【解决方案2】:

我已经成功使用了以下代码(警告:去掉了一堆其他代码,所以这可能不会按原样运行)

function getVideos(playlistID) {
                $.ajax({
                    type: 'GET',
                    url: "http://gdata.youtube.com/feeds/api/playlists/" + playlistID + "?v=2&alt=json",
                    crossDomain: true,
                    processData: true,
                    data: {},
                    dataType: "jsonp",
                    success: loadVideos
                });
}

function loadVideos (data) {

        if (data && data.feed && data.feed.entry) {
            var markup = '<ul>';
            $.each(data.feed.entry, function (index) {
                var url = 'http://www.youtube.com/embed/' + this.media$group.yt$videoid.$t + '?rel=0&wmode=transparent',
                    title = this.title.$t,
                    thumb = this.media$group.media$thumbnail[0].url;
                markup += "<li><a data-rel='videos' href='" + url + "' target='_blank' class='youtube' title='" + title + "'><img src='" + thumb + "' alt='" + title + "' /></a></li>";
            });
            markup += '</ul>';


    }

【讨论】:

  • 我试图避免从函数内部调用函数。该问题的目的是尝试弄清楚如何将视频 id 返回到变量中(同时等待 ajax 返回结果)。
  • 当您需要将 videoid 用于多种用途时,则不需要。
【解决方案3】:

好的,这是我尝试过的似乎有效的方法

function grabid(query) {
var yurl ='http://gdata.youtube.com/feeds/api/videos';
yurl = yurl+'?key=<GDATA API KEY>';
yurl = yurl+'&orderby=relevance';
yurl = yurl+'&start-index=1';
yurl = yurl+'&max-results=1';
yurl = yurl+'&v=2';
yurl = yurl+'&q='+encodeURI(query);

$.ajax({
    async: false,
    type: "GET",
    url: yurl,
    dataType: "xml",
    success: parseXml
});

var ytvideo = {
    ttl:title,
    vid:videoid,
    thm:thumb,
    vws:views,
    dur:duration
}
return ytvideo;
}

function parseXml(xml) {
$(xml).find("entry").each(function() {
    title = $(this).find("title").text();
    thumb = $(this).find("media\\:thumbnail, thumbnail").attr("url");
    videoid = $(this).find("yt\\:videoid, videoid").text();
    duration = $(this).find("yt\\:duration, duration").attr("seconds");
    views = $(this).find("yt\\:statistics, statistics").attr("viewCount");
});
}

【讨论】:

    【解决方案4】:

    您的问题是函数范围,您的ajax回调函数返回到什么?它不是你认为它可能在的地方。为什么不在所有函数的范围内创建一个数组并将 id 分配给它。下面的例子(未经测试)

    // Id array in scope of all functions in this script
    var id = [];
    
    $(document).ready(function () {
        docready();
    });
    
    function docready() {
        // Removed vars as all id's are in the id array. Just grab what you want
        grabid("cat");
        grabid("dog");
        grabid("goldfish");
    
        // Alert the 'cat' item in the id array
        alert(id['cat']);
    }
    
    function grabid(keyword, success_callback) {
        var url = 'http://gdata.youtube.com/feeds/api/videos?q=' + encodeURIComponent(keyword) + '&format=5&max-results=1&v=2&alt=jsonc';
        $.ajax({
        async: false,
        type: "GET",
        url: url,
        dataType: "jsonp",
        success: function (responseData, textStatus, XMLHttpRequest) {
            if (responseData.data.items) {
                var videos = responseData.data.items;
    
                // Assign the video ID for the keyword to (array)id
                id[keyword] = videos[0].id;
            }
        }
    });
    

    【讨论】:

    • 不幸的是仍然返回未定义!我有类似的想法,但不认为它会起作用,因为 alert(id['cat']);在 ajax 的“成功”之前仍然被称为方式。 Javascript 似乎只是忽略了它并继续使用该功能。几乎以为你有它,谢谢你的尝试。
    猜你喜欢
    • 2017-10-09
    • 2023-03-17
    • 2012-09-23
    • 2013-01-09
    • 2012-09-08
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    • 2020-12-03
    相关资源
    最近更新 更多