前端能不能少用 js 跳转路由 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
yodhcn
V2EX    程序员

前端能不能少用 js 跳转路由

  •  2
     
  •   yodhcn
    yodhcn 122 天前 9026 次点击
    这是一个创建于 122 天前的主题,其中的信息可能已经有所发展或是发生改变。

    吐槽一下,习惯了鼠标中键打开新页面,遇到一些通过 js 跳转路由的网站是真的难受,这种方案不仅 SEO 优化差,用户想开个新页面还只能手动复制链接

    75 条回复    2025-06-13 12:41:24 +08:00
    murmur
        1
    murmur  
       122 天前
    都啥年代了,现在是$EO ,不是 SEO ,而且都在做私域 APP ,以后给你做网站都是福报了
    wangtian2020
        2
    wangtian2020  
       122 天前
    开新页面不是都是拖到新窗口,或者摁住 ctrl 吗
    xiaoming1992
        3
    xiaoming1992  
       122 天前
    @wangtian2020 对于 js 跳转路由的,你这些都无效。这些操作只对 a 标签有效
    zbqsfs
        4
    zbqsfs  
       122 天前   7
    作为前端开发也反感这种逻辑,自己写代码的时候都会用 a 标签实现路由跳转
    wlf2mydream
        5
    wlf2mydream  
       122 天前
    @murmur 没看懂 大佬可以解释一下吗 真诚请教
    shakaraka
        6
    shakaraka  
    PRO
       122 天前   8
    这个问题只是开发人员单纯乱写,全写 div 上,正常肯定是要在 a 标签的。
    gogozs
        7
    gogozs  
       122 天前
    你这个要求就有点多了……
    spritecn
        8
    spritecn  
       122 天前
    这个应该去怪 Angular/Vue/React 这些框架吧..哈哈哈
    murmur
        9
    murmur  
       122 天前
    @wlf2mydream 意思就是 SEO 要给钱,再好的 SEO 不如买榜,而且现在都是 APP 时代,有人给你做网页版你就烧高香吧
    wlf2mydream
        10
    wlf2mydream  
       122 天前
    @murmur #9 学习了 感谢回答
    fzhyzamt
        11
    fzhyzamt  
       122 天前   1
    我也很讨厌全用 click 跳转,很难用,自己写前端的时候能用<a>就用 a 标签
    crocoBaby
        12
    crocoBaby  
       122 天前
    @murmur 叫 SEM
    dumbass
        13
    dumbass  
       122 天前
    that's why we should use `<router-link />`
    weixind
        14
    weixind  
       122 天前
    收到
    xiaofeixiang
        15
    xiaofeixiang  
       122 天前
    不用 a 标签应该是想在跳转前执行自定义操作吧,对于需要 seo 的页面肯定是会用 a 标签的,但是现在大部分页面都是 spa ,用不着考虑 seo
    licoycn
        16
    licoycn  
       122 天前
    前端框架都有对应的路由链接组件,只是开发人员懒的,估计是方便用的例如 @click="router.push(xxx)",而不是<router-link>之类的标签
    saltand
        17
    saltand  
       122 天前 via iPhone
    div 一把梭的后果
    Al0rid4l
        18
    Al0rid4l  
       122 天前   4
    这跟 js 跳转有啥关系, 这不纯纯写页面的人菜吗, a 标签加路由逻辑确保 GET 幂等就没这事了
    Pipecraft
        19
    Pipecraft  
       122 天前   1
    重视用户体验是前端开发人员的基本素养。
    鼠标中键打开链接、鼠标右键选择链接打开方式、Tab 键遍历可点击元素等都应该考虑并实现。
    很多网站/网页应用做得很烂,只能用鼠标点击,Vimium 的 f/F 快捷键用不了,很烦。
    lambdaq
        20
    lambdaq  
       122 天前
    js 不是问题

    问题是一堆写 js 的压根没正经用过浏览器。。。
    94
        21
    94  
       122 天前
    因为懒,直接 div 一把梭。用前端框架路由也是可以保证可以正确生成 a 链接的。
    cheneyzhang
        22
    cheneyzhang  
      122 天前   2
    也有很多产品经理的奇葩需求, 点击跳转前各种检查逻辑.
    cst4you
        23
    cst4you  
       122 天前
    点名批评 t.bilibili.com
    Danswerme
        24
    Danswerme  
       122 天前
    框架不背锅,以 Vue 举例,vue-router 中 router-link 标签默认就渲染的是 a 标签
    eod
        25
    eod  
       122 天前
    @cheneyzhang 赞成
    AV1
        26
    AV1  
       122 天前
    就是某些前端水平差呗。
    一是不知道怎么消除 a 标签的默认样式。
    二是不知道
    <NavLink to={{pathname: '/about', search: 'name=foo&id=3'}}>
    或者
    <RouterLink :to="{path: './about', query: {name: 'foo', id: 3}}">
    的 to 属性是可以带参数的,只懂得用 router.push 来跳转
    ruofee
        27
    ruofee  
       122 天前
    @spritecn 和 vue 、react 没关系,vue 有 router-link ,react-router 有 Link ,最终都是超链接
    HFX3389
        28
    HFX3389  
       122 天前
    @murmur #9 确实,现在 APP 逆向比网页版难多了,有人给做网页版可太好了
    focuxin
        29
    focuxin  
       122 天前
    第一次知道按中键可以以新页面打开,学到了
    Linho1219
        30
    Linho1219  
       122 天前
    @spritecn 并非,现在的 SPA 框架工作逻辑都是真正的<a>标签,然后通过 JS 去拦截页面导航事件,是可以良好支持楼主的这种操作的。毕竟是基础设施,这点优化还是该做的
    楼主说的是那种手写 window.open 的
    VagabondH
        31
    VagabondH  
       122 天前
    吐槽的对,确实受不了不用 a 标签做跳转的
    gorvey
        32
    gorvey  
       122 天前
    @DOLLOR #26 那我问你,跳转前要做某些操作,或者校验身份,怎么办
    niurougan
        33
    niurougan  
       122 天前
    @focuxin 再帮你多学一点,中键点标签页可以关闭该页面,我也是在 V2 这学到的
    fao931013
        34
    fao931013  
       122 天前
    我倒是喜欢用 cmd + 左键 和 cmd + w 打开关闭新页面
    AV1
        35
    AV1  
       122 天前
    @gorvey 你这叫 submit button ,就像“添加新回复”下面那个“回复”按钮。显然 OP 说的肯定不是指这东西。
    pikko
        36
    pikko  
       122 天前
    微博之前改版 SPA 初版,就是没法信息流里用新标签页点开一条微博。完全丧失网页浏览的高效性,做成了一个巨大的 APP 。还好后面几个小版本就修复过来了。
    还得看验收,有时候这种小细节前端直接就看心情写了。
    drydiy
        37
    drydiy  
       122 天前 via iPhone
    前面说反感这种逻辑到底做过需求没?产品的需求是点击触发一系列逻辑处理,检查,再跳转。这种需求写多了,正常人都会忘记 a 标签。
    nexo
        38
    nexo  
       122 天前
    现在主流是单页应用
    ghosthcp516
        39
    ghosthcp516  
       122 天前   3
    说检查逻辑的大概率不知道什么是 preventDefault ,不然那些框架导航守卫怎么做的。平时受产品老板的气,网上看到这些心理也太不平衡了,知道得多反而变成了异类
    xubingok
        40
    xubingok  
       122 天前
    @niurougan 刚试了下,中键好难点啊...我这个滚轮滚着挺舒服,但是按下去真的要好大的力..
    ichou
        41
    ichou  
       121 天前
    @spritecn 与你的感受相反,这些框架的实现默认反而是最守规矩的
    yangth
        42
    yangth  
       121 天前
    明明是 seo 技术落后,反过来倒逼开发技术退步
    nullEDYT
        43
    nullEDYT  
       121 天前
    @ghosthcp516 preventDefault 只能同步函数 不能异步函数吧
    finalwave
        44
    finalwave  
       121 天前
    B 站以前还是 a 标签能中键打开,后来改成全 div 。不知道是谁的 KPI 。
    ruofee
    nbsp;   45
    ruofee  
       121 天前
    @Linho1219 常见的 SPA 路由库,比如 vue-router 和 react-router ,都是利用 History API 实现的路由切换,核心工作逻辑并非 a 标签
    ghosthcp516
        46
    ghosthcp516  
       121 天前
    @nullEDYT 你好,跟同步异步没关系的,为了这条回复我专门写了示例证明:aHR0cHM6Ly9wbGF5LnZ1ZWpzLm9yZy8jZU5yTlUxMXYyakFVL1N0WDNrT0NoQUpqZTJLQU5qclVNVzF0TlFwUGZqSEpCVndTTzdKdmdBcngzM2VkRk5wcFU1LzJVRVdSN1B0eGZPN3g4VkY4S2N0a1Y2SG9pNEZQblM0SlBGSlZqcVRSUldrZHdSR3MrV2tyUTVqQkNWYk9GaEJ4US9SSkdtbFNhenpCMnBKZDlPWmVtL1dpd2l1VjUwdVZibUVJeWorYUZCQ0dJemh5T1lVUGs5TGhEZzE5eFpXcWNvcGI1MHdBc3prbXVWM0gwZHFDTXBZMjZIcTk2RktpOWtvVEdOekRIUlBSSG1PSC9nOTRTY3ovWGhkb0t3ckpOcnp2ZHJzWGdOTmxsZHRVa2JZbTJUaGNNVmNwTmtTbDczYzYrLzArV1NxZFZVbHFDeW1haGxNWTk2SkVITGVlVGdYSWJGb1ZQRSt5UnBya0dKYmp4MmtXUmlBYnRSS1ZaWk13N3cvdENRMjZPRXB6blc2ajl2K1I1MDJJdzQzaEgzUWFEN0Y3ZUVOWWxMa2k1QjNBUUlIT2hsSUVVYVNBZ011N00rcXVoNGNHRUVac0p5QUxDdzVCUEo3UHZrMWJnNDRLa0RSWU91ZzBLd1dmYXhuUGNqMUIvMjNENThQZVNURzZ2bTJ3WVQ2YjNsekRZajVwc0FlZEYyeEZXNUJudVZkNm5UeDRhL2h4MURjdEJWTXNkWTd1dGd6cWVDbjZqUWRDanMreisrOTFqRnlGN1hNODNXQzYvVWY4d1I5Q1RJbzd2Z2wwTzVUaWtpUGwyRTFOZWpLN3dRT3ZMOG5DWmxYTzFhOGtmeUZicFFvY203SnhaVEttL2FLdVpqdXRuempyZGU4bkJ6YW5QdzhWaUliS1UxMHZCVC80cTFkR2Y2YjdJZmxZOTdFZnhPazNGOFdBSnc9PQ==
    Linho1219
        47
    Linho1219  
       121 天前 via Android
    @ruofee 不是一件事,History API 是管“捕获导航之后怎么切换”的问题,和用什么元素无关
    比如说 vitepress 文章里面的链接都是 a 标签啊,禁用 JS 依然能 fallback 到 MPA 模式
    importmeta
        48
    importmeta  
       121 天前
    上网冲浪这么多年了, 才知道中键能打开新网页, 我哭了.
    xinzhanghello
        49
    xinzhanghello  
       121 天前
    国内前端水平,一个字菜,再加几个字:不如 AI 。 不是技术菜,是意识
    dcdlove
        50
    dcdlove  
       121 天前
    @importmeta 学会了
    DT27
        51
    DT27  
       121 天前
    一直觉得现在的 js 不安分,到处瞎搞。
    求大神们收了神通吧。
    bowencool
        52
    bowencool  
       121 天前   1
    @zbqsfs #4 不能用 a 标签的,我也会判断鼠标中键和 e.altKey 、e.metaKey 之类的,因为我也有这个习惯
    bowencool
        53
    bowencool  
       121 天前
    @cheneyzhang #22 e.altKey 、e.metaKey 了解一下
    bowencool
        54
    bowencool  
       121 天前
    @bowencool #53 还有当 event.button === 1 时,表示鼠标中键被点击。只能说少找借口
    LandCruiser
        55
    LandCruiser  
       121 天前   2
    @bowencool 太细了哥,但我不会这么干,我的工资不允许我考虑这么细。
    iv8d
        56
    iv8d  
       121 天前 via Android
    国内环境不错,以后所有的都需要登陆才能获取优质内容
    simo
        57
    simo  
       121 天前
    收藏帖子的兄弟们,是准备后面看乐子么?
    alading11
        58
    alading11  
       121 天前
    我去,发现新大陆了,原来鼠标中键可以直接新标签打开?!
    JCZ2MkKb5S8ZX9pq
        59
    JCZ2MkKb5S8ZXpq  
       121 天前
    用 vimnium 的碰到这种不规范的用法的确很困扰。
    不用 a/button ,不写 role 。有些甚至连 cursor 都不处理。
    frankies
        60
    frankies  
       121 天前
    国内互联网产品能做网页版都是良心企业了,你就知足吧,淘宝网页版都摆烂多少年了啊,大厂都摆烂。。。
    diegozhu
        61
    diegozhu  
       121 天前 via Android
    @xiaofeixiang 用了 a 标签也能在跳转前做事情。。
    Obj9527
        62
    Obj9527  
       121 天前
    这种不是菜不菜的问题,而是想不想做的问题
    meteora0tkvo
        63
    meteora0tkvo  
       121 天前
    youtube spa 单页应用可以实现楼主说的按住鼠标中键/ctrl/ctrl + shift 新标签页打开,不知道怎么实现的。如果是用 vue 的 route 方法跳转确实会有这个问题
    peasant
        64
    peasant  
       121 天前
    @ghosthcp516 #46 打开看了下你这个例子,点击鼠标左键确实有用,但是点鼠标中键是直接打开 href 里的链接,没有执行方法。
    dode
        65
    dode  
       121 天前
    @xiaoming1992 按着 ctrl ,点击会在新窗口打开页面
    nullEDYT
        66
    nullEDYT  
       121 天前
    @ghosthcp516 e.preventDefault() 需要放到 await 后面 然后根据条件判断是否执行 e.preventDefault(),然后决定是否跳转
    cj941030
        67
    cj941030  
       121 天前
    有时候没办法,点击按钮有一堆的判断,甚至参数获取,再去做跳转
    edisonwong
        68
    edisonwong  
       121 天前
    中小公司,前端界面很可能都是后端人员“身兼数职”来写的,加上屁事多,所以很多压根都没这个意识与知识
    给多少钱就要求那么细致开发要求体验好啊,甚至有些都不适配移动端,三折叠屏幕,全错乱
    Y25tIGxpdmlk
        69
    Y25tIGxpdmlk  
       121 天前
    @gorvey #32 跳转过去的目标页来验证不行吗?
    Leeeeex
        70
    Leeeeex  
    PRO
       121 天前
    @xinzhanghello 一棒子打死国内所有前端,还得是你。
    xinzhanghello
        71
    xinzhanghello  
       121 天前
    @chanChristin 哈哈 夸张了。 肯定还是有厉害的,我只是后端来吐槽下大部分页面真的很难受。
    gofishing
        72
    gofishing  
       121 天前
    @ghosthcp516 这样做有很大的漏洞

    1. 鼠标右键, 可以打开菜单, 选择跳转. 得再阻止 contextmenu 事件.
    2. 无法阻止鼠标中键新页面打开.
    3. 无法阻止 ctrl + 左键打开
    4. 如果测试, 产品较真起来, 鼠标 hover 到链接的时候, 页面左下角是可以看到链接, 用户可以手动输入链接跳转.
    xiaoming1992
        73
    xiaoming1992  
       121 天前 via Android
    @dode #65 我说的是,如题所说的 js 跳转,用的是 router.push 之类的,你用 ctrl 或者中键都没用。
    ragnaroks
        74
    ragnaroks  
       120 天前
    说一个需要使用事件而不是 A 标签的正常的需求:阻止浏览器预读浪费大量带宽
    kakki
        75
    kakki  
       120 天前
    我 XX 居然这么多人不知道鼠标中键能打开新链接的.
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5224 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 09:22 PVG 17:22 LAX 02:22 JFK 05:22
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86