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

[油猴脚本开发指南]监听前端通用路由改变方法

[复制链接]
  • TA的每日心情
    开心
    2023-2-28 23:59
  • 签到天数: 191 天

    [LV.7]常住居民III

    637

    主题

    5194

    回帖

    6076

    积分

    管理员

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

    积分
    6076

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

    发表于 2022-2-9 18:51:56 | 显示全部楼层 | 阅读模式

    前文

    之前我们已经了解到了如何通过注入到Vue-router来做路由监听的改变,其实不仅仅能做这些,你甚至可以通过这个方法来控制路由跳转以及路由守卫的进一步控制了,虽然我没想到什么特别好的应用案例(笑

    那这节课我们目的主要分析hash模式以及history模式到底都应该用什么方法来进行监听

    磨材不误砍刀功

    我们先来一个一个了解

    通常来说如果是单页前端页面的话,如vue等

    在history模式的时候都会使用

    pushState,ReplaceState,go函数等

    这里给一个pushState函数的劫持

    let old=history.pushState
    history.pushState=function(...arg){
        console.log('改变了路由');
        return old.call(this,...arg)
    }

    图片.png

    可以看到了路由的改变提示

    图片.png

    我们可以以此类推,对这三个函数进行劫持,b站还对这个函数进行了一层封装

    但是对于我们来说劫持哪个函数并不重要,因为无论劫持的是哪个pushState,最后都一定会经过我们的函数,所以我们无须在意

    hash的监听

    以vue源码为例,在里面我们可以看到

          var eventType = supportsPushState ? 'popstate' : 'hashchange';
          window.addEventListener(
            eventType,
            handleRoutingEvent
          );

    supportPushState是根据浏览器的一些环境判断来使用popstate和hashchange

    我们写脚本的时候不如暴力一点,直接全部监听上算了

    addeventlistener监听较为简单

    所以我们这节课就非常easy的完事了

    结语

    撒花~

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

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

    [LV.9]以坛为家II

    30

    主题

    535

    回帖

    1408

    积分

    荣誉开发者

    积分
    1408

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

    发表于 2022-9-6 13:18:06 | 显示全部楼层
    虽然我没想到什么特别好的应用案例(笑

    GGNB,感觉可以用到我以前写的Bilibili观看历史记录脚本里去
    之前用的是MutationObserver监听销毁的元素+setInterval判断location.href是否改变来达到监听路由是否改变,一直感觉这个方法好蠢,但是查了很多资料都查不到更好的方法……

    现在根据哥哥的方法初步试了下直接劫持ReplaceState没问题,
    但是在我的需求里直接劫持pushState有点问题,经过pushState的时候已经播放器已经销毁了,没法获取观看进度了,可能还要从堆栈里的源头进行劫持,有空的时候再研究一下
    回复

    使用道具 举报

    发表回复

    本版积分规则

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