2020-07-28 10:03:53 +08:00
|
|
|
|
---
|
|
|
|
|
title: iFrame
|
2020-09-25 13:50:48 +08:00
|
|
|
|
description:
|
2020-07-28 10:03:53 +08:00
|
|
|
|
type: 0
|
|
|
|
|
group: ⚙ 组件
|
|
|
|
|
menuName: iFrame
|
2020-09-25 13:50:48 +08:00
|
|
|
|
icon:
|
2020-07-28 10:03:53 +08:00
|
|
|
|
order: 51
|
|
|
|
|
---
|
2020-09-25 13:50:48 +08:00
|
|
|
|
|
2020-07-28 10:03:53 +08:00
|
|
|
|
## 基本使用
|
|
|
|
|
|
|
|
|
|
内嵌外部站点,可用 iframe 来实现。
|
|
|
|
|
|
2021-01-07 23:35:03 +08:00
|
|
|
|
```schema: scope="body"
|
2020-07-28 10:03:53 +08:00
|
|
|
|
{
|
|
|
|
|
"type": "iframe",
|
2022-03-31 14:11:39 +08:00
|
|
|
|
"src": "https://github.com/baidu/amis",
|
2021-04-12 09:18:57 +08:00
|
|
|
|
"height": 300
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
2022-11-01 12:14:09 +08:00
|
|
|
|
## src 使用动态数据
|
|
|
|
|
|
|
|
|
|
### 数据域变量
|
2021-04-12 09:18:57 +08:00
|
|
|
|
|
|
|
|
|
> 1.1.6
|
|
|
|
|
|
|
|
|
|
```schema:
|
|
|
|
|
{
|
|
|
|
|
"type": "page",
|
|
|
|
|
"data": {
|
2022-03-31 14:11:39 +08:00
|
|
|
|
"iframeSrc": "https://github.com/baidu/amis"
|
2021-04-12 09:18:57 +08:00
|
|
|
|
},
|
|
|
|
|
"body": {
|
|
|
|
|
"type": "iframe",
|
2022-03-31 14:11:39 +08:00
|
|
|
|
"src": "${iframeSrc}",
|
2021-04-12 09:18:57 +08:00
|
|
|
|
"height": 300
|
|
|
|
|
}
|
2020-07-28 10:03:53 +08:00
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
2022-07-13 10:47:56 +08:00
|
|
|
|
## 其它原生 iframe 属性
|
|
|
|
|
|
|
|
|
|
> 2.1.0 及以上版本
|
|
|
|
|
|
|
|
|
|
还支持以下原生 iframe 属性,具体配置项请[参考](https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/iframe)。
|
|
|
|
|
|
|
|
|
|
- name
|
|
|
|
|
- allow
|
|
|
|
|
- sandbox
|
|
|
|
|
- referrerpolicy
|
|
|
|
|
|
2022-11-01 12:14:09 +08:00
|
|
|
|
## 支持 base64 格式
|
|
|
|
|
|
|
|
|
|
> 2.4.0 及以上版本
|
|
|
|
|
|
|
|
|
|
`src`属性支持传入符合 base64 编码标准的 [MIME 类型](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types)字符串,具体效果参考[示例](../../../examples/iframe)
|
|
|
|
|
|
2020-09-25 13:50:48 +08:00
|
|
|
|
## 如何和 iframe 通信
|
|
|
|
|
|
|
|
|
|
#### amis 向 iframe 通信
|
|
|
|
|
|
|
|
|
|
在 iframe 页面中添加`message`事件监听器,在 iframe 初始化、更新或者接收到其他组件发送数据的时候,会通过 `postMessage` 发送当前数据域数据,iframe 页面的事件监听器中可以通过`e.data`进行获取:
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
window.addEventListener('message', e => {
|
|
|
|
|
// e.data 获取当前数据域数据,进行使用
|
|
|
|
|
});
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
`e.data` 格式及参数说明:
|
|
|
|
|
|
|
|
|
|
```json
|
|
|
|
|
{
|
|
|
|
|
"type": "amis:init", // 当前事件类型
|
|
|
|
|
"data": {
|
|
|
|
|
//... 当前数据域数据
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
- **type**: 当前事件类型
|
|
|
|
|
- amis:init:初始化的时候触发
|
|
|
|
|
- amis:update:组件更新时触发
|
|
|
|
|
- amis:receive:组件通过 target 接收到其他组件发送来数据的时候
|
|
|
|
|
- **data**:当前数据源数据
|
|
|
|
|
|
|
|
|
|
> 如果是 webpack 开发环境,注意过滤掉`webpackOk`类型消息
|
|
|
|
|
|
|
|
|
|
#### iframe 页面向 amis 通信
|
|
|
|
|
|
2022-11-14 14:50:01 +08:00
|
|
|
|
可以通过以下两种方式实现 iframe 页面向 amis 通信:
|
2020-07-28 10:03:53 +08:00
|
|
|
|
|
2022-11-14 14:50:01 +08:00
|
|
|
|
- 方式一:通过 events 属性,基于[Action](./action)实现,有一定的局限性。
|
|
|
|
|
- 方式二:通过 onEvent 属性,基于[事件动作](../../docs/concepts/event-action)实现,更灵活。
|
2020-09-25 13:50:48 +08:00
|
|
|
|
|
2022-11-14 14:50:01 +08:00
|
|
|
|
> 注意:如果同时配置了 events 和 onEvent,amis 都会执行,且 onEvent 配置的动作行为会先于 events 执行。
|
2020-09-25 13:50:48 +08:00
|
|
|
|
|
2022-11-14 14:50:01 +08:00
|
|
|
|
步骤如下:
|
2020-09-25 13:50:48 +08:00
|
|
|
|
|
2022-11-14 14:50:01 +08:00
|
|
|
|
1. 在 iframe 页面中定义消息名称和需要传递的数据。获取父级 window,并使用`postMessage`传递数据,格式如下,:
|
2020-09-25 13:50:48 +08:00
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
window.parent.postMessage(
|
|
|
|
|
{
|
|
|
|
|
type: 'amis:detail',
|
|
|
|
|
data: {
|
|
|
|
|
iframeId: '111'
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
'*'
|
|
|
|
|
);
|
|
|
|
|
```
|
2020-07-28 10:03:53 +08:00
|
|
|
|
|
2020-09-25 13:50:48 +08:00
|
|
|
|
`message`格式:
|
2020-07-28 10:03:53 +08:00
|
|
|
|
|
2020-09-25 13:50:48 +08:00
|
|
|
|
- `type`: 标识要触发的 amis 行为,请使用 `amis:xxx` 的格式,这里我们设置为配置好的`detail`事件
|
|
|
|
|
- `data`: 传给 amis 的数据,amis 会将该数据与当前数据域进行合并进行使用
|
2020-07-28 10:03:53 +08:00
|
|
|
|
|
2022-11-14 14:50:01 +08:00
|
|
|
|
2. 在 amis 的 iframe 组件中指明需要监听的消息名称,以及需要执行的动作。
|
|
|
|
|
|
|
|
|
|
```json
|
|
|
|
|
// 方式一:即在 amis 的 iframe 配置项中配置 events 对象
|
|
|
|
|
{
|
|
|
|
|
"type": "iframe",
|
|
|
|
|
"src": "http://www.xxx.com",
|
|
|
|
|
"events": {
|
|
|
|
|
"detail": {
|
|
|
|
|
"actionType": "dialog", // 弹窗动作
|
|
|
|
|
"dialog": {
|
|
|
|
|
"title": "弹框",
|
|
|
|
|
"body": "iframe 传给 amis 的 id 是:${iframeId}" // 在弹框中渲染`"iframe 传给 amis 的 id 是:${iframeId}"`这段模板,即111
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 方式二:即在 amis 的 iframe 配置项中配置 onEvent 对象
|
|
|
|
|
{
|
|
|
|
|
"type": "iframe",
|
|
|
|
|
"src": "http://www.xxx.com",
|
|
|
|
|
"onEvent": {
|
|
|
|
|
"detail": {
|
|
|
|
|
"actions": [
|
|
|
|
|
// 动作 1,弹窗动作
|
|
|
|
|
{
|
|
|
|
|
"actionType": "dialog",
|
|
|
|
|
"dialog": {
|
|
|
|
|
"title": "弹框",
|
|
|
|
|
"body": "iframe 传给 amis 的 id 是:${iframeId}" // 在弹框中渲染`"iframe 传给 amis 的 id 是:${iframeId}"`这段模板,即111
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
// 动作 2,触发指定组件的特性动作
|
|
|
|
|
{
|
|
|
|
|
"actionType": "crud",
|
|
|
|
|
"componentId": "form01",
|
|
|
|
|
"data": {
|
|
|
|
|
"iframeId": "${iframeId}" // 刷新请求参数为`"iframe 传给 amis 的 id 是:${iframeId}"`这段模板,即111
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
2020-07-28 10:03:53 +08:00
|
|
|
|
|
2020-09-25 13:50:48 +08:00
|
|
|
|
## 设置高度自适应
|
|
|
|
|
|
|
|
|
|
默认 amis 中只支持给 iframe 配置固定高度,我们可以通过上面说到的通信机制实现高度自适应。
|
|
|
|
|
|
|
|
|
|
1. 首先在 iframe 页面中获取到页面高度
|
|
|
|
|
2. 通过`amis:resize`事件,将高度信息发送给 amis
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
window.parent.postMessage(
|
|
|
|
|
{
|
|
|
|
|
type: 'amis:resize',
|
|
|
|
|
data: {
|
|
|
|
|
height: 400
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
'*'
|
|
|
|
|
);
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
这样就可以动态设置 iframe 组件高度
|
|
|
|
|
|
|
|
|
|
## 属性表
|
2020-07-28 10:03:53 +08:00
|
|
|
|
|
2022-07-13 10:47:56 +08:00
|
|
|
|
| 属性名 | 类型 | 默认值 | 说明 |
|
|
|
|
|
| -------------- | ------------------ | ---------- | -------------------- |
|
|
|
|
|
| type | `string` | `"iframe"` | 指定为 iFrame 渲染器 |
|
|
|
|
|
| className | `string` | | iFrame 的类名 |
|
|
|
|
|
| frameBorder | `Array` | | frameBorder |
|
|
|
|
|
| style | `object` | | 样式对象 |
|
|
|
|
|
| src | `string` | | iframe 地址 |
|
|
|
|
|
| allow | `string` | | allow 配置 |
|
|
|
|
|
| sandbox | `string` | | sandbox 配置 |
|
|
|
|
|
| referrerpolicy | `string` | | referrerpolicy 配置 |
|
|
|
|
|
| height | `number`或`string` | `"100%"` | iframe 高度 |
|
|
|
|
|
| width | `number`或`string` | `"100%"` | iframe 宽度 |
|