在 for 循环中动态创建的按钮上的 addEventListener 问题

Posted

技术标签:

【中文标题】在 for 循环中动态创建的按钮上的 addEventListener 问题【英文标题】:addEventListener problems on dynamic created button within a for loop 【发布时间】:2018-11-16 13:27:37 【问题描述】:

我用 javascript 制作了一些添加到网站的元素。当我向按钮添加事件监听器时,只有第一个按钮起作用并运行该功能。

我以前这样做过并且工作正常,知道我在这里做错了什么吗?

我的javascript函数:

function laadProjectDetails()
	fetch("restservices/projectdetails")
	.then(response => response.json())
	.then(function(myJson) 
		for (const object of myJson) 
			var projextX = '<div class="row"><div class="cause content-box"><div class="col-md-5 col-sm-6"><div class="img-wrapper"><div class="overlay"></div><img class="img-responsive" src="assets/img/causes/img-1.jpg" ></div></div><div class="col-md-7 col-sm-6"><div class="info-block"><h4><a href="#">'+object.projectNaam+'</a></h4><p>'+ object.projectBeschrijving +'</p><div class="foundings"><div class="progress-bar-wrapper min"><div class="progress-bar-outer"><p class="values"><span class="value one">Opgehaald: XXXX</span>-<span class="value two">Doel: €'+object.totaalBedrag+'</span></p><div class="progress-bar-inner"><div class="progress-bar"><span data-percent="55"><span class="pretng">55%</span> </span></div></div></div></div></div><div class="donet_btn"><input id="'+object.projectID+'" type="submit" value="Doneer" class="btn btn-min btn-solid"></input></div></div></div></div></div>';			
			document.querySelector("#showProject").innerhtml += projextX;


			var valueVerwijder = document.querySelector("div.donet_btn input[value='Doneer']");
			valueVerwijder.addEventListener("click", doneerFunc);
			
		
		
	);


laadProjectDetails();

function doneerFunc()
	console.log("test");

【问题讨论】:

【参考方案1】:

您正在将事件侦听器添加到第一个匹配的选择器。尝试做:

var valueVerwijder = document.getElementById(object.projectID);
valueVerwijder.addEventListener("click", doneerFunc);

假设 object.projectID 有唯一的 ID

【讨论】:

感谢您抽出宝贵时间帮助我。我已经这样做了,问题是当我这样做时,我只能单击列表中最后添加的按钮。其他按钮不起作用。【参考方案2】:

来自querySelector documentation:

返回值

一个 Element 对象,表示文档中匹配指定 CSS 选择器集的第一个元素,如果没有匹配则返回 null。

您仅将事件侦听器添加到与选择器匹配的第一个按钮。相反,您可以使用元素 id:

function laadProjectDetails()
    fetch("restservices/projectdetails")
    .then(response => response.json())
    .then(function(myJson) 
        for (const object of myJson) 
            var projextX = '<div class="row"><div class="cause content-box"><div class="col-md-5 col-sm-6"><div class="img-wrapper"><div class="overlay"></div><img class="img-responsive" src="assets/img/causes/img-1.jpg" ></div></div><div class="col-md-7 col-sm-6"><div class="info-block"><h4><a href="#">'+object.projectNaam+'</a></h4><p>'+ object.projectBeschrijving +'</p><div class="foundings"><div class="progress-bar-wrapper min"><div class="progress-bar-outer"><p class="values"><span class="value one">Opgehaald: XXXX</span>-<span class="value two">Doel: €'+object.totaalBedrag+'</span></p><div class="progress-bar-inner"><div class="progress-bar"><span data-percent="55"><span class="pretng">55%</span> </span></div></div></div></div></div><div class="donet_btn"><input id="'+object.projectID+'" type="submit" value="Doneer" class="btn btn-min btn-solid"></input></div></div></div></div></div>';          
            document.querySelector("#showProject").innerHTML += projextX;


            var valueVerwijder = document.getElementById(object.projectID);
            valueVerwijder.addEventListener("click", doneerFunc);
            
        
        
    );


laadProjectDetails();

function doneerFunc()
    console.log("test");

【讨论】:

感谢您花时间帮助我。我已经这样做了,问题是当我这样做时,我只能单击列表中最后添加的按钮。其他按钮不起作用。

以上是关于在 for 循环中动态创建的按钮上的 addEventListener 问题的主要内容,如果未能解决你的问题,请参考以下文章

在 qt5 中连接动态创建的按钮

如何在swift中使用for循环以编程方式创建按钮

OnClickListener() 用于动态数量的按钮

如何使用 for 循环创建 UIImageView 动态网格?

使用 Jquery 动态创建按钮

如何在R中的For循环中创建动态变量名称