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

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

[复制链接]
  • TA的每日心情

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

    [LV.5]常住居民I

    332

    主题

    2896

    帖子

    2908

    积分

    荣誉开发者

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

    Rank: 10Rank: 10Rank: 10

    积分
    2908

    猫咪币纪念章

    发表于 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无效
    其他属性也是同理

    结语

    撒花~

    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
  • TA的每日心情
    慵懒
    2022-3-8 11:41
  • 签到天数: 2 天

    [LV.1]初来乍到

    10

    主题

    355

    帖子

    433

    积分

    荣誉开发者

    Rank: 10Rank: 10Rank: 10

    积分
    433

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

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

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

    使用道具 举报

  • TA的每日心情
    擦汗
    2022-6-12 21:47
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    9

    主题

    226

    帖子

    180

    积分

    中级工程师

    Rank: 5Rank: 5

    积分
    180

    中秋纪念章猫咪币纪念章活跃会员热心会员三好学生

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

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

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

    使用道具 举报

  • TA的每日心情

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

    [LV.5]常住居民I

    332

    主题

    2896

    帖子

    2908

    积分

    荣誉开发者

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

    Rank: 10Rank: 10Rank: 10

    积分
    2908

    猫咪币纪念章

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

    属于proxy代理的window
    赋值的时候触发set属性然后保存到context内
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2022-6-12 21:47
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    9

    主题

    226

    帖子

    180

    积分

    中级工程师

    Rank: 5Rank: 5

    积分
    180

    中秋纪念章猫咪币纪念章活跃会员热心会员三好学生

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

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

    使用道具 举报

    发表回复

    本版积分规则

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