一个关于 iframe 很艹蛋的前端需求

2021-02-02 15:49:46 +08:00
 biguokang

业务是这样的

我们用 iframe 调用了 [被调用方] 的页面,然后 [被调用方] 页面一些 a 标签的 target 是“blank”的,这就导致点击他们的 a 标签会打开新的 tab

而现在的需求是,在 iframe 里的任何操作,都 [ [不允许弹出新 tab 或者新窗口] ] ,如果 [被调用方] 的页面的确是要打开新 tab 的,那就改为在本地页面跳转。

正常来说是无法实现的,因为跨域,而且 [被调用方] 肯定不会改代码的,所以只能写了个浏览器插件,通过注入代码的形式强行把网页里所有的 a 标签的 target 改为 self,这样 a 标签就全都是本地跳转

但是 [被调用方] 网页里面的业务不一定全是用 a 标签来打开新 tab,他们可能一些业务是用 js 来打开新 tab 的(类似于 window.open 这种,我尝试在插件里把 window.open 覆写成 window.location.href,但也只是部分按钮实现了,有些还是会跳出新页面)

现在问题如下: 1.被调用方是肯定不会改代码的,这个无解

2.已经能通过写浏览器插件的方式来注入代码强改客户代码的 a 标签(因为被调用方是不同域的,而且非互联网项目,装插件的设备也就那么几台,也不麻烦)

3.不能说这玩意不能做,因为项目跑在超高分大屏(电影院银幕大小)上,网页全屏显示,他有这种需求是因为打开新 tab 会强制关掉网页全屏,导致观感不好

然后如何完美实现??(虽然以我的见解这玩意是无法实现的,用浏览器插件来搞已经很仁至义尽了)

8510 次点击
所在节点    程序员
51 条回复
CODEWEA
2021-02-03 12:56:08 +08:00
我做过类似的,用 postMessage 通信即可
lixiangzaizheli
2021-02-03 13:19:39 +08:00
重写跳转注入不就好了
ganbuliao
2021-02-03 13:21:33 +08:00
解决办法就是 : 劫持注入 js ,插件注入 js,套壳写浏览器,
biguokang
2021-02-03 13:52:22 +08:00
@CODEWEA postMessage 无解,改不了被调用方的代码
biguokang
2021-02-03 13:53:32 +08:00
@mxT52CRuqR6o5 被调用方的代码是 webpack 打包过的,变量名也被打包工具魔改了,基本无可读性
PineappleBeers
2021-02-03 15:16:36 +08:00
我觉得你当前的需求用 4 楼和 19 楼的方法结合就来就可以解决。
浏览器请求你的服务。
服务从被调用方的地址获取到页面。
从获取到的 html 里注入一个 script 标签,标签里的内容就是重写 window.open 。
然后将注入后的页面返回浏览器。
biguokang
2021-02-03 17:25:29 +08:00
@PineappleBeers 他们可能没看完我的问题,我问题里说了已经我已经 override 了 window.open,但也只是一部分生效而已。。。而且所有的 a 标签已经被我的注入代码改成 target=_self 了
zhuweiyou
2021-02-03 17:42:07 +08:00
被调用方的页面 用服务端代理 + 改写
R18
2021-02-03 17:48:05 +08:00
制作专用的浏览器呢?
autoxbc
2021-02-04 04:29:09 +08:00
并不需要读懂对方代码,只要把能够进行地址跳转的函数全部覆盖一遍,大概一只手就能数过来
billccn
2021-02-04 05:59:33 +08:00
想到我十年前做的老项目,当时是为一个触摸屏的工业设备做一些辅助功能,公司不想花钱去买厂家的 SDK,就要求利用内置的浏览器实现,最骚的就是偶尔要内嵌显示另一个网站,要可以交互,但是不能允许该网站弹窗或者影响宿主页面,这些是 iframe 做不到的(有这些功能那机子的内存也不够)。

最后发现那个内置的浏览器可以支持 Java applets,就直接在网页里套了个 Java 版的 VNC 客户端,连接到服务器上一个无壳的 Chrome,弹窗什么的都只在服务器上进行,怎么也不会影响到客户端,而且客户端可以看到所有的效果。现在时代进步了,VNC 客户端可以直接用 JS 实现了。

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

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

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

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

© 2021 V2EX