当前位置:网站首页>iframe使用
iframe使用
2022-08-02 00:17:00 【m0_67403240】
文章目录
iframe的常用属性
属性
说明
name
规定 frame 的名称
width
设置 frame 的宽度
height
设置 frame 的高度
src
设置在 frame 中显示的页面
frameborder
是否显示 frame 的边框(0:不显示边框 1:显示边框)
scrolling
是否显示 frame 中的滚动条( yes | no | auto )
iframe 的常见使用方式
一、获取 window 对象
在页面中嵌入 iframe
子页面如下:
<iframe name="iframeName" id="iframeId" src="./test.html"></iframe>
父页面获取子页面的window对象
1、通过获取 iframe
元素进而通过 contentWindow
属性获取 iframe 中的 window
对象
var iframe = document.getElementById("iframeId"); //获取iframe标签
var iframeContent = iframe.contentWindow; //获取iframe的window对象
var idoc = iframeContent.document; //获取iframe的document对象
2、结合iframe中的 name
属性,通过window提供的 frames
获取
// 打印iframe中页面的window对象
console.log(window.frames['iframeName'].window);
子页面获取父页面的window对象
同理,父页面可以获取子页面的内容,那么子页面也同样能获取父页面内容。在iframe中,可以通过在window上挂载的几个API进行获取.
// 获取上一级的 window 对象,如果还是iframe则是该iframe的window对象
console.log(window.parent)
// 获取最顶级容器的 window 对象,即,就是你打开页面的文档
console.log(window.top)
// 返回自身 window 的引用。
console.log(window.self)
在同源的情况下,父页面和子页面都可以互相获取到对方的 window 对象;
不同源的情况下,即使可以互相获取到对方的 window 对象,也无法对其进行操作,例如触发事件iframe.contentWindow.dispatchEvent(new Event('keyup'))
二、父子页面之间的传值方式
在页面中嵌入 iframe
子页面如下:
<iframe name="iframeName" id="iframeId" src="./test.html"></iframe>
通过 postMessage 进行通信
window.postMessage()
方法可以安全地实现跨源通信。它提供了一种受控机制来进行iframe
跨域页面之间的数据通信,只要正确的使用,这种方法就很安全。
语法:
otherWindow.postMessage(message, targetOrigin, [transfer]);
otherWindow
:其他窗口的一个引用,比如iframe的contentWindow
属性
message
:将要发送到其他 window 的数据。
targetOrigin
:通过窗口的 origin
属性来指定哪些窗口能接收到消息事件,其值可以是字符串"*
"(表示无限制)
transfer
:是一串和 message
同时传递的 Transferable
对象. 这些对象的所有权将被转移给消息的接收方,而发送一方将不再保有所有权。
1、父页面向子页面传值:
父页面:
function postData() {
// 获取 iframe 元素
var id = document.getElementById('iframeId');
// 发送数据,触发子页面的 postMessage 监听事件
id.contentWindow.postMessage('我是父元素传给子元素的数据哦!', '*');
}
// 父页面接受子页面的数据
window.addEventListener('message', (e) => {
console.log(e)
}, false);
子页面:
// 注册 message 消息事件监听,接受数据
window.addEventListener('message', (e) => {
console.log(e)
// 接受到数据后,子页面可以向父页面发送数据,告诉父页面已收到消息
e.source.postMessage("确认收到消息", "*");
}, false);
2、子页面向父页面传值
子页面:
function handleEvent() {
// 发送数据,触发父页面的监听事件
window.postMessage('我是子元素传给父元素的数据哦!', '*');
}
父页面:
// 注册消息事件监听,接受子元素给的数据
window.addEventListener('message', (e) => {
console.log(e)
}, false);
跨域事件传递用例
在实际开发中使用 iframe
时,子页面绑定的事件经常需要通过父页面的某种操作(例如按下键盘)触发。下面演示如何触发:
父页面:
// 用户按下键盘事件
function keyupHandle(e) {
// 将用户按下的键值传给子页面
document.getElementById('iframeId').postMessage({keyCode: e.keyCode}, '*')
}
子页面:
// 注册消息事件监听,接受数据
window.addEventListener('message', (e) => {
switch(e.data.keyCode) {
case 13:
// to do...
...
default: return
}
}, false)
通过本地存储进行通信
父页面将数据存储在本地 localStorage
,然后子页面在本地 localStorage
获取数据
通过 url 进行通信
实现的技巧是利用 location
对象的 hash
值,通过它传递通信数据。在父页面设置 iframe
的 src
后面多加个 data
字符串,然后在子页面中通过某种方式能即时的获取到这儿的 data
就可以了,例如:
1、在子页面中通过 setInterval
方法设置定时器,监听 location.href
的变化即可获得上面的 data
信息,然后子页面根据这个 data
信息进行相应的逻辑处理
2、在vue中还可以使用 watch
监听属性,监听路由 $route
的变化来进行相应的逻辑处理
三种通信方式都可以在不同域的情况下使用
先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦
边栏推荐
- from origin ‘null‘ has been blocked by CORS policy Cross origin requests are only supported for
- [21-Day Learning Challenge] A small summary of sequential search and binary search
- go笔记——map
- Multi-feature fusion face detection based on attention mechanism
- 期货公司开户实力经纪业务的规模
- 管理基础知识14
- bgp 聚合 反射器 联邦实验
- 交返是做日内交易的必要条件
- 什么是低代码(Low-Code)?低代码适用于哪些场景?
- flyway的快速入门教程
猜你喜欢
Don't concatenate strings with jOOQ
请教一下本网站左下角的动漫人物是怎么做的?
C语言实现扫雷游戏
Don't know about SynchronousQueue?So ArrayBlockingQueue and LinkedBlockingQueue don't and don't know?
ERROR 2003 (HY000) Can‘t connect to MySQL server on ‘localhost3306‘ (10061)
ICML 2022 || 局部增强图神经网络GNN,在 GCN 和 GAT基础上 平均提高了 3.4% 和 1.6%
BGP first experiment
C语言函数详解(1)【库函数与自定义函数】
Unknown CMake command "add_action_files"
Unknown CMake command “add_action_files“
随机推荐
An Enhanced Model for Attack Detection of Industrial Cyber-Physical Systems
ERROR 1045 (28000) Access denied for user ‘root‘@‘localhost‘解决方法
C语言实现扫雷游戏
How to find new potential projects?Tools recommended
思维导图,UML在线画图工具
扫雷小游戏
严格模式,use strict
uni-app项目总结
Kotlin协程:创建、启动、挂起、恢复
ES6对箭头函数的理解
Web开发
ROS dynamic parameters
字符串分割函数strtok练习
A simple file transfer tools
How does JSP use the page command to make the JSP file support Chinese encoding?
How to use the go language standard library fmt package
JSP how to obtain the path information in the request object?
测试点等同于测试用例吗
管理基础知识18
BGP 第一次实验