QQ登录

只需要一步,快速开始

APP扫码登录

只需要一步,快速开始

手机号码,快捷登录

查看: 1224|回复: 0

[HTML/CSS/JS] 如何实现动态添加的元素添加点击事件

[复制链接]

等级头衔

积分成就    金币 : 2806
   泡泡 : 1516
   精华 : 6
   在线时间 : 1244 小时
   最后登录 : 2024-5-5

丰功伟绩

优秀达人突出贡献荣誉管理论坛元老

联系方式
发表于 2021-10-26 08:14:12 | 显示全部楼层 |阅读模式
       在页面开发过程中常常遇到需要动态添加元素,然后给这一元素绑定相关事件的情况,这种情况下一般需要给元素加上相关属性,然后写这些元素的事件函数即可。动态添加的元素怎么绑定事件呢?) C# e9 P  ], K  j1 n$ N* E
一、原生JavaScript
# e1 c+ y0 @: l       原生JavaScript主要有2种实现方式,第一种是在动态添加的html代码中添加oclick事件,然后传递一个唯一的参数来判断点击的是哪个,然后做相应的操作。 9 e$ Q5 g3 v% |5 |! _$ n5 y/ [
       第二种是通过事件委托的原理进行处理,事件委托将一个 事件监听器实际上绑定到整个容器,然后每个列表项被点击就可以访问,这样效率更高。
% u6 _( t$ Z$ T! X) A第一:onclick
1 ~3 T* L. x2 l; K8 A! p
  1. <body>
  2.   <button onclick="AddJob()">添加工作经历</button>
  3.   <button onclick="GetJobs()">获取全部工作</button>
  4.   <div id="joblist">
  5.     <div id="job1" class="job">
  6.       <input name="CompanyName" type="text" value="公司1" />
  7.       <button onclick="DelJob(1)">删除</button>
  8.     </div>
  9.   </div>
  10.   <script type="text/JavaScript">
  11.     //添加工作经历
  12.     function AddJob() {
  13. var timestamp = parseInt((new Date()).valueOf()); //唯一的标识
  14.       console.log(parseInt((new Date()).valueOf()));
  15.       document.getElementById("joblist").innerhtml +=
  16.         `<div id="job` + timestamp + `" class="job">
  17.            <input name="CompanyName" type="text" value="公司` + timestamp + `" />
  18.            <button onclick="DelJob(` + timestamp + `)">删除</button>
  19.          </div>`;
  20.     }
  21.     //删除工作经历
  22.     function DelJob(timestamp) {
  23.       document.getElementById("job" + timestamp).remove();
  24.     }
  25.     //获取全部工作经历
  26.     function GetJobs() {
  27. var jobs = document.getElementsByClassName("job");
  28.       var arr = [];
  29.       for (var i = 0; i < jobs.length; i++) {
  30.         var job = jobs[i];
  31.         var companyName = job.children[0].value;
  32.         arr.push(companyName);
  33.       }
  34.       console.log(arr);
  35.       alert(arr);
  36.     }
  37. </script>
  38. </body>
第二种addEventListener:
" I5 S' q5 o1 |# {8 k" ?& J
  1. document.getElementById('joblist').addEventListener('click', function (ev) {
  2.     var target = ev.target || ev.srcElement;
  3.     if (target.nodeName.toLowerCase() == 'button') {
  4.       var e = document.getElementById(target.parentNode.id);
  5.       document.getElementById("joblist").removeChild(e);
  6.     }
  7. });
二、jquery实现6 T! W* L0 ?$ k1 b
       从 jQuery 1.7 开始,您应该使用on的方式,语法如下:
4 g5 d+ z8 ]* c+ l% @1 O
  1. $(staticAncestors).on(eventName, dynamicChild, function() {});
解释:
  T5 ^- F7 S' c" |6 }0 t5 s* E       这称为事件委托,其工作原理如下。该事件附加到staticAncestors应处理的元素的静态父级 ( )。每次在此元素或后代元素之一上触发事件时,都会触发此 jQuery 处理程序。然后处理程序检查触发事件的元素是否与您的选择器 ( dynamicChild)匹配。当匹配时,您的自定义处理程序函数将被执行。! H; c2 m. \4 I
       在此之前,推荐的方法是使用live():' P* r- _8 [3 l
  1. $(selector).live( eventName, function(){} );
      然而,live()在 1.7 中被弃用on(),而在 1.9 中被完全删除。" E" k7 U, S) X! b( o
  1. $(selector).live( eventName, function(){} );
      可以替换为以下on()方法:
( g, X. c: t9 ~
  1. $(document).on( eventName, selector, function(){} );
      例如,如果您的页面使用类名动态创建元素,dosomething您会将事件绑定到已经存在的父级(这是这里问题的核心,您需要绑定到存在的东西,不要绑定到动态内容),这可以(也是最简单的选项)是document. 尽管记住document可能不是最有效的选择。0 ]( H) a& j. ^. L( w8 N  G4 a2 N2 S
  1. $(document).on('mouseover mouseout', '.dosomething', function(){
  2.     // what you want to happen when mouseover and mouseout
  3.     // occurs on elements that match '.dosomething'
  4. });
      事件绑定时存在的任何父级都可以。例如
4 M$ t$ T! {* V! E0 u  o3 P' w! ]/ Q" f
  1. $('.buttons').on('click', 'button', function(){
  2.     // do something here
  3. });
      将适用于) {( `% D' \- F+ F
  1. <div>
  2.     <!-- <button>s that are generated dynamically and added here -->
  3. </div>
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|paopaomj.COM ( 渝ICP备18007172号 )

GMT+8, 2024-5-17 11:21

Powered by paopaomj X3.4 © 2016-2024 sitemap

快速回复 返回顶部 返回列表