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

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

[复制链接]
  • TA的每日心情
    慵懒
    昨天 23:59
  • 签到天数: 630 天

    [LV.9]以坛为家II

    30

    主题

    534

    回帖

    1405

    积分

    荣誉开发者

    积分
    1405

    荣誉开发者新人进步奖油中2周年生态建设者新人报道挑战者 lv2油中3周年喜迎中秋

    发表于 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的每日心情
    开心
    2023-2-28 23:59
  • 签到天数: 191 天

    [LV.7]常住居民III

    636

    主题

    5189

    回帖

    6071

    积分

    管理员

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

    积分
    6071

    荣誉开发者管理员油中2周年生态建设者喜迎中秋

    发表于 2022-6-8 16:28:51 | 显示全部楼层
    run-at start+document.addEventListener劫持过滤绑定函数即可
    [油猴脚本开发指南]addEventListener劫持
    https://bbs.tampermonkey.net.cn/thread-967-1-1.html
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

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

    [LV.1]初来乍到

    22

    主题

    862

    回帖

    1360

    积分

    荣誉开发者

    积分
    1360

    荣誉开发者卓越贡献油中2周年生态建设者油中3周年挑战者 lv2

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

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 23:59
  • 签到天数: 630 天

    [LV.9]以坛为家II

    30

    主题

    534

    回帖

    1405

    积分

    荣誉开发者

    积分
    1405

    荣誉开发者新人进步奖油中2周年生态建设者新人报道挑战者 lv2油中3周年喜迎中秋

    发表于 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的每日心情
    慵懒
    昨天 23:59
  • 签到天数: 630 天

    [LV.9]以坛为家II

    30

    主题

    534

    回帖

    1405

    积分

    荣誉开发者

    积分
    1405

    荣誉开发者新人进步奖油中2周年生态建设者新人报道挑战者 lv2油中3周年喜迎中秋

    发表于 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的每日心情
    开心
    2023-2-28 23:59
  • 签到天数: 191 天

    [LV.7]常住居民III

    636

    主题

    5189

    回帖

    6071

    积分

    管理员

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

    积分
    6071

    荣誉开发者管理员油中2周年生态建设者喜迎中秋

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

    呜呜呜
    具体情况我也不知道
    来个网址我调试看看?
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 23:59
  • 签到天数: 630 天

    [LV.9]以坛为家II

    30

    主题

    534

    回帖

    1405

    积分

    荣誉开发者

    积分
    1405

    荣誉开发者新人进步奖油中2周年生态建设者新人报道挑战者 lv2油中3周年喜迎中秋

    发表于 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的每日心情
    开心
    2023-2-28 23:59
  • 签到天数: 191 天

    [LV.7]常住居民III

    636

    主题

    5189

    回帖

    6071

    积分

    管理员

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

    积分
    6071

    荣誉开发者管理员油中2周年生态建设者喜迎中秋

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

    等我晚上研究一下
    还真是
    我草!
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

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

    [LV.1]初来乍到

    22

    主题

    862

    回帖

    1360

    积分

    荣誉开发者

    积分
    1360

    荣誉开发者卓越贡献油中2周年生态建设者油中3周年挑战者 lv2

    发表于 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的每日心情
    开心
    2023-2-28 23:59
  • 签到天数: 191 天

    [LV.7]常住居民III

    636

    主题

    5189

    回帖

    6071

    积分

    管理员

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

    积分
    6071

    荣誉开发者管理员油中2周年生态建设者喜迎中秋

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

    研究了一下
    不一定对
    油猴的执行机制是在with包裹了一个context
    而context是一个proxy对象
    当你访问document.queryselector
    实际是访问了context(proxy对象window).document.addeventlister
    而context.document返回的是一个get对象
    再往后就没追了
    总之一句话总结
    doucment.addeventlister会触发油猴的包裹覆盖document函数
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

    发表回复

    本版积分规则

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