【问题标题】:Show search results from api call显示来自 api 调用的搜索结果
【发布时间】:2018-05-10 06:59:40
【问题描述】:

我正在尝试对 API 进行两次调用。第一次调用是在页面加载时,显示 API 中评分最高的十个电视节目。现在工作正常。 现在的问题是何时应该在页面上显示搜索结果。我希望带有 id app 的 div 得到更新并显示用户在输入字段中写入的搜索结果。

我在 Javascript 部分遇到问题,这是肯定的。请帮忙 :) 第二个 API 调用无法正常工作,我试图以与第一个工作相同的方式进行操作。

// show the shows with highest ranking
fetch('https://api.tvmaze.com/shows')
    .then(blob => blob.json())
    .then(json => {
        const topTenShows = json
        .filter(show => show.rating.average) 
        .sort((a, b) => a.rating.average > b.rating.average ? -1 : 1) 
        .slice(0, 9) // tar element 0-9 i arrayen

    return topTenShows
  })
  .then(shows => {
    const app = document.getElementById('app')

    app.innerHTML = shows.map(show => `
      <div class="col-sm movie-content">
        <img src="${show.image.medium}">
        <div class="movie-info">
          <h5>${show.name}</h5>
          <span>Rating: ${show.rating.average}</span>
          <br />
          <span>Rating: ${show.genres}</span>
        </div>
      </div>

    `).join()
  })

// show the search results
function searchTvAmaze ({ target }) {
    fetch(`https://api.tvmaze.com/search/shows?q=${target.value}`)
        .then(blob => blob.json())
        .then(shows => {
            const app = document.getElementById('app')

        app.innerHTML = shows.map(show => `
          <div class="col-sm movie-content">
            <img src="${show.image.medium}">
            <div class="movie-info">
              <h5>${show.name}</h5>
              <span>Rating: ${show.rating.average}</span>
              <br />
              <span>Rating: ${show.genres}</span>
            </div>
          </div>

        `).join()
      })
  }

  const inputSearchField = document.querySelector('.inputSearchField')
  inputSearchField.addEventListener('keydown', searchTvAmaze)
<div class="col-sm-10 main-content">
    <div class="search">
        <input class="inputField inputSearchField" type="text" placeholder="Search...">
    </div>  
    <div class="container">

        <div id="app" class="row">

        </div>
    </div>

</div>

【问题讨论】:

    标签: javascript json api


    【解决方案1】:

    如果您偶然通过https 提供页面,您将无法从fetch 获得对http 端点的响应。所以,把第二个fetch的协议改成https而不是http

    API 响应的结构如下:

    [
      { score: 20, show: {
        language: "English",
        // other properties
      }},
      // other found items
    ]
    

    当你这样做时

    app.innerHTML = shows.map(show =>
    

    show 引用具有 scoreshow 属性的对象 - 它引用 show 属性本身。所以,改成:

    app.innerHTML = shows.map(({ show }) =>
    

    解构参数。

    另一个问题是找到的节目的image 属性并不总是存在 - 有时,它是null。将image HTML 行更改为类似

    ${show.image ? `<img src="${show.image.medium}">` : ''}
    

    有时,结果中也没有其他属性 - 您必须进行适当的测试。

    这是一个大部分工作版本的示例:

    // show the shows with highest ranking
    fetch('https://api.tvmaze.com/shows')
        .then(blob => blob.json())
        .then(json => {
            const topTenShows = json
            .filter(show => show.rating.average) 
            .sort((a, b) => a.rating.average > b.rating.average ? -1 : 1) 
            .slice(0, 9) // tar element 0-9 i arrayen
    
        return topTenShows
      })
      .then(shows => {
        const app = document.getElementById('app')
    
        app.innerHTML = shows.map(show => `
          <div class="col-sm movie-content">
            <img src="${show.image.medium}">
            <div class="movie-info">
              <h5>${show.name}</h5>
              <span>Rating: ${show.rating.average}</span>
              <br />
              <span>Rating: ${show.genres}</span>
            </div>
          </div>
    
        `).join()
      })
    
    // show the search results
    function searchTvAmaze ({ target }) {
        fetch(`https://api.tvmaze.com/search/shows?q=${target.value}`)
            .then(blob => blob.json())
            .then(shows => {
                const app = document.getElementById('app')
            app.innerHTML = shows.map(({ show }) => `
              <div class="col-sm movie-content">
                ${show.image ? `<img src="${show.image.medium}">` : ''}
                <div class="movie-info">
                  <h5>${show.name}</h5>
                  <span>Rating: ${show.rating.average}</span>
                  <br />
                  <span>Rating: ${show.genres}</span>
                </div>
              </div>
    
            `).join();
          })
      }
    
      const inputSearchField = document.querySelector('.inputSearchField')
      inputSearchField.addEventListener('keydown', searchTvAmaze)
    <div class="col-sm-10 main-content">
      <div class="search">
        <input class="inputField inputSearchField" type="text" placeholder="Search...">
      </div>
      <div class="container">
    
        <div id="app" class="row">
    
        </div>
      </div>
    
    </div>

    【讨论】:

    • 谢谢!它起作用了 :D 我很高兴!我很难理解 Javascript。我将更多地查看您的解决方案以了解它!但是还有一个问题,当我在浏览器中查看结果时,反引号正在显示,我可以以某种方式摆脱它吗? :)
    • 我在运行 sn-p 时没有看到反引号,您有看到它的示例输入吗?
    • 它从一开始就在那里。当我进入该页面时,我会看到结果之间的反引号。当我在输入字段中写一些东西时。
    • 您的页面必须与 sn-p 不同 - 我在运行 sn-p 时没有看到任何反引号。
    猜你喜欢
    • 2021-10-02
    • 2021-11-26
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 2022-12-17
    • 2011-04-08
    • 1970-01-01
    • 2017-05-28
    相关资源
    最近更新 更多