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

2013-10-06 18:27:37 +08:00
 iambeginner
请教各位
有将javascript:; 之类的链接 转换为显示真实链接的插件么(chrome/firefox/userscripts都可以)

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

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

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

最简单就是点击它然后看「network」的请求了。
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
2013-10-06 23:21:21 +08:00
只有特定针对某个site写userscript吧
binux
2013-10-06 23:31:02 +08:00
@est 如果那个href="javascript"除了会window.open以外,还会“收藏、忽略、隐藏、感谢和回复”怎么办?
est
2013-10-06 23:39:47 +08:00
@binux 不太明白你的意思,就是ajax点赞那种按钮?不会有影响啊。。。。ajax的xhr调用不会受到window.open影响的。
binux
2013-10-07 00:06:52 +08:00
@est 同一个事件的回调,先ajax再window.open呢?你是执行这个回调还是不执行呢?
est
2013-10-07 00:27:43 +08:00
@binux 怎么不执行,执行的啊。只不过执行后 href 改成了真实链接而已。再点击就没有 href=javascript: 的效果了而已。
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
2013-10-07 01:05:17 +08:00
location这个对象这么复杂,按我的理解,是不可能复制出来它这种行为的
clowwindy
2013-10-07 02:27:47 +08:00
@dorentus “针对特定网站”和“针对任意网站”的难度差别是可能和不可能的区别
msg7086
2013-10-07 04:43:03 +08:00
用javascript写一个javascript执行引擎,在沙盒里模拟点击事件,然后判定如果事件请求是可以用a标签来模拟的话,重写a标签。
tioover
2013-10-07 18:09:13 +08:00
思路,拦截请求
breeswish
2013-10-07 18:15:45 +08:00
@dorentus 在用户触发的事件中使用window.open不会被拦截
loveminds
2013-10-08 05:11:27 +08:00
@msg7086 效率太低,赞成拦截请求

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/84710

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX