[英]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.