在做项目的过程中,有一个需求,点击按钮,动态添加一行,然后点击删除按钮删除这一行,我首先想到的是就直接绑定点击事件,进行操作既可以了。但是,问题来了,点击删除按钮不起作用,后来发现是因为动态添加的,所以用传统的绑定方式就不起作用了。
案例截图
// 点击加号添加一行条件 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