gpt4 book ai didi

events - jQuery .on() 事件不适用于动态添加的元素

转载 作者:行者123 更新时间:2023-12-03 21:59:50 24 4
gpt4 key购买 nike

我正在制作一个项目,当用户单击按钮时,会动态插入带有按钮的整个 div,并且该 div 内有一个按钮,当用户单击它时,它会执行其他操作,例如发出警报例子。

问题是当我按下动态添加的 div 中的按钮时,没有任何反应。该事件根本不会触发。

我尝试在 HTML 中添加该 div,然后重试,该事件成功了。所以我猜这是因为div是动态添加的。

添加的 div 有一个类 mainTaskWrapper,按钮有一个类 checkButton。该事件使用下面 script.js 文件末尾的 .on() 附加。

这是我的代码:

helper_main_task.js :(这是添加 div 的对象,您不必阅读它,因为我认为这都是关于动态添加该 div 的,但我会把它放在如果您需要的话)

var MainUtil = {
tasksArr : [],
catArr : ["all"],
add : function(){

var MTLabel = $("#mainTaskInput").val(), //task label
MTCategory = $("#mainCatInput").val(), //task category
MTPriority = $("#prioritySlider").slider("value"), //task priority
MTContents = $('<div class="wholeTask">\
<div class="mainTaskWrapper clearfix">\
<div class="mainMarker"></div>\
<label class="mainTaskLabel"></label>\
<div class="holder"></div>\
<div class="subTrigger"></div>\
<div class="checkButton"></div>\
<div class="optTrigger"></div>\
<div class="addSubButton"></div>\
<div class="mainOptions">\
<ul>\
<li id="mainInfo">Details</li>\
<li id="mainEdit">Edit</li>\
<li id="mainDelete">Delete</li>\
</ul>\
</div>\
</div>\
</div>');


this.tasksArr.push(MTLabel);

//setting label
MTContents.find(".mainTaskLabel").text(MTLabel);

//setting category
if(MTCategory == ""){
MTCategory = "uncategorized";
}
MTContents.attr('data-cat', MTCategory);
if(this.catArr.indexOf(MTCategory) == -1){
this.catArr.push(MTCategory);
$("#categories ul").append("<li>" + MTCategory +"</li>");
}
$("#mainCatInput").autocomplete("option", "source",this.catArr);

//setting priority marker color
if(MTPriority == 2){
MTContents.find(".mainMarker").css("background-color", "red");
} else if(MTPriority == 1){
MTContents.find(".mainMarker").css("background-color", "black");
} else if(MTPriority == 0){
MTContents.find(".mainMarker").css("background-color", "blue");
}

MTContents.hide();
$("#tasksWrapper").prepend(MTContents);
MTContents.slideDown(100);

$("#tasksWrapper").sortable({
axis: "y",
scroll: "true",
scrollSpeed : 10,
scrollSensitivity: 10,
handle: $(".holder")
});

}
};

script.js :(.on() 函数位于底部的文件)

$(function(){
$("#addMain, #mainCatInput").on('click keypress', function(evt){
if(evt.type == "click" || evt.type =="keypress"){
if((evt.type =="click" && evt.target.id == "addMain") ||
(evt.which == 13 && evt.target.id=="mainCatInput")){
MainUtil.add();
}
}
});

//Here's the event i'm talking about :
$("div.mainTaskWrapper").on('click', '.checkButton' , function(){
alert("test text");
});
});

最佳答案

看起来 div.mainTaskWrapper 不存在。

来自documentation (是的,它实际上是粗体):

Event handlers are bound only to the currently selected elements; they must exist on the page at the time your code makes the call to .on(). To ensure the elements are present and can be selected, perform event binding inside a document ready handler for elements that are in the HTML markup on the page.

[...]

By picking an element that is guaranteed to be present at the time the delegated event handler is attached, you can use delegated events to avoid the need to frequently attach and remove event handlers.

您可能想将其绑定(bind)到 #tasksWrapper:

$("#tasksWrapper").on('click', '.checkButton' , function(){
alert("test text");
});

关于events - jQuery .on() 事件不适用于动态添加的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12207033/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com