jQuery教程

jquery中给动态生成的标签添加点击事件

本文主要是介绍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中给动态生成的标签添加点击事件的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!