javascript - OnClick() 事件在我的代码中的动态按钮的 JavaScript 中不起作用
问题描述
我使用 JavaScript 在网页上的 for 循环中添加了一个动态按钮,并为每个按钮分配了一个唯一的 ID。我想为每个按钮分配 onclick() 事件侦听器,但此功能未分配给任何动态按钮。请帮我解决这个问题。谢谢你。
myfunction()
正在工作,但myfunction1()
有一些问题。我在其动态 HTML 中看不到 onclick 事件。
有JS文件。data.js 包含对象数组和其他包含访问数据的函数。
// function.js
function chargerArticles() {
var myShoppingCart = [];
var articles = document.getElementById("content");
for (var i = 0; i < catalogArray.length; i++) {
//Product div
var article = document.createElement("div");
article.setAttribute("class", "aa");
//Unique id
article.id = i + "-article";
//Product Name
var articleName = document.createElement("h4");
articleName.setAttribute("class", "aa-product-title");
var articleNameLink= document.createElement('a');
articleNameLink.setAttribute('href',"#");
articleNameLink.innerText = catalogArray[i].name;
articleName.appendChild(articleNameLink);
article.appendChild(articleName);
//Command Input Area
var zoneCmd = document.createElement("div");
var inputCmd = document.createElement("input");
//Button of add to cart
var button = document.createElement("BUTTON");
button.setAttribute("class", "Btn hvr-underline-btn");
button.innerHTML = " ADD";
//Button unique id
button.id = i + "-cmd";
//not working
button.addEventListener("click", myFunction1);
function myFunction1() {
var item = this.getAttribute("id");
var pos = item.substring(0, 1);
document.getElementById("1235").innerHTML = "Hello World";
addToCart(pos);
}
//working
document.getElementById("1234").addEventListener("click", myFunction);
function myFunction() {
document.getElementById("1234").innerHTML = "YOU CLICKED ME!";
}
zoneCmd.appendChild(button); //child 2
//zoneCmd child of article element
article.appendChild(zoneCmd);
//finally article as a child of articles
articles.appendChild(article);
}
}
function searchInCart(name) //T-Shirt
{
myShoppingCart = myCartArray;
var name1 = name;
var stop = 0;
for (var i = 0; i < myShoppingCart.length && stop == 0; i++) {
if (myShoppingCart[i].name == name1) {
stop = 1;
// console.log("Hello wooooorld!");
return true;
} else {
return false;
}
}
}
function addToCart(pos) {
if (searchInCart(catalogArray[pos].name)) {
alert("Already Exist!"); // display string message
} else {
var ident = pos + "-qte";
var quatity = document.getElementById("ident").value;
if (quatity > 0) {
var articleCmd = {}; //array of objects
articleCmd.name = catalogArray[pos].name;
articleCmd.price = catalogArray[pos].price;
articleCmd.qte = quatity;
articleCmd.priceTotal = articleCmd.price * articleCmd.qte;
myCartArray.push(articleCmd);
} else {
// alert
}
}
}
//data.js
// data.js
var catalogArray = [{
code: 100,
name: "T Shirt c100",
desc: "Lorem ipsum, or lipsum as it is sometimes known as",
price: 150,
image: "./images/img100.jpg"
},
{
code: 101,
name: "T Shirt c101",
desc: "Lorem ipsum, or lipsum as it is sometimes known as",
price: 250,
image: "./images/img101.jpg"
},
];
var myCartArray = [{
name: "T Shirt c100",
price: 150,
qte: 2,
TotalPrice: 150,
}
];
解决方案
发生此问题是因为您myfunction1
动态定义。换句话说,这个元素不是在页面的初始渲染过程中定义的。
您可以使用事件委托来修复它。方法如下:
不要在元素上定义回调,而是为具有匹配 css 类的PARENT元素的所有子元素定义它。例如:
$( ".btnContainer .btn" ).on( "click", function( event ) {
event.preventDefault();
console.log("clicked");
});
在哪里:
<div class='btnContainer'>
</div>
现在,当您将具有 (class name )的按钮btn
动态添加btnContainer
为父母将事件委托给所有具有匹配类的孩子!btn
推荐阅读
- powershell - 将管道输入直接写入管道输出
- java - 从另一个给定的日期生成一个 txt 文件,其中包含已排序的日期,以及给定的其他两个日期之间的日期
- c - 为什么 printf 函数不打印我希望它打印的列表的值?
- aws-lambda - 从 Smart Home Skill 到云服务器的请求
- linux - 选择跨发行版 DBus 实现
- react-native - 通过 WebStorm 2018.2 中的运行/调试配置运行项目的“react-native run-ios”或“react-native run-android”命令效果不佳
- css - 相邻组件css文件在反应中相互冲突
- asp.net-mvc - 类对象 - 层次结构和继承(不工作)
- python - Tkinter 按钮图像为空白
- ios - 以编程方式创建自定义 UIView 子类的对象