V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
McContax
V2EX  ›  JavaScript

如何移除一个元素所绑定的事件

  •  
  •   McContax · 2019-05-17 19:03:12 +08:00 · 5832 次点击
    这是一个创建于 2013 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近学校要求刷网课,用的超星学习通,就是那个鼠标一旦移出播放器就自动暂停播放的平台,我用着用着把那个事件监听器移除了(通过 chrome 的审查元素里面的 event listener 直接 remove ) test 但是当我想做成一句代码方便再 console 输入的时候(document.getelementsxxxxxx.removeEventListener),点开 properties 没办法找到 onmouseout 绑定的事件 test1 本来是打算直接用 removeEventListener 移除事件然后打包分发代码给同学,毕竟不是所有人都用 chrome,像 edge 的那个就连一键移除这个选项都没有

    12 条回复    2019-05-19 08:19:57 +08:00
    dondom
        1
    dondom  
       2019-05-17 19:25:27 +08:00
    function removeEventListener(node) {
    var parent = node.parentElement
    var copy = node.cloneNode()
    copy.innerHTML = node.innerHTML
    parent.replaceChild(copy, node)
    }

    随便写了一个 性能没要求的话应该能用
    Juszoe
        2
    Juszoe  
       2019-05-17 22:46:31 +08:00
    正巧我几个月前也写了个超星的脚本,也考虑过这个问题,发现没有一个很好的解决方案,最后是监听播放器停止事件,然后进行播放。
    代码你可以看一下 https://juszoe.github.io/erya/
    Juszoe
        3
    Juszoe  
       2019-05-17 22:52:32 +08:00
    另外由于那个事件是匿名函数,removeEventListener 是删不掉它的,希望有大佬能告知如何删除匿名函数
    1010543618
        5
    1010543618  
       2019-05-17 23:15:30 +08:00
    貌似没有更好的方法了
    duan602728596
        6
    duan602728596  
       2019-05-17 23:17:18 +08:00 via iPhone
    你可以写个定时器,轮询 video.paused 状态,当 video 暂停时,通过 video.play()播放
    1010543618
        7
    1010543618  
       2019-05-17 23:18:56 +08:00   ❤️ 1
    fsdgfd
        8
    fsdgfd  
       2019-05-18 02:32:59 +08:00 via Android
    试试 pointer-events:none
    bankroft
        9
    bankroft  
       2019-05-18 09:07:57 +08:00 via Android
    McContax
        10
    McContax  
    OP
       2019-05-19 01:01:33 +08:00
    @Juszoe 是一个不错的思路,其实监听暂停这个比较现实,我尝试去用 remove event listener,由于是匿名函数每次执行都要事先展开 html 的播放器页面,让浏览器计算得出 mouseout 的监听事件,然后才能移除


    @1010543618 chrome 那个试了一下,很艰难的成功了,不过还有一个难点,在运行 get eventlistener 之前必须手动展开一次 html 相关的播放器的代码,不然的话 get eventlistener 就没办法 get 到 mouseout,关于这一点 dalao 有没有什么好的解决方法吗
    ![avatar]( )
    McContax
        11
    McContax  
    OP
       2019-05-19 01:20:45 +08:00
    @1010543618 刚刚又挖了一下,我发现我的 event listener 是勾了 ancestors all,也就是说实际上 mouseout 并不是绑定在我认为的那个元素那里,我把 ancestors all 关掉,找出了他绑定元素的位置了,这样子直接用 remove 就 OK 了,谢谢
    Juszoe
        12
    Juszoe  
       2019-05-19 08:19:57 +08:00
    @McContax #10 需要展开是因为嵌套在 iframe 里,展开一下 html 后 console 作用域自动帮你切换到那个 iframe 里,console 左上角能看见,用 window.iframe[''].document 就好了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3155 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 13:53 · PVG 21:53 · LAX 05:53 · JFK 08:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.