我正在创建一个项目,当用户单击按钮时,动态插入带有按钮的整个div,并且在该div内部有一个按钮,当用户点击它时,它会执行其他操作,例如提醒某些内容例。
问题是当我在动态添加的div中按下该按钮时,没有任何反应。事件根本不会发生。
我尝试在HTML中添加该div并重试,该事件有效。所以我想这是因为div是动态添加的。
添加的div有一个类mainTaskWrapper
,按钮有一个类checkButton
。
该活动是使用下面.on()
文件末尾的script.js
附加的。
这是我的代码:
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");
});
});
答案 0 :(得分:33)
看起来不像div.mainTaskWrapper
。
来自documentation(是的,它实际上是粗体):
事件处理程序仅绑定到当前选定的元素;在代码调用
.on()
时,它们必须存在于页面上。要确保元素存在且可以选择,请在文档就绪处理程序内对元素中的元素执行事件绑定。页面上的HTML标记。[...]
通过选择在附加委托事件处理程序时保证存在的元素,您可以使用委派事件来避免频繁附加和删除事件处理程序。
您可能希望将其绑定到#tasksWrapper
:
$("#tasksWrapper").on('click', '.checkButton' , function(){
alert("test text");
});
答案 1 :(得分:3)
您需要使用on
(作为参数)指定选择器,使其行为与旧的delegate
方法相同。如果您不这样做,则事件将仅链接到当前与div.mainTaskWrapper
匹配的元素(尚不存在)。您需要在添加新元素后重新分配事件,或者将事件添加到已存在的元素(如#tasksWrapper
或文档本身)。
请参阅this page上的“直接和委派活动”。
答案 2 :(得分:3)
我知道这是一个很老的帖子,但对于遇到的其他人来说可能会有用......
你可以尝试:
jQuery('body')on.('DOMNodeInserted', '#yourdynamicallyaddeddiv', function () {
//Your button click event
});
以下是一个简单示例 - https://jsfiddle.net/8b0e2auu/