【问题标题】:How to get movie info from multiple IMDB ids using an API?如何使用 API 从多个 IMDB id 获取电影信息?
【发布时间】:2015-05-25 01:42:08
【问题描述】:

我已尝试搜索此内容,但找不到任何适合我所面临问题的答案。 我最近开始玩 JQuery,所以这一定很愚蠢。

我有一个在整个页面中重复出现的 div (.movi​​e),每个都有一个特定的 id(例如#titanic)

标题、年份和运行时间的信息来自函数内部的 JSONP。因此,在每个 div 中,我调用了这样的函数并定义了要搜索的电影。

<div class="movie" id="tt0050083">
  <script>
    id = tt0050083;
    getinfo();
  </script>
  <p class="title"></p>
  <p class="year"></p>
  <p class="runtime"></p>
</div>

问题是,它只将标题、年份和运行时间附加到最后一个 div,而不是全部。它获取不同电影的所有不同信息,但所有内容都附加到最后一个 div。

function getinfo(){
        $.ajax({
            url:"http://www.myapifilms.com/imdb?format=JSONP&idIMDB="+id,
            type:'GET',
            dataType:'JSONP',
            callback: 'callback',
            success: function(data, text, xhqr){
                $('#'+id).append( '<p class="title">' + data.title + '</p>' );
                $('#'+id).append( '<p class="year">' + data.year + '</p>' );
                $('#'+id).append( '<p class="runtime">' + data.runtime + '</p>' );
            }
        });
    }

唯一有效的 id 被认为是我声明的最后一个,即使它每次运行 getinfo() 时都会搜索不同的电影,但它只是附加到错误的位置。

打赌这很愚蠢,但我已经敲了几个小时的头了 谢谢!

【问题讨论】:

  • 我相信成功函数是问题所在......如果你发布你的json输出的一部分会更好
  • 您不需要在每个 div 中添加内联 javascript。取而代之的是使用 jqueries 来循环遍历成功回调中的电影。如何做到这一点我们无法判断,因为您没有给出接收到的 json 输出的示例。
  • 看起来只有一个 id 被请求并返回。如果返回数组,data.title 等将不起作用。你必须做类似data[0].title的事情。

标签: javascript jquery html css append


【解决方案1】:

您正在向电影 api 发出多个请求。这些是异步请求,成功回调将在稍后执行(一旦 api 响应)。在做出下一个响应之前,您的代码不会等待每个响应返回。它继续前进并设置新的全局 id 并发出新请求。执行成功回调时,全局“id”变量设置为对其进行的最后一次赋值。这就是为什么它们都被附加到最后一个 div。

尝试将 id 传递给 getInfo() 而不是设置全局变量。

例如,调用 getInfo() 如下所示:

id = 123;
getInfo(id);

getInfo() 的定义如下:

function getInfo(id) { 
..... 
}

【讨论】:

  • 谢谢你的解释,andew。对我来说完全有意义,并且像魅力一样工作!
【解决方案2】:

我认为手动制作 div 有点低效。最好遍历您的 imdb id 并创建动态填充正确数据的 div。这是我刚刚创建的示例脚本。

jsfiddle demo

var ids = ["tt0068646","tt0111161","tt0108052"];

getMoviesByimdbID(ids);

function getMoviesByimdbID(ar){
    var mymovies=$('#moviecontainer');
    for(i = 0; i<ar.length; i++){
        $.ajax({
        url: 'http://www.myapifilms.com/imdb?format=JSONP&idIMDB='+ar[i],
        type: 'GET',
        dataType: 'JSONP'

        })
        .done(function(data) {
            console.log(data);
            var title= '<p class="title">'+data.title+'</p>';
            var year= '<p class="year">'+data.year+'</p>';
            var runtime= '<p class="runtime">'+data.runtime+'</p>';
            var urlPoster = '<img src="'+data.urlPoster+'">';
            mymovies.append('<div class="movie">'+title + year + runtime+urlPoster+'</div>');


        })
        .fail(function() {
            console.log("error");
        })
        .always(function() {
            console.log("complete");
        });


    }

}

【讨论】:

  • 这比我要求的要好。谢谢,卡斯帕。我注意到虽然顺序是非常随机的,但不一定是我为 id 设置的顺序。有什么方法可以让我轻松订购它们吗?再次感谢一大堆
  • 这是因为脚本对每部电影进行异步请求。所以你真的不知道你会以什么顺序收到电影。但是我可以解决它,我会调整我的答案。
  • 这是一个 jsfiddle,其中电影与数组的顺序相同。但是,它们将以(几乎)随机顺序出现。 jsfiddle.net/kasperfish/6z0nrq1w/6
猜你喜欢
  • 2015-08-13
  • 2016-06-17
  • 1970-01-01
  • 2015-05-02
  • 2017-01-01
  • 1970-01-01
  • 2021-12-31
  • 2015-02-10
  • 1970-01-01
相关资源
最近更新 更多