有没有什么方法判断浏览器是否支持 js - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制贴 AI 生成的内容
yitd
V2EX    程序员

有没有什么方法判断浏览器是否支持 js

  •  
  •   yitd 2019-09-05 08:30:49 +08:00 via iPhone 6388 次点击
    这是一个创建于 2296 天前的主题,其中的信息可能已经有所发展或是发生改变。
    目前解决方案是进入页面用 js 设置 cookie 后刷新
    PHP 判断没有 cookie 就不允许访问
    想了一晚上总感觉不完美,有没有别的解决方案?
    效果要达到不支持 js 就不允许访问
    第 1 条附言    2019-09-05 09:25:26 +08:00
    不是需要友好显示给用户的问题,是需要不支持 js 就不返回任何内容给浏览器,包括源码
    第 2 条附言    2019-09-07 23:43:30 +08:00
    今天已经想到不用 cookie 的方法,PHP 判断 post 数据存在就返回正常页面!不存在就输出表单,js 自动提交 post 表单 exit
    48 条回复    2019-09-07 23:49:18 +08:00
    RV0n
        1
    RV0n  
       2019-09-05 08:43:02 +08:00
    可以看一下 <noscript> 这个标签
    yitd
        2
    yitd  
    OP
       2019-09-05 08:52:44 +08:00 via iPhone
    @RV0n 这个不行 不是想要的效果 需要判断不支持 js 就不返回任何内容给浏览器
    Chemist
        3
    Chemist  
       2019-09-05 08:56:33 +08:00 via iPhone   1
    用随便一个 spa 框架写网站,不支持 js 打开自然就是一片空白。
    mengkun
        4
    mengkun  
       2019-09-05 09:05:18 +08:00
    你是想防爬虫?
    z939211863
        5
    z939211863  
       2019-09-05 09:06:01 +08:00
    有浏览器不支持 js 么?
    momocraft
        6
    momocraft  
       2019-09-05 09:08:08 +08:00   1
    X 问题是什么

    > #5
    w3m 就支持
    redbuck
        7
    redbuck  
       2019-09-05 09:09:21 +08:00
    进入页面用 JS 插入一个 iframe 引你得页面
    redbuck
        8
    redbuck  
       2019-09-05 09:09:39 +08:00
    @z939211863 用户可以禁用
    qiaobeier
        9
    qiaobeier  
       2019-09-05 09:11:00 +08:00
    没啥好办法,只能渲染时使用各种方法检查客户端是否禁用脚本,再存入 cookie。至于第一次,尝试使用 noscript 或者 css 去做些预处理。
    lqzhgood
        10
    lqzhgood  
       2019-09-05 09:18:24 +08:00
    CSS 默认 display: none ~
    只显示一个 <noscript> 告诉用户没有 JS 不能显示呗。

    没有上下文 不知道 LZ 需求是啥~
    我感觉是一个 A B 问题。LZ 有 A 问题觉得 B 能解,问了半天 B 结果发现 C 才是最优解。
    passerbytiny
        11
    passerbytiny  
       2019-09-05 09:19:12 +08:00
    很明显,楼主想要的是“不给 js 权限就不让用”,你们回答“怎么在浏览器不支持 js 的时候友好显示”,跑题了。
    yitd
        12
    yitd  
    OP
       2019-09-05 09:21:32 +08:00 via iPhone
    @passerbytiny 你是明白人
    GzhiYi
        13
    GzhiYi  
       2019-09-05 09:23:05 +08:00
    LZ 的意思是后端判断前端有没开启 js 支持吧?
    yitd
        14
    yitd  
    OP
       2019-09-05 09:23:08 +08:00 via iPhone
    @lqzhgood 不是显示问题,noscript 实际上网页全部内容还是给浏览器了
    yitd
        15
    yitd  
    OP
       2019-09-05 09:26:21 +08:00 via iPhone
    @GzhiYi 差不多 不支持就返回空白内容 包括源码
    asdjgfr
        16
    asdjgfr  
       2019-09-05 09:29:24 +08:00   1
    先返回一个静态页,里面用 js 获取客户端的相关信息 ua,时间戳之类的,然后调用接口,如果接口收到了就把真实的内容返回出去,否则就返回一个没权限的页面呗
    jinliming2
        17
    jinliming2  
       2019-09-05 09:29:39 +08:00 via iPhone
    @z939211863 可以禁用。一般为了严格安全的时候都是直接禁用 js 的。tor 默认禁用不安全 js。
    Chemist
        18
    Chemist  
       2019-09-05 09:33:19 +08:00
    JS 执行是在获取数据之后的事儿,除非浏览器能在请求的时候主动告诉你支不支持 JS 执行。
    你这需求有点像:能不能知道刮刮卡有没有中奖,没中奖就不刮。
    yitd
        19
    yitd  
    OP
       2019-09-05 09:34:19 +08:00 via iPhone
    @asdjgfr 不错,这个方法比 cookie 好一点
    laravel
        20
    laravel  
       2019-09-05 09:35:04 +08:00
    <noscript>
    <img src="https://www.liulangmao.org" alt="">
    <iframe src="https://www.liulangmao.org" frameborder="0"></iframe>
    </noscript>
    jinliming2
        21
    jinliming2  
       2019-09-05 09:38:45 +08:00 via iPhone
    逻辑很简单,如果浏览器是第一次访问这个网站,那么默认肯定是不会带是否开启 js 的信息的,所以后端就无法知道,为了避免将代码发给未开启 js 的用户,实际上就直接给个带 src 的 script 标签,不支持 js 的浏览器自然不会下载这个 js,也就避免了把代码发给浏览器。
    这也是唯一的办法,因为后端无法知道是否启用了 js,所以只能一视同仁,不返回真实内容,楼主用的 cookie 也只是变通办法,相当于给开启了 js 的浏览器打“标记”。
    yitd
        22
    yitd  
    OP
       2019-09-05 09:38:46 +08:00 via iPhone
    @jinliming2 不过好像怎么判断的时候还是需要 cookie 来通信。。
    yitd
        23
    yitd  
    OP
       2019-09-05 09:40:04 +08:00 via iPhone
    楼上回复错了不好意思

    @asdjgfr 不过好像怎么判断的时候还是需要 cookie 来通信。。
    cmdOptionKana
        24
    cmdOptionKana  
       2019-09-05 09:40:52 +08:00
    可以用 js 加载内容( ajax ),如果用户禁用 js 当然无法加载内容啦,但只能对付普通用户。

    但是你防普通用户干嘛?要防也是防专门爬站的,但这就是另一个话题了,反爬说起来就太多东西了。
    also24
        25
    also24  
       2019-09-05 09:46:37 +08:00   1
    我隐隐的感觉这是个 X-Y 问题。

    所以虽然前面已经有人问过,还是想再确认一下:
    楼主你是确实业务中希望对不支持 JS 或禁用了 JS 的用户区别对待,还是想反爬虫?


    单纯的区别对待,可以做的方案其实非常多,但是如果是为了反爬虫,那么很多方案并不能带来更多的复杂度。
    Kusoku
        26
    Kusoku  
       2019-09-05 09:48:30 +08:00
    可以用客户端重定向,不支持 js 就没法定向到实际页面
    optional
        27
    optional  
       2019-09-05 09:50:24 +08:00
    你想在代码还没到浏览器之前就判断浏览器,这不可能。
    不过实现效果很简单,由先到浏览器的代码进行后续加载即可。
    dfourc
        28
    dfourc  
       2019-09-05 09:51:23 +08:00
    @laravel #20 跑题了兄弟
    Kusoku
        29
    Kusoku  
       2019-09-05 09:51:33 +08:00
    www.xxx.com 返回的是包含重定向 js 代码的空白页面,能执行就定向到 www.xxx.com/xxx 的实际页面
    arrow8899
        30
    arrow8899  
       2019-09-05 09:51:56 +08:00
    先返回一个空白页面+一段 js (直接重定向);如果不支持 js,那么就不会重定向;支持的话 就会到正常页面。
    imdong
        31
    imdong  
       2019-09-05 09:52:38 +08:00   1
    判断是否支持 JS 都需要客户端判断,所以刷新一下应该无法避免了...

    方案一:访问页面,传递 cookies 到客户端,noscript 标签内放一个图片,服务器如果收到这个图片的请求就标记为不支持。
    方案二:页面内 head 头一秒后跳转,如果支持 js 就把跳转地址改成另一个页面。
    blankfire
        32
    blankfire  
       2019-09-05 09:55:19 +08:00
    黑产?很多小黄网关掉 JS 就无法显示出广告了
    icebreaker12
        33
    icebreaker12  
       2019-09-05 09:55:59 +08:00
    重定向+1,搞个只有最简单判断逻辑的前置页,成功后重定向到网站。 类似知乎百度跳转外链前的统计页
    nihiue
        34
    nihiue  
       2019-09-05 09:56:34 +08:00 via Android
    不支持 js 的浏览器是?
    jugelizi
        35
    jugelizi  
       2019-09-05 09:56:36 +08:00
    楼主就是单纯的想反爬
    能不能好好问问题
    nnnToTnnn
        36
    nnnToTnnn  
       2019-09-05 10:02:24 +08:00
    @asdjgfr
    @yitd

    请了解下 selenium && PhantomJS,居然有人告诉可以利用判断是否支持 js 来反爬虫,估计爬虫的人要乐了 =。=
    arrow8899
        37
    arrow8899  
       2019-09-05 10:06:33 +08:00
    现在所有浏览器都支持 js 了吧,主动禁用 js 除外;如果是想反爬,你这么做没有任何作用。
    所以楼主你最原始的需求是什么?
    xiangyuecn
        38
    xiangyuecn  
       2019-09-05 10:12:50 +08:00
    在不支持 js 的地方,需要执行 js 告诉服务器这个地方不支持 js。抱歉,这是不是死循环 就是 断头路

    可以在 js 里面埋暗桩(更新勤快些),同一个客户端(如何识别?)多次访问,但没有触发暗桩中的行为(如 某些请求、某些变化的数据),直接 block 此客户端(如 ip )
    yitd
        39
    yitd  
    OP
       2019-09-05 12:45:08 +08:00
    @nnnToTnnn 没说是防爬虫吧
    liuxey
        40
    liuxey  
       2019-09-05 12:56:10 +08:00
    加个登陆页,和 cloudflare 防 ddos 原理一样

    https://www.a2hosting.com/images/uploads/knowledgebase_images/kb-cloudflare-under-attack-interstitial-page.png

    检查完在跳正式网站
    podel
        41
    podel  
       2019-09-05 14:23:08 +08:00
    话说 你直接弄一段 html。然后 js 自动加载的时候 移除。没有移除的 就是 不支持 js 了呗。
    littiefish
        42
    littiefish  
       2019-09-05 17:13:02 +08:00 via iPhone
    装了 noscript
    maomaomao001
        43
    maomaomao001  
       2019-09-05 17:14:30 +08:00
    @kyuuseiryuu 这个想法已经落后了,写完 spa 后 , 加上 ssr, 没 js 照样能看到渲染内容
    maomaomao001
        44
    maomaomao001  
       2019-09-05 17:17:55 +08:00
    @yitd 你这个,从原理都不通吧,
    就像无论用浏览器发请求
    还是你自己在 terminal 里 curl 这个地址一样
    都是会返回( html )内容的,

    你能做到的,只有根据 cookie,ua,用户 ip 等信息来特殊处理了
    无论如何,你都不可能拿到用户禁用的 js (除非你给用户终端装病毒?)
    Chemist
        45
    Chemist  
       2019-09-05 17:19:21 +08:00
    @maomaomao001 #43 本来就想让不能执行 JS 的情况不可见,为什么还要去做 SSR ?
    Aruforce
        46
    Aruforce  
       2019-09-05 17:44:41 +08:00
    所有的内容都由 JS 渲染加载啊....

    不执行 JS 肯定获取不到其他内容...

    但是还是会返回一个 HTML 文本...(这个 HTML 内容就如#7 所写)
    killerv
        47
    killerv  
       2019-09-05 18:08:05 +08:00
    #46 说的不错,用 js 渲染页面应该就行了。
    yitd
        48
    yitd  
    OP
       2019-09-07 23:49:18 +08:00 via iPhone
    @imdong
    @passerbytiny
    @asdjgfr
    @laravel
    @jinliming2
    @optional
    @maomaomao001
    今天已经解决了,方法已补充 留给万一以后需求的人看
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5220 人在线  最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 44ms UTC 07:17 PVG 15:17 LAX 23:17 JFK 02:17
    Do have faith in what you're doing.
    ubao msn 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