簡體   English   中英

如何將 onClick 函數添加到動態填充的 div?

[英]How to add an onClick function to a dynamically-filled div?

我有帶下拉菜單的引導導航欄:

<ul class="navbar-nav mr-auto">
  <li class="nav-item dropdown">
   <a class="nav-link dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria haspopup="true" aria-expanded="false">GANRES</a>
   <div class="dropdown-menu"></div>
  </li>
</ul>

我有使用 TMDb API 用流派填充它們的功能:

async function getGenres() {
    let url = "https://api.themoviedb.org/3/genre/movie/list?api_key=d80a54a0422d5fff6149c48741c8bece&language=en-US";
    let response = await fetch(url);
    let genres = await response.json();
    let navbar = document.getElementsByClassName("nav-item dropdown");
    navbar.innerHTML += `<div class="dropdown-menu">`;
    let nav = document.getElementsByClassName("dropdown-menu");
    for (let i = 0; i < genres.genres.length; i++) {
        nav[0].innerHTML += `<a class="dropdown-item" href="#">` + genres.genres[i].name + `</a>`;
    }

//This part should add separately to each element, but it does not work
//Here is error: Cannot set property 'click' of undefined at getGenres

    for (let i = 0; i < genres.genres.length; i++) {
    document.getElementsByClassName("dropdown-menu")[i].click = function () {
        getmovies("discover/movie?api_key=d80a54a0422d5fff6149c48741c8bece&language=en-us&sort_by=popularity.desc&include_adult=false&include_video=false&page=1&with_genres=" + genres.genres[i].id);
    };
};
} 

項目本身是正常創建的。 流派onClick 功能不起作用。

我試圖將這個函數作為 onload 加載到 body 中,但是沒有用

你可以很容易地做到這一點,這是一個粗略的例子。 所以只需在你的for循環中添加事件監聽器

 function generateLinks() { var container = document.getElementById("containter"); var textNode; var node; [1,2,3,4,5].forEach(function(i) { node = document.createElement("li"); node.setAttribute("id", i); textNode = document.createTextNode("Hello" + i); node.appendChild(textNode); node.addEventListener("click", function() { console.log("hello " + i) }); container.appendChild(node); }); } generateLinks();
 <div id="containter"> </div>

我刪除了 API 調用以專注於導致問題的代碼:

async function getGenres() {
  const genres = {
    genres: [{ name: "pop" }, { name: "punk" }]
  };

  const navbar = document.getElementsByClassName("nav-item dropdown");
  console.log("navbar", navbar);

  let nav = document.createElement("div");
  nav.className = "dropdown-menu";

  for (let i = 0; i < genres.genres.length; i++) {
    let a_tag = document.createElement("a");
    let link = document.createTextNode(genres.genres[i].name);
    a_tag.appendChild(link);
    a_tag.className = "dropdown-item";
    a_tag.href = "#";
    nav.appendChild(a_tag);
  }
  navbar[0].appendChild(nav);

  //This part should add separately to each element, but it does not work
  //Here is error: Cannot set property 'click' of undefined at getGenres

  const items = document.getElementsByClassName("dropdown-item");
  for (let i = 0; i < genres.genres.length; i++) {
    items[i].addEventListener("click", () => {
      alert("get movies here for name" + genres.genres[i].name);

    });
  }
}

感謝@KiaiFighter。 這是最終的代碼:

async function getGenres() {
        let url = "https://api.themoviedb.org/3/genre/movie/list?api_key=d80a54a0422d5fff6149c48741c8bece&language=en-US";
        let response = await fetch(url);
        let genres = await response.json();

        const navbar = document.getElementsByClassName("nav-item dropdown");

        let nav = document.createElement("div");
        nav.className = "dropdown-menu";

        for (let i = 0; i < genres.genres.length; i++) {
            let a_tag = document.createElement("a");
            let link = document.createTextNode(genres.genres[i].name);
            a_tag.appendChild(link);
            a_tag.className = "dropdown-item";
            a_tag.href = "#";
            nav.appendChild(a_tag);
        }
        navbar[0].appendChild(nav);
        console.log("nav", nav);

        const items = document.getElementsByClassName("dropdown-item");
        for (let i = 0; i < genres.genres.length; i++) {
            items[i].addEventListener("click", () => {
                getMovies("discover/movie?api_key=d80a54a0422d5fff6149c48741c8bece&language=en-us&sort_by=popularity.desc&include_adult=false&include_video=false&page=1&with_genres=" + genres.genres[i].id);
            });
        }

        console.log("navbar", navbar);
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM