V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iambeginner
V2EX  ›  程序员

[求方法]将javascript:;这样的link转换为真实地址

  •  
  •   iambeginner · 2013-10-06 18:27:37 +08:00 · 4238 次点击
    这是一个创建于 3862 天前的主题,其中的信息可能已经有所发展或是发生改变。
    请教各位
    有将javascript:; 之类的链接 转换为显示真实链接的插件么(chrome/firefox/userscripts都可以)

    网上找了好几个 要么只针对特定site 要么无效

    是因为语法上无法判断么?
    23 条回复    1970-01-01 08:00:00 +08:00
    zzNucker
        1
    zzNucker  
       2013-10-06 18:37:52 +08:00
    这个。。。。
    不通用吧。。。。。
    breeswish
        2
    breeswish  
       2013-10-06 18:38:41 +08:00
    因为这些都是在click事件里进一步处理的。。
    请手工分析。。
    clowwindy
        3
    clowwindy  
       2013-10-06 18:42:40 +08:00   ❤️ 2
    图灵停机问题……不存在通用的算法求出一段代码的执行结果,除非实际运行这段代码
    est
        4
    est  
       2013-10-06 21:54:21 +08:00
    @clowwindy -_- 能做出来怎么说。。。。比如把window.open这个函数劫持了。
    zorceta
        5
    zorceta  
       2013-10-06 22:05:25 +08:00 via Android
    @clowwindy
    @est
    呃,瞬间想到V8怎么破
    clowwindy
        6
    clowwindy  
       2013-10-06 22:10:08 +08:00
    @est 所以需要触发点击事件执行一下代码啊。但是你又不知道点击后会发生什么,有可能触发不好的结果,就拿 V2EX 这个页面来说,会把所有的收藏、忽略、隐藏、感谢和回复都点一遍。某些网站则有可能触发购买、删除、举报等等。

    所以只能针对特定网站,找出规律,做出有局限性的插件。
    xingzhi
        7
    xingzhi  
       2013-10-06 22:17:07 +08:00
    找规律。
    例如找出这个元素的 id、class
    然后去 js 搜它对应的动作。

    最简单就是点击它然后看「network」的请求了。
    est
        8
    est  
       2013-10-06 23:10:49 +08:00
    @clowwindy 你见过Google搜索结果页面那个劫持不?点击前,链接是直链,鼠标点击左中右任意,都会在跳转前变成另外一个 google.com/sa?url=xxx 这样的链接。

    用同样的原理做一个userscripts不难吧。

    1. 搜索页面所有 href="javascript" 的链接
    2. 把window.open改成 element.href="xxx"

    这样不会影响ajax操作和其他js操作,只针对js打开新窗口操作进行拦截。

    你所说的停机问题虽然有一定道理,但是我们为了实现目标,可以通过判断停机,也可以绕过这个,根本不需要去判断停机。

    就好比如何嗅探swf里边的视频真实地址一样,我们把flashocx.dll里边播放视频的函数劫持成一个alert() ,不就可以得到所有视频了么。
    kchum
        9
    kchum  
       2013-10-06 23:21:21 +08:00
    只有特定针对某个site写userscript吧
    binux
        10
    binux  
       2013-10-06 23:31:02 +08:00
    @est 如果那个href="javascript"除了会window.open以外,还会“收藏、忽略、隐藏、感谢和回复”怎么办?
    est
        11
    est  
       2013-10-06 23:39:47 +08:00
    @binux 不太明白你的意思,就是ajax点赞那种按钮?不会有影响啊。。。。ajax的xhr调用不会受到window.open影响的。
    binux
        12
    binux  
       2013-10-07 00:06:52 +08:00
    @est 同一个事件的回调,先ajax再window.open呢?你是执行这个回调还是不执行呢?
    est
        13
    est  
       2013-10-07 00:27:43 +08:00
    @binux 怎么不执行,执行的啊。只不过执行后 href 改成了真实链接而已。再点击就没有 href=javascript: 的效果了而已。
    dorentus
        14
    dorentus  
       2013-10-07 00:44:55 +08:00
    肯定没法有通用的实现的。

    比如某个网站,一个 a[href=javascript;] 点击(或者其它事件触发后)的行为是:
    1) 向 A URL 发送 AJAX 请求,根据服务器返回的结果,转向 2) 或 3) 或 4) 或其它
    2) 展示一个面向用户的提示信息,结束
    3) 展示另一个面向用户的提示信息,然后提交一个表单到 B URL(之后页面是否会跳转,往那个 URL 跳转完全就看服务器了)
    4) 展示又一个面向用户的提示信息,然后 window.open C URL(话说这种方式多半会被浏览器拦截吧)
    ...
    bombless
        15
    bombless  
       2013-10-07 01:05:17 +08:00
    location这个对象这么复杂,按我的理解,是不可能复制出来它这种行为的
    clowwindy
        16
    clowwindy  
       2013-10-07 02:27:47 +08:00
    @dorentus “针对特定网站”和“针对任意网站”的难度差别是可能和不可能的区别
    msg7086
        17
    msg7086  
       2013-10-07 04:43:03 +08:00
    用javascript写一个javascript执行引擎,在沙盒里模拟点击事件,然后判定如果事件请求是可以用a标签来模拟的话,重写a标签。
    tioover
        18
    tioover  
       2013-10-07 18:09:13 +08:00 via Android
    思路,拦截请求
    breeswish
        19
    breeswish  
       2013-10-07 18:15:45 +08:00
    @dorentus 在用户触发的事件中使用window.open不会被拦截
    loveminds
        20
    loveminds  
       2013-10-08 05:11:27 +08:00 via Android
    @msg7086 效率太低,赞成拦截请求
    est
        21
    est  
       2013-10-08 08:36:44 +08:00
    @bombless 我想了一下,的确有location这个麻烦。但是理论上还是不难吧。有个 getter setter 的障碍,不过现在有办法,用 Object.defineProperty

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty
    est
        22
    est  
       2013-10-08 08:37:50 +08:00
    @dorentus 遇到这种需要js在新窗口调用 window.opener 的肯定没有通用办法了。
    tabris17
        23
    tabris17  
       2013-10-08 14:57:47 +08:00
    脚本要执行了才能知道真实地址啊,比如脚本要请求服务器获取返回值,然后根据返回值判断跳转那个URL,你不执行如何能知道
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   780 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 22:03 · PVG 06:03 · LAX 15:03 · JFK 18:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.