jquey && javascript 绑定点击事件(click事件无反应,因js获取不到当前的点击项)

问题:

如果DOM元素是动态生成的,在这种情况下为该元素绑定click时间,发现点击事件无效,设置debugger,console.log也没用

解决:

juery:为目标元素的父元素,或者是整个文档绑定点击事件
javascript: 使用闭包

法一:jquery:

               //点击播放单词音频
               $(document).off("click").on("click", ".audiolins", function (event) {//如果元素是动态生成的,需要这样绑定点击事件,否则点击无效
                   event.stopPropagation();
                   var audioSrc = $(this).attr('data-src');
                   var audio = new Audio(audioSrc);
                   audio.play();
               })

法二:javascript (使用闭包)

 var audiolinsAll = document.getElementsByClassName('audiolins');
          for (var m = 0; m < audiolinsAll.length; m++) {
              audiolinsAll[m].onclick = (function (m) {//闭包
                  return function () {
                      console.log("点击 " + m)
                      var audioSrc = audiolinsAll[m].getAttribute("data-src");
                      var audioM = new Audio(audioSrc);
                      audioM.play();
                  }
              })(m);
          }

javascript 错误示范:
不使用闭包,就获取不到当前的m值
因为在javascript中for(){}不是一个作用域,所以for循环里面定义的函数读取的m是onclick绑定的匿名函数的活动对象里的m,这个匿名函数活动对象的i当然是在for循环结束后i的值,所以一直是4不会变

 var audiolinsAll = document.getElementsByClassName('audiolins');
          for (var m = 0; m < audiolinsAll.length; m++) {
              audiolinsAll[m].onclick = function (m) {
                      console.log("点击 " + m)  //如果m的取值范围是[0,1,2,3],这里的m值不是你点击的某个 audiolinsAll,而是一直为4
                      //var audioSrc = audiolinsAll[m].getAttribute("data-src");
                      var audioSrc = 'http://api.frdic.com/api/v2/speech/speakweb?langid=en&voicename=en_uk_male&txt=apple'//地址need 修改
                      var audioM = new Audio(audioSrc);
                      audioM.play();
              };
          }

闭包文章参考链接

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值