上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
12下一页
返回列表 发新帖

如何通过脚本移除document右键事件

[复制链接]
  • TA的每日心情
    慵懒
    8 小时前
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    1

    主题

    28

    帖子

    37

    积分

    助理工程师

    Rank: 1

    积分
    37
    发表于 2022-6-8 15:34:16 | 显示全部楼层 | 阅读模式

    本帖最后由 steven026 于 2022-6-8 15:42 编辑

    现有一个页面,通过document.addEventListener("contextmenu",fuc),绑定了一个鼠标右键事件,其中fuc是一个闭包内的函数。

    我想用油猴或者脚本猫写一个脚本,每次进入这个页面时自动移除已经绑定的右键事件

    百度查到了一个方法document.removeEventListener("contextmenu",getEventListeners(document).contextmenu[0].listener)
    但是getEventListeners这个函数只能在Chrome Dev Tool里使用,油猴使用报错

    我又想劫持document.addEventListener,结果发现油猴@grant环境中console.log(document.addEventListener)会发现不是native code,已经被劫持过了。

    想求教大佬有什么办法解决吗?

  • TA的每日心情

    2022-6-4 20:51
  • 签到天数: 32 天

    [LV.5]常住居民I

    332

    主题

    2896

    帖子

    2908

    积分

    荣誉开发者

    非物质文化遗产社会摇传承人

    Rank: 10Rank: 10Rank: 10

    积分
    2908

    猫咪币纪念章

    发表于 2022-6-8 16:28:51 | 显示全部楼层
    run-at start+document.addEventListener劫持过滤绑定函数即可
    [油猴脚本开发指南]addEventListener劫持
    https://bbs.tampermonkey.net.cn/thread-967-1-1.html
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2022-3-8 11:41
  • 签到天数: 2 天

    [LV.1]初来乍到

    10

    主题

    355

    帖子

    433

    积分

    荣誉开发者

    Rank: 10Rank: 10Rank: 10

    积分
    433

    活跃会员热心会员突出贡献三好学生猫咪币纪念章中秋纪念章国庆纪念章

    发表于 2022-6-8 21:32:57 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    8 小时前
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    1

    主题

    28

    帖子

    37

    积分

    助理工程师

    Rank: 1

    积分
    37
    发表于 2022-6-8 22:03:44 | 显示全部楼层
    李恒道 发表于 2022-6-8 16:28
    run-at start+document.addEventListener劫持过滤绑定函数即可
    [油猴脚本开发指南]addEventListener劫持
    ht ...
    1. // ==UserScript==
    2. // @name         New Userscript
    3. // @namespace    http://tampermonkey.net/
    4. // @version      0.1
    5. // @description  try to take over the world!
    6. // @author       You
    7. // @include         *
    8. // @run-at document-start
    9. // @grant        unsafeWindow
    10. // ==/UserScript==

    11. (function() {
    12.     'use strict';
    13.     console.log(document.addEventListener) //这行导致下面劫持失效
    14.     let oldadd=EventTarget.prototype.addEventListener
    15.     EventTarget.prototype.addEventListener=function (...args){
    16.         if(args[0]=="contextmenu"){
    17.             return false
    18.         }
    19.         oldadd.call(this,...args)
    20.     }
    21. })();
    复制代码

    大佬想问一下,为什么多加了一行console.log(document.addEventListener)就导致劫持失效了
    不加反而能生效?
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    8 小时前
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    1

    主题

    28

    帖子

    37

    积分

    助理工程师

    Rank: 1

    积分
    37
    发表于 2022-6-8 22:20:43 | 显示全部楼层
    cxxjackie 发表于 2022-6-8 21:32
    https://bbs.tampermonkey.net.cn/forum.php?mod=viewthread&tid=2110
    1.     document.addEventListener('contextmenu', function(e){
    2.         console.log(123)
    3.         e.stopImmediatePropagation()
    4.     }, true);
    复制代码

    谢谢,学到了,第一种方法对我也适用,之前试了e.stopPropagation()只能禁止向上对document没效果,没想到还有e.stopImmediatePropagation()能禁止同级
    回复

    使用道具 举报

  • TA的每日心情

    2022-6-4 20:51
  • 签到天数: 32 天

    [LV.5]常住居民I

    332

    主题

    2896

    帖子

    2908

    积分

    荣誉开发者

    非物质文化遗产社会摇传承人

    Rank: 10Rank: 10Rank: 10

    积分
    2908

    猫咪币纪念章

    发表于 2022-6-9 09:04:28 | 显示全部楼层
    steven026 发表于 2022-6-8 22:03
    大佬想问一下,为什么多加了一行console.log(document.addEventListener)就导致劫持失效了
    不加反而能生 ...

    呜呜呜
    具体情况我也不知道
    来个网址我调试看看?
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    8 小时前
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    1

    主题

    28

    帖子

    37

    积分

    助理工程师

    Rank: 1

    积分
    37
    发表于 2022-6-9 09:38:37 | 显示全部楼层
    李恒道 发表于 2022-6-9 09:04
    呜呜呜
    具体情况我也不知道
    来个网址我调试看看?

    html:
    1. <body>
    2. <div id="div"></div>
    3. <script>
    4.     let div=document.getElementById("div")
    5.     setTimeout(()=>{
    6.         document.addEventListener("contextmenu",function(e){
    7.             div.innerHTML+="<br>触发右键菜单事件"
    8.             e.preventDefault();},false)
    9.         div.innerHTML+="开始监听事件"
    10.     },1000)
    11. </script>
    12. </body>
    复制代码


    script:
    1. // ==UserScript==
    2. // @name         New Userscript
    3. // @namespace    http://tampermonkey.net/
    4. // @version      0.1
    5. // @description  try to take over the world!
    6. // @author       You
    7. // @include         *
    8. // @run-at       document-start
    9. // @grant        unsafeWindow
    10. // ==/UserScript==

    11. (function() {
    12.     'use strict';
    13.     console.log(document.addEventListener) //这行导致下面劫持失效
    14.     let oldadd=EventTarget.prototype.addEventListener
    15.     EventTarget.prototype.addEventListener=function (...args){
    16.         console.log(...args)
    17.         if(args[0]=="contextmenu"){
    18.             return false
    19.         }
    20.         oldadd.call(this,...args)
    21.     }
    22. })();
    复制代码

    任何页面都这样,我随便写了个html你可以试试
    console.log(document.addEventListener)不注释掉劫持就失败,注释掉劫持就成功
    回复

    使用道具 举报

  • TA的每日心情

    2022-6-4 20:51
  • 签到天数: 32 天

    [LV.5]常住居民I

    332

    主题

    2896

    帖子

    2908

    积分

    荣誉开发者

    非物质文化遗产社会摇传承人

    Rank: 10Rank: 10Rank: 10

    积分
    2908

    猫咪币纪念章

    发表于 2022-6-9 10:03:23 | 显示全部楼层

    等我晚上研究一下
    还真是
    我草!
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2022-3-8 11:41
  • 签到天数: 2 天

    [LV.1]初来乍到

    10

    主题

    355

    帖子

    433

    积分

    荣誉开发者

    Rank: 10Rank: 10Rank: 10

    积分
    433

    活跃会员热心会员突出贡献三好学生猫咪币纪念章中秋纪念章国庆纪念章

    发表于 2022-6-9 11:19:56 | 显示全部楼层

    因为你在unsafeWindow + document-start的情况下读取了document,触发了油猴的一个神奇“特性”,在这篇文下面有过讨论:https://bbs.tampermonkey.net.cn/thread-1080-1-1.html
    如果你想规避这个问题,可以在代码最前面加一句:
    1. const document = unsafeWindow.document;
    复制代码
    回复

    使用道具 举报

  • TA的每日心情

    2022-6-4 20:51
  • 签到天数: 32 天

    [LV.5]常住居民I

    332

    主题

    2896

    帖子

    2908

    积分

    荣誉开发者

    非物质文化遗产社会摇传承人

    Rank: 10Rank: 10Rank: 10

    积分
    2908

    猫咪币纪念章

    发表于 2022-6-9 23:56:05 | 显示全部楼层

    研究了一下
    不一定对
    油猴的执行机制是在with包裹了一个context
    而context是一个proxy对象
    当你访问document.queryselector
    实际是访问了context(proxy对象window).document.addeventlister
    而context.document返回的是一个get对象
    再往后就没追了
    总之一句话总结
    doucment.addeventlister会触发油猴的包裹覆盖document函数
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

    发表回复

    本版积分规则

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