【问题标题】:Call Script Javascript and HTML调用脚本 Javascript 和 HTML
【发布时间】:2014-05-01 16:42:48
【问题描述】:

我需要一些帮助,因为我的回调函数 parseMovie() 只被调用一次!尽管处于一个迭代它两次的 for 循环中。我正在使用免费的 Rottentomatoes API

输出只返回一个 ID,而不是两个 ID! 并且只运行一次 parseMovie() 并返回最后一部电影的电影 ID。

有没有人解决这个脚本运行问题?

HTML 代码

<!doctype html>
<html class="no-js">
    <head>
        <title>Movies</title>
        <link rel="stylesheet" href="css/main.css">
        <script src="js/main.js"></script>
    </head>
    <body>
        <form name="input">
            <p> Actor/Actress Name: <input type="text" name="fullName"> </p>
            <p> Movie 1 <input type="text" name="movie"> </p>
            <p> Movie 2 <input type="text" name="movie"> </p>

            <p><input type="button" value="Search movies" onclick="getMovies()"></p>
            <p><textarea name="output" readonly> </textarea> </p>               


        </form>


    </body>
</html>

JAVASCRIPT

//api key
var APIKEY = "qf54ubt95fea9n7jytr5xh6h";
var movieID = new Array();
var actor = new Array();
var actorName = "Jennifer Lawrence";
var movieTitle;
var output;

function callScript(call) {
    var script = document.createElement('script');
    script.setAttribute("src", call);
    document.body.appendChild(script);
}

function getMovies() {
    for (var x=0; x<2; x++) {
        movieTitle = document.getElementsByName('movie')[x].value;
        movieTitle= cleanMovieTitle(movieTitle);
        var movieURL = "http://api.rottentomatoes.com/api/public/v1.0/movies.json?q=";
        callScript(movieURL + movieTitle + "&page_limit=10&page=1&apikey=" + APIKEY + "&callback=parseMovie");
    }
}

function cleanMovieTitle(movie) {
    movie = movie.trim();
    movie = movie.replace(/ /g, "+");
    return movie;
}

function parseMovie(data) {
    var titleData = data.movies;
    for (var t=0; t<titleData.length; t++) {
        movieID[movieID.length] = titleData[t].id;
        aCast = titleData[t].abridged_cast;
        sample = [];
        for (var person = 0; person < aCast.length; person++) {
            sample[sample.length] = aCast[person].name;
        }
        actor[actor.length] = sample;
    }

    for (var arry = 0; arry < actor.length; arry++) {
        if (actor[arry].indexOf(actorName) >= 0) {
            output = movieID[arry];
            break;
        } else {
            alert("spelling error of some sort! Error 404");
        }
    }

    document.input.output.value = output;
}

【问题讨论】:

  • 调用它的 for 循环在哪里?
  • 嘿,Willma,for 循环在 Get Movies 函数中(for x in [0,1])
  • 您发布的代码只是一堆函数。在这段代码中,它们实际上都没有被调用。如果有其他相关代码,请贴出来。
  • 好的,Html 代码包含一个运行获取电影功能的按钮,我将发布它
  • callScript() 是在哪里定义的?据我所知,这不是原生 JS 函数。

标签: javascript api callback


【解决方案1】:

您的声明var titleData = data.movies; 是错误的,因为API 返回的数据包含电影的数组

您必须遍历 data.movies 才能获取其他电影(而不仅仅是第一部电影)的数据。

查看API返回的原始JS代码和JSON数据:api.rottentomatoes.com

【讨论】:

  • 我很抱歉地说 数据是数组 并且那部分代码运行良好.. 我确实遍历了数据电影.. 抱歉 Fabian 这不是问题,但感谢您关注细节
【解决方案2】:

让我觉得奇怪的三件事可能会导致问题。

对数组使用 for...in 被认为是不好的做法,尤其是当存在原生 forEach 方法和 polyfill for ie8-

cleanMovieTitle 没有做任何事情,因为它没有返回值。如果您向它传递一个数组或对象,它将通过引用传递并且它会被更改,但这被认为是不好的做法,因为它不起作用的确切原因。您正在传递一个值,该函数在函数的范围内修改该值,然后对它不做任何事情。您需要返回字符串并设置movieTitle = cleanMovieTitle(movieTitle); 因此,API 可能没有返回其中一个标题,因为它还没有被清理。见Passing by Reference or by Value

回调可能在完成运行之前再次被调用。不确定这一点,但您可以通过使用console.logs 填充循环来检查是否是这种情况。


编辑

所以我刚刚在此页面上运行了您的脚本,但在 document.input.output.value = output; 上出现错误正如预期的那样,当我删除此行时,parseMovies 运行了两次。 document.input 是什么?

【讨论】:

  • 威尔玛!谢谢你的想法,因为我可以与前两个联系起来。(我学过 java、python 编程)所以我会解决这两个问题。让你知道它是如何反应的
  • Willma,你的帖子听起来很有希望!在我解决之前!该行指的是从 HTML 中获取文档对象,然后在名为 input 的对象中获取表单名称,由代码
    表示,并以名为 output 的对象结束,该对象是输入表单中的 textarea 对象文档正文对象。我认为使用 document.appendBody 中的文档的顺序会搞砸代码!
  • 哇,TIL。我更新了 HTML 以反映该结构,并且一切都按我的预期工作。
猜你喜欢
  • 2016-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多