jquery中给动态生成的标签添加点击事件
作者:互联网
jquery中给动态生成的标签添加点击事件
一、问题描述
在做项目的过程中,有一个需求,点击按钮,动态添加一行,然后点击删除按钮删除这一行,我首先想到的是就直接绑定点击事件,进行操作既可以了。但是,问题来了,点击删除按钮不起作用,后来发现是因为动态添加的,所以用传统的绑定方式就不起作用了。
二、解决问题
案例截图
// 点击加号添加一行条件
let contentHtml = ''
let currentHeight = 0 //当前div的高度
let sunIcon = ''
$('.add').click(function () {
sunIcon = `<i class="layui-icon layui-icon-subtraction sub"></i> `
$('.nav1').append(sunIcon)
$('.nav2').append(sunIcon)
contentHtml = `<div class="layui-form-item nav">
<span>条件一</span>
<div class="layui-inline">
<label class="layui-form-label">卡口:</label>
<div class="layui-input-inline">
<select class="layui-select" id="bayonet" name="bayonet" lay-search>
<option value="">请选择卡口</option>
<option value="">卡口A</option>
<option value="">卡口B</option>
<option value="">卡口C</option>
<option value="">卡口D</option>
<option value="">卡口E</option>
<option value="">卡口F</option>
<option value="">卡口G</option>
</select>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label special">最小出现卡口个数:</label>
<div class="layui-input-inline">
<select class="layui-select" id="bayonetNum" name="bayonetNum" lay-search>
<option value="">2</option>
<option value="">3</option>
<option value="">4</option>
<option value="">5</option>
<option value="">6</option>
</select>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">起始时间:</label>
<div class="layui-input-inline">
<input name="startTime" id="startTime" class="layui-input" placeholder="请输入起始时间" />
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">截止时间:</label>
<div class="layui-input-inline">
<input name="endTime" id="endTime" class="layui-input" placeholder="请输入截止时间" />
</div>
</div>
<i class="layui-icon layui-icon-subtraction sub"></i>
</div>`
//获取当前div高度
currentHeight = $('.detailContent').outerHeight(true)
if(currentHeight < 250) {
$('.left').append(contentHtml);
} else {
layer.msg('最多只能添加5个条件', {icon: 2})
}
layui.use(['form'], function () {
var form = layui.form;
form.render()
})
})
//这样写不起作用了,这种只针对静态资源,也就是说原本html页面存在的标签
$('sub').click(function() {
console.log('ss')
$(this).parent().remove();
})
可以通过事件委托解决这个问题
$(document).on('click', '.sub', function() {
console.log('ss')
$(this).parent().remove();
})
三、另外一些方案
不是很好用,不推荐,如果正好有比较合适的需求,可以使用,看的其他博主的博客
方法一:
<body>
<!-- 下面是用纯动态方式生成标签 -->
<div id="d2">
动态生成a标签
</div>
<div id="d3">
<input type="button" value="生成a标签" id="btn"/>
</div>
</body>
<script>
$(function() {
///点击按钮,给d2动态添加标签
$('#btn').bind('click', function() {
/* 在添加标签的同时给添加的标签绑定点击事件 */
$("<li οnclick='show()'>Hello</li>").appendTo("#d2");
});
})
function show() {
alert($(this).text());///这样打印出的是空的,没有任何东西,但是方法是会触发的(不能这样打印自己)
alert("哈哈");
}
</script>
这种方法是在动态拼接时就拼接好js原生的要触发的事件,然后把事件方法定义在script标签中。这种方法可以触发li的点击事件。但是如果要用alert($(this).text())这种打印标签自己本身信息的东西的方法,是没有任何结果显示的。这个即使是静态的标签打印自己也是不会有显示的。
方法二
<body>
<!-- 下面是用纯动态方式生成标签 -->
<div id="d2">
生成a标签
</div>
<div id="d3">
<input type="button" value="生成a标签" id="btn"/>
</div>
</body>
<script>
$(function(){
$('#btn').bind('click', function(event) {
/* 在添加标签的同时给添加的标签绑定点击事件 */
$("<li>Hello</li>").appendTo("#d2").bind('click', function() {
/* 显示标签的内容 */
alert($(this).text()); ///这种方式也可以正常打印出 hello
});
});
})
</script>
这种方式是可以解决上面问题的。虽然它用的也是bind方法,但是注意,它是先有目的标签对象然后才调用的bind方法,所以也是好用的。而且它居然可以正常打印自己的信息,非常厉害。
附上参考链接https://www.cnblogs.com/lst619247/p/8580142.html
标签:jquery,function,卡口,标签,点击,添加,click 来源: https://blog.csdn.net/qq_41880073/article/details/118400539