javascript - 如何为多个生成的元素设置 on.click?
问题描述
作为一个学生项目,我们正在尝试建立一个提供电影推荐的网站。生成推荐后,我们希望用户能够点击任何电影海报,以获取有关该特定电影的更多信息。.on('click') 当前选择所有不理想的结果...
就目前而言,这就是我们所拥有的:
axios.get(omdbCall + movieTitles)
.then(function(response){
let movies = response.data.results;
for (i=0; i < movies.length; i++) {
var posterPath = movies[i].poster_path;
var movieID = movies[i].id;
var movTitle = movies[i].title;
var movImg = "https://image.tmdb.org/t/p/w92";
$('#movPoster').append('<img class="posters" src=' + movImg + posterPath + '>');
}
$(".posters").on("click", function () {
console.log("I clicked a poster!");
})
})
我们还尝试更改渲染的 img 标签以包含基于电影标题或其 imdbID 的 id。我们尝试使用此选择器进行两次尝试:
$("#" + movTitle)
随着追加功能的这种变化:
$('#movPoster').append('<img id=' + movTitle + ' src=' + movImg + posterPath + '>');
我希望能够只选择一个元素,但事实并非如此。我希望我能正确和足够详细地解释。任何帮助将不胜感激。谢谢!
解决方案
您正在.on('click')
对动态生成的 html 进行事件直接处理。这行不通。因为最初加载脚本时,没有带有 class 的元素posters
。
你必须使用这样的东西
$("#not_dynamic_element").on("click", ".posters", function(){
// Code here
});
逻辑是您必须选择一个未动态加载的元素。即,一个静态元素,它是posters
类的祖先。
例如,假设您有一个带有类的 div,该类posters-container
已经存在于页面加载中。您正在将img
带有类的标签附加posters
到此 div。所以你需要点击所有img
带有 class 的标签posters
,你可以写,
$(".posters-container").on("click", ".posters", function(){
// Code here
});
希望您了解逻辑以及问题所在。
更新 - 小提琴中的逻辑问题
我知道你的小提琴有什么问题。我试图让它变得简单。所以检查你写的这段代码
axios.get(finalSearch)
.then(function(response){
// console.log(response);
let movies = response.data.Similar.Results;
// let posters = response.data.results.poster_path;
for (i=0; i < movies.length; i++){
// console.log(movies[i].Name);
var movArr = movies[i].Name;
var movStr = movArr.split(" ");
var movieTitles = movStr.join("+")
getMoviePosters(movieTitles);
}
})
.catch(function(err) {
console.log(err);
})
在这段代码中,您可以看到您getMoviePosters(movieTitles)
在 for 循环中调用该函数。您的 for 循环包含以下行,用于选择动态生成的电影海报元素。
$("#movPoster").on("click", function () {
console.log("I clicked a poster!");
})
所以我建议你在for循环之后调用这个click函数,如下所示(删除前面的代码)。还添加posters
类以单击功能。
axios.get(finalSearch).then(function(response){
// console.log(response);
let movies = response.data.Similar.Results;
// let posters = response.data.results.poster_path;
for (i=0; i < movies.length; i++){
// console.log(movies[i].Name);
var movArr = movies[i].Name;
var movStr = movArr.split(" ");
var movieTitles = movStr.join("+")
getMoviePosters(movieTitles);
}
$("#movPoster").on("click", '.posters', function () {
console.log("I clicked a poster!");
})
})
推荐阅读
- mysql - 如何在 Ubuntu OS 中远程访问 dockerised 数据库容器?
- r - R中数据框中两列之间的计算
- python - 如何在脚本中导入所有 django 模型等?
- sql - SQL Joining/merging两个事件表,对对应时间敏感
- laravel - 为什么在 Laravel 中发送电子邮件附件时给出未定义的变量?
- airflow - 使用 PyPi 包“成功”更新后 Cloud Composer Airflow webserver 502 服务器错误
- python - 重新排列周末后的移位列以具有相同的数字并遵循数字序列python
- node.js - 如何在angularv8中显示来自服务器的数据
- c++ - C++中的多元正态分布
- java - 通过使用杰克逊 API 动态发送密钥从 JSON 字符串中检索值?