You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Flickr API创建图片画廊时的URL参数传递问题

解决Flickr API图片画廊的几个关键问题

嘿,我刚梳理完你的代码和遇到的问题,第一次玩API踩这些坑太正常了,咱们一个个来搞定:

1. 变量顺序与API调用时机的问题

你遇到的两种URL定义错误,核心原因是变量赋值时机不对

  • 情况1:你先定义了url模板字符串,但这时候searchWordperPage这些变量还没被赋值(JS里变量声明会提升,但赋值不会),所以模板里的${searchWord}其实是undefined,Flickr API就自动用了默认参数返回结果。
  • 情况2:虽然变量顺序对了,但页面刚加载时input是空的,你直接document.getElementById('input').value拿到的是空字符串,Flickr的flickr.photos.search不允许无关键词搜索,所以就抛出了那个错误。

解决办法:不要在页面加载时就定义url,而是在用户点击搜索按钮时,再获取输入框的值、组装URL,这样才能拿到用户输入的关键词。

2. createGallery函数的遍历与数据结构错误

你的函数里有两个关键问题:

  • 你把整个data传给了createGallery,但Flickr返回的结构是data.photos.photo才是图片数组,直接传data会遍历到无关的属性。
  • Object.keys(photos)遍历得到的是数组的索引(字符串形式),不是图片对象本身,所以photo.farm自然是undefined。应该直接遍历图片数组的每一项。

3. 图片URL的模板语法错误

你写的https://farm{${photo.farm}}.staticflickr.com/{${photo.server}}/...多套了一层大括号,正确的模板字符串应该直接用${变量},不需要额外加{}。另外[mstzb]是尺寸占位符,你需要选一个具体的尺寸(比如c代表中等尺寸),或者保留占位符但语法要对。


修正后的完整代码

HTML(仅补充占位符提示)

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Flickr Gallery</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>
  <main>
    <input type="text" id="input" placeholder="输入关键词搜索">
    <button id="search">Go</button>
    <ul id="gallery"></ul>
  </main>
  <script src="script.js"></script>
</body>
</html>

JavaScript(核心修改点都在这里)

// 获取DOM元素
const input = document.getElementById('input');
const searchBtn = document.getElementById('search');
const gallery = document.getElementById('gallery');
const API_KEY = 'XXXXXXXXXXXXXX'; // 替换成你的API Key

// 创建画廊的函数
function createGallery(photos) {
  // 先清空之前的画廊内容,避免重复加载
  gallery.innerHTML = '';
  
  for (let photo of photos) {
    const imgElem = document.createElement('li');
    // 修正图片URL的模板语法,选一个具体尺寸比如'c'(中等大小)
    imgElem.innerHTML = `<img src="https://farm${photo.farm}.staticflickr.com/${photo.server}/${photo.id}_${photo.secret}_c.jpg" alt="Flickr photo">`;
    imgElem.setAttribute('img-id', photo.id);
    gallery.append(imgElem);
  }
}

// 异步获取Flickr数据的函数
async function fetchFlickrPhotos(searchWord, perPage = 50, page = 1) {
  // 点击搜索时才组装URL,确保拿到有效的关键词
  const url = `https://www.flickr.com/services/rest/?method=flickr.photos.search&api_key=${API_KEY}&text=${searchWord}&per_page=${perPage}&page=${page}&format=json&nojsoncallback=1`;
  
  try {
    const response = await fetch(url);
    const data = await response.json();
    
    if (data.stat === 'ok') {
      // 传入正确的图片数组:data.photos.photo
      createGallery(data.photos.photo);
    } else {
      console.error('API请求失败:', data.message);
    }
  } catch (error) {
    console.error('网络请求出错:', error);
  }
}

// 绑定搜索按钮的点击事件
searchBtn.addEventListener('click', () => {
  const searchWord = input.value.trim();
  if (!searchWord) {
    alert('请输入搜索关键词');
    return;
  }
  // 调用获取数据的函数
  fetchFlickrPhotos(searchWord);
});

// 可选:支持回车触发搜索
input.addEventListener('keypress', (e) => {
  if (e.key === 'Enter') {
    searchBtn.click();
  }
});

关键修改说明

  1. API调用时机:把URL组装和API请求放在按钮点击事件里,确保拿到用户输入的关键词后再发起请求,避免空关键词或未赋值变量的问题。
  2. 数据结构处理:正确获取Flickr返回的图片数组data.photos.photo,而不是整个data对象。
  3. 遍历方式修正:直接遍历图片数组的每一项,而不是用Object.keys遍历索引。
  4. 图片URL语法:去掉多余的大括号,使用正确的模板字符串语法,并指定了具体的图片尺寸。

这样修改后,应该就能正常搜索并显示图片画廊啦~

内容的提问来源于stack exchange,提问作者Marica

火山引擎 最新活动