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

[油猴脚本开发指南]油猴的本质以及document的处理(五)

[复制链接]
  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5992

    回帖

    6780

    积分

    管理员

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

    积分
    6780

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

    发表于 2022-6-10 23:48:27 | 显示全部楼层 | 阅读模式

    Cxxjackie点评

    @grant unsafeWindow并不是一句很方便的声明,他潜在造成的问题可能比你想象的多,在这一模式下很多原生的函数、对象会被油猴接管,比如setTimeout/clearTimeout、setInterval/clearInterval,在某些情况下可能造成意料之外的错误,解决方法通常是在前面加一个“unsafeWindow.”以确保得到的是原生引用。关于这个document的问题,在unsafeWindow + document-start的前提下,如果你想避免麻烦,最好在代码前加上这句:

    const document = unsafeWindow.document;

    大总结

    我们在脚本的初始化的过程中
    对window进行了代理,叫做context
    而context存在一个get函数
    我们油猴脚本的函数的this就是这个代理过得window
    而unsafewindow而是没有经过代理的window
    代理的window会做各式各样的操作
    例如如我们在函数内访问document
    实际是访问的代理window的document
    参考https://bbs.tampermonkey.net.cn/thread-2494-1-1.html
    此时会触发代理window的get函数
    get函数发现是document会执行对象的处理函数
    此时会执行ee函数
    ee函数则会在其内部执行N、M、I三个函数
    N函数则对evalute进行了修改
    参考https://bbs.tampermonkey.net.cn/thread-2495-1-1.html
    M函数对["write", "writeln", "open", "close"]进行了修改
    参考https://bbs.tampermonkey.net.cn/thread-2496-1-1.html
    I函数对addEventListener和removeEventListener进行了修改
    参考https://bbs.tampermonkey.net.cn/thread-2497-1-1.html
    也就是说在我们油猴脚本内访问各式各样window的函数
    都会触发相应的get并且有各种行为来为其进行保驾护航
    而我们之所以在脚本内访问dcoument函数后使用
    EventTarget.prototype.addEventListener劫持失败
    是因为我们在函数内部使用了document
    触发了油猴的get,然后对其addEventListener进行劫持了
    而默认的addEventListener在其原型链上
    document自身没有addEventListener函数
    如果油猴对其document自身设置了addEventListener
    则根据原型链原则不会调用原型上的addEventListener函数
    所以我们EventTarget.prototype.addEventListener无效
    其他属性也是同理

    结语

    撒花~

    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
  • TA的每日心情
    慵懒
    2022-3-8 11:41
  • 签到天数: 2 天

    [LV.1]初来乍到

    22

    主题

    883

    回帖

    1381

    积分

    荣誉开发者

    积分
    1381

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

    发表于 2022-6-11 11:45:54 | 显示全部楼层
    @grant unsafeWindow并不是一句很方便的声明,他潜在造成的问题可能比你想象的多,在这一模式下很多原生的函数、对象会被油猴接管,比如setTimeout/clearTimeout、setInterval/clearInterval,在某些情况下可能造成意料之外的错误,解决方法通常是在前面加一个“unsafeWindow.”以确保得到的是原生引用。关于这个document的问题,在unsafeWindow + document-start的前提下,如果你想避免麻烦,最好在代码前加上这句:
    1. const document = unsafeWindow.document;
    复制代码
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5992

    回帖

    6780

    积分

    管理员

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

    积分
    6780

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

    发表于 2022-6-11 11:54:33 | 显示全部楼层
    cxxjackie 发表于 2022-6-11 11:45
    @grant unsafeWindow并不是一句很方便的声明,他潜在造成的问题可能比你想象的多,在这一模式下很多原生的 ...

    我加上!
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

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

    使用道具 举报

  • TA的每日心情
    开心
    2024-7-30 00:00
  • 签到天数: 122 天

    [LV.7]常住居民III

    29

    主题

    601

    回帖

    542

    积分

    专家

    积分
    542

    油中2周年生态建设者油中3周年挑战者 lv2

    发表于 2022-6-11 13:59:50 | 显示全部楼层
    ...
    // @grant        unsafeWindow
    ...

    window.睾丸 = 2;
    console.log(unsafeWindow.睾丸);
    console.log(window.睾丸);

    页面的window并不接受这俩睾丸
    那么问题是
    现在的睾丸到底属于谁的睾丸
    如果属于window的,window又是谁,薛定谔吗?
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5992

    回帖

    6780

    积分

    管理员

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

    积分
    6780

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

    发表于 2022-6-11 20:31:49 | 显示全部楼层
    脚本体验师001 发表于 2022-6-11 13:59
    ...
    // @grant        unsafeWindow
    ...

    属于proxy代理的window
    赋值的时候触发set属性然后保存到context内
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

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

    使用道具 举报

  • TA的每日心情
    开心
    2024-7-30 00:00
  • 签到天数: 122 天

    [LV.7]常住居民III

    29

    主题

    601

    回帖

    542

    积分

    专家

    积分
    542

    油中2周年生态建设者油中3周年挑战者 lv2

    发表于 2022-6-11 20:56:35 | 显示全部楼层
    李恒道 发表于 2022-6-11 20:31
    属于proxy代理的window
    赋值的时候触发set属性然后保存到context内

    看平日晃晃荡荡,以为平常。扯起来又很痛
    但看老大扯的明白,顿有所悟
    老大威武
    回复

    使用道具 举报

    发表回复

    本版积分规则

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