美文网首页
DOM事件(二)

DOM事件(二)

作者: 阿龙哟 | 来源:发表于2018-10-23 09:05 被阅读0次
    image.png

    当没有阻止事件传播时


    image.png

    点击按钮会没有反应,因为在冒泡过程中,浮窗先是成为block,然后又成了none,这两段代码都在执行,只不过,效果抵消了

    在按钮处阻止事件传播,点击出现
    在doucment对象或者documentElement身上绑定监听事件,可以点击让浮窗消失,body上绑定会直接出bug,因为body只有红线一行!


    bug 1 点击图层也会消失,因此在wrapper上面阻止事件传播

    wrapper.addEventListener('click',function(e){
      e.stopPropagation()
    })
    
    

    $('.btn').on('click',function(){
      $('.popover').show()
    })
    
    $('.wrapper').on('click',function(e){
      e.stopPropagation()   
    })
    
    $(document).on('click',function(){
      $('.popover').hide()
    })
    

    注意点:jquery中 a.on('xx',false)
    这里的false 既阻止了默认事件,也阻止了事件传播
    相当于stopPropagation和preventEvent


    在document上面如果挂载多个监听器,将会造成内存负担,因此,选择不在一开始就监听document,而在浮层出现时监听一次,监听完销毁,再次点击再次监听

      $('.popover').show()
      $(document).one('click',function(){
        console.log(1)
      $('.popover').hide()
    })
    })
    

    但是这样会出现问题,

    image.png

    点击并不会出现浮窗,但是代码都执行了,因为这是同步运行,show()的同时添加了一个监听函数,监听到了点击事件然后又把他隐藏了,

    所以用一个定时器来解决这个bug

    $('.btn').on('click', function() {
      $('.popover').show()
      console.log('show') 
      setTimeout(function(){
        $(document).one('click', function() {
        console.log('hide')
        $('.popover').hide()
      })
      },0) 
    })
    

    因为settimeout是异步代码,会在同步代码执行完毕后再执行,这下就能点开了


    浏览器会时不时的偷懒,因此会导致有些bug的产生,比如每秒钟打印两次时间,当浏览器不在当前页面时,他只会每秒做一次

    jquery clone(true) 深拷贝

    相关文章

      网友评论

          本文标题:DOM事件(二)

          本文链接:https://www.haomeiwen.com/subject/mpgwzftx.html