【问题标题】:How to match fetch data to images called from a different fetch?如何将提取数据与从不同提取调用的图像匹配?
【发布时间】:2019-05-01 18:22:52
【问题描述】:

希望能够点击图像并使用与点击的海报匹配的 imdbID 显示来自第二次 fetch 调用的数据。

我正在尝试将电影海报打印到页面上 - 然后电影海报将是可点击的 - 点击后它们将在 div(“信息”)中显示导演、演员和年份信息。

我不知道如何让所有图像对点击事件做出反应。 (我认为这是因为 img id,但如果我按类获取图像,我无法让代码工作)。我可以从第二次获取中获取数据,但它仅适用于第一张海报和最后一张图片中的数据。 (第一张海报也是唯一可以点击的。

这里的代码沙盒:https://codesandbox.io/s/1ojvormxn7

我可以通过控制台记录第二次调用的数据,但它与图像不匹配,我不确定如何在需要的地方打印它。

 document.getElementById("searchButton").addEventListener("click", () => {
  const inputSearch = document.getElementById("searchInput").value;
  //console.log(inputSearch);
  fetch(`https://www.omdbapi.com/?apikey=d2d93339&s=${inputSearch}`)
    .then(response => response.json())
    .then(data => {
      console.log(data);
      let posterImage = "";
      let imdb = "";
      data.Search.map(results => {
        //console.log(results.Poster);
        return (
          (posterImage += `<img id="resultPic" class="resultPic" src="${
            results.Poster
          }">`) && (imdb = results.imdbID)
        );
      });
      document.getElementById("app").innerHTML = posterImage;
      document
        .getElementById("resultPic")
        .addEventListener("click", getInfo => {
          fetch(`https://www.omdbapi.com/?apikey=d2d93339&i=${imdb}`)
            .then(response => response.json())
            .then(data => {
              console.log(data);

            });
        });
    });
});

【问题讨论】:

  • 大声笑...我的回答已被版主删除。酷。
  • 哥们刚进来就一言不发地删除了我的帖子,没有解释就离开了。
  • return ( (posterImage += &lt;img id="resultPic" class="resultPic" src="${ results.Poster }"&gt;) && (imdb = results.imdbID) );你到底想在这里做什么?因为它在我看来就像您:将图像的 HTML 添加到您正在构建的此 posterImage 字符串中。分配 imdb = results.imdbID。用 && 将这两个看似无关的操作的结果放在一个布尔表达式中。尤其是最后一点让我感到困惑。你为什么这样做?
  • 要检查的另一件事:imdb 变量。每次进行映射迭代时,您都会为其分配一个值,但您会在下一次迭代中覆盖它。所以在所有map迭代结束时,它只会有data.Search中最后一项的值。这是你的意图吗?
  • 调用 map 函数并丢弃结果也很奇怪。看看这里的描述developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…“map() 方法创建一个新数组,其结果是在调用数组中的每个元素上调用提供的函数。”使用它而不是像 forEach 或 for 这样的简单交互是没有意义的,除非您使用的是它为您构建的结果。

标签: javascript fetch-api omdbapi


【解决方案1】:

你需要做的是为每个img标签使用一个uniq id,为此,你可以像这样使用imdbID

<img id=resultPic-${results.imdbID}

这样你总是有一个uniq id,然后在渲染img标签后,你可以再次映射数据,这次为每个img标签添加点击事件,你不需要再次调用api ,你可以这样做:

data.Search.map(results => {
    document
      .getElementById(`resultPic-${results.imdbID}`)
      .addEventListener("click", getInfo => {
        console.log(results);
      });
  });

我在这里更新你的代码,正如你在控制台日志上看到的那样,一旦你点击每张海报,你就会收到该海报的数据,你可以在任何你想要的地方使用它:

https://codesandbox.io/s/p981v90nx

【讨论】:

  • 你是我的英雄! :-) 谢谢!我让这种方式变得比它需要的更复杂。
【解决方案2】:

我看到的几个问题:

  1. 您为每张图片分配了相同的 ID,因此您的 getElementById 调用永远不会像您希望的那样工作。
  2. 不确定 data.Search.map 应该返回什么。
  3. 考虑事件委派。您可以将侦听器添加到父元素并根据事件目标执行某些操作。像这样:
<div id="container">
[images are appended to this container]
</div>

var container = document.getElementById("container");
container.addEventListener("click", (e) => {
    // e.target will return the object the user clicked (e.g. the image)
    // you could perform a fetch based on some attribute you assigned to the image perhaps
})

您需要以某种方式区分图像。您还可以创建一个图像数组并在其上映射。

【讨论】:

  • 嘿,迈尔斯,我正在研究一种解决方案,将您的答案与上面的另一个答案结合起来。我会让你知道结果如何。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2019-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-11
  • 2021-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多