一个关于 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 会强制关掉网页全屏,导致观感不好

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

8491 次点击
所在节点    程序员
51 条回复
musi
2021-02-02 23:40:26 +08:00
其实 iframe 还有个 sandbox 属性可以设置 allow-popups

详情左转 https://developer.mozilla.org/zh-cn/docs/web/html/element/iframe
Hanada
2021-02-03 00:01:15 +08:00
为什么不考虑一下直接反向代理被调用方的网页,然后就可以根据需要进行改动了
zqx
2021-02-03 06:51:08 +08:00
避免 iframe 的安全策略,就肯定不能用 iframe 了。
可以在你的 js 里,把别人的 html 请求回来,解析并插入到自己的 DOM 中,再请求 css js,是 vue 或 react 或原生 js,按对应的逻辑执行。关键难点在于要拿到他的路由和状态管理,如果他没有在代码里显式导出给你,就很难拿到,需要从源码里找
微前端的实现大概也是这个思路
sampeng
2021-02-03 08:17:01 +08:00
这你都干…怼回去啊。怎么不让做个屏幕随着衣服颜色变色呢?
uiosun
2021-02-03 08:26:07 +08:00
iframe 不是可以禁止跳转吗……就在基本配置里啊……

是我没理解对需求,还是你好歹去看看文档啊……
zhw2590582
2021-02-03 09:35:29 +08:00
Chrome 可以监听新页面打开事件,看能不能在打开的时候马上关闭,并 iframe 重定向
duduaba
2021-02-03 09:51:25 +08:00
iframe sandbox 属性,但是 ie9 前是不支持的。
GM
2021-02-03 10:24:43 +08:00
自己写一个程序,内嵌 webview,不要用第三方浏览器,这样有 100%的控制权,随便搞。
biguokang
2021-02-03 10:26:01 +08:00
@uiosun 老哥,我当然知道 iframe 是可以通过设置 sandbox 来禁止跳转,这个不用你教。。。问题是我的需求不是禁止跳转,而是把打开新窗口的逻辑改为在原地跳转
biguokang
2021-02-03 10:26:56 +08:00
@coderfuns 这玩意我是有设置的,唯一的作用也就是禁止 iframe 页面打开新窗口而已,只不过满足不了需求,需求是把打开新窗口的操作变为原地跳转
biguokang
2021-02-03 10:29:00 +08:00
@musi 这玩意我是有设置的,唯一的作用也就是禁止 iframe 页面打开新窗口而已,只不过满足不了需求,需求是把打开新窗口的操作变为原地跳转
biguokang
2021-02-03 10:30:52 +08:00
@ciqulover 我是自己开发了一个浏览器插件,通过注入的方式解决了,说白了就是通过事件委托检测到点击了 a 标签后,然后禁止调 a 标签的行为,改为 window.location.href=xxx 就实现了。。。但只是解决了 a 标签的跳转逻辑,而 js 的跳转还没有
shaoyijiong
2021-02-03 10:32:30 +08:00
我们有一个类似的需求 我们是在后端写一个代理服务 , 前端请求那个代理 , 代理请求对应的网页 ; 然后在代理服务里面写入自己的 js 代码 , 就可以修改原来的 html 元素里面的 a 标签了 ; 或者直接修改原始 html 也行
后端使用的是 java 做的代理 https://github.com/mitre/HTTP-Proxy-Servlet
shaoyijiong
2021-02-03 10:40:51 +08:00
也可以在嵌入的 js 中取消别人的点击事件
no1xsyzy
2021-02-03 10:59:23 +08:00
用 Nginx 反代改成同域啊
Aria2 的老技巧了(
dlllcs
2021-02-03 11:14:47 +08:00
electron 可解
ArthurSS
2021-02-03 11:15:21 +08:00
https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/iframe
sandbox
该属性对呈现在 iframe 框架中的内容启用一些额外的限制条件。属性值可以为空字符串(这种情况下会启用所有限制),也可以是用空格分隔的一系列指定的字符串。有效的值有:
...
allow-popups: 允许弹窗 (例如 window.open, target="_blank", showModalDialog)。如果没有使用该关键字,相应的功能将自动被禁用。
...
mxT52CRuqR6o5
2021-02-03 11:17:10 +08:00
不能改代码,那能不能看代码,遇到没拦截住的就具体看看代码里是咋跳的,就知道为啥没拦截到了
ArthurSS
2021-02-03 11:19:07 +08:00
@ArthurSS #37 刚刚没看到楼上评论。。。
krapnik
2021-02-03 11:55:25 +08:00
19 楼的方法解决不了嘛?

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

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

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

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

© 2021 V2EX