Js的iframe相关问题,如何判断当前是否在iframe中,iframe和它的父窗口如何通信
一、前言:
在web中,为了丰富我们的内容,往往需要引用其它HTML文件,这时候就需要用到 iframe 标签,本文就主要记录一下使用iframe所需要注意的问题
iframe 所使用的环境(笔者所遇到的)
1. web代码兼容 PC端 和 移动端,这时候就想在移动端时把页面限制在固定的宽高范围中,于是就使用 iframe 把 相关页面限制在其中
2. web引用别人的 HTML 内容,就使用iframe 来实现
二、遇到的问题:
1. 如何判断当前是否在iframe中
//
if (self.frameElement && self.frameElement.tagName == "IFRAME") {
alert('在iframe中');
} //
if (window.frames.length != parent.frames.length) {
alert('在iframe中');
} //
if (self != top) {
alert('在iframe中');
}
说明:
- 三种方式都是根据当前的窗口层级进行判断,
- 以上是针对有 <frameset> 或者 <iframe> 的页面,
- self.frameElement 可以获取到当前的 iframe 节点(如果有的话),否则为null
解释:window、top、parent、self 之间的联系和区别
- window : 当前窗口
- top: 顶层窗口,针对有很多层的iframe
- parent: 父级窗口,即当前窗口的上一层窗口
- self: 当前窗口,和window、window.self 等价
2. iframe 和 它的父窗口如何通信
注意有两种情况:
- iframe 和 父窗口 同源(即不会跨域,相同域名下),可以直接使用 节点 或 window 调用
- iframe 获取父窗口节点:parent.window.document.getElementById("parentNode")
- iframe 调用父窗口方法:parent.parentFunc();
- 父窗口获取 iframe节点:iframeObj.contentWindow.document.getElementById("childNode")
- this.myFrame表示 iframe对象
var obj=document.getElementsByTagName("iframe")[0].contentWindow;
var ifmObj=obj.document.getElementById("childNode");
var obj=document.getElementsByTagName("iframe")[0].contentWindow;
obj.parentFunc();
父窗口调用 iframe方法:iframeObj.contentWindow.parentFunc()
- iframe 和 父窗口 跨域(一般是调用别人的HTML )
- 必须使用安全的 postMessage方式来进行通信
// 向父窗口传值
window.parent.postMessage({code: 1, msg: '向父窗口传值'},*); // 向iframe传值
document.getElementsByTagName("iframe")[0].contentWindow.postMessage({code: 2, msg: '向iframe传值'},*); // 接收传值
window.addEventList('message', (e) => {
try{
if (e.data type e.data ==='string' ) {
console.log(e.data);
}
} catch (err) {
console.log(err)
}
});event.source:发送消息的窗口,可以通过区分网址来接收消息event.origin: 消息发向的网址,同上event.data: 消息内容
说明:
otherWindow.postMessage(message,targetOrigin,[transfer]);
otherWindow: 其他窗口的一个引用,比如iframe的contentWindow属性、执行window.open返回的窗口对象、或者是命名过或数值索引的window.frames;
message: 将要发送到其他window的数据,这个数据会自动被序列化,数据格式也不受限制,String字符串,对象(包括JSON)都可以;
targetOrigin: 通过窗口的origin属性来指定哪些窗口能接收到消息事件,这个值可以是"*"(表示无限制),或者一个URI。在发送消息的时候,如果目标窗口的协议、主机地址或者端口这三个的任意一项不匹配targetOrigin提供的值,那么消息就不会被发送。如果你明确的知道消息应该发送到哪个窗口,那么请始终提供一个有确切值的targetOrigin,而不是*。不提供确切的目标将导致数据泄露到任何对数据感兴趣的恶意站点。
transfer(可选): 是一串和message 同时传递的
Transferable对象. 这些对象的所有权将被转移给消息的接收方,而发送一方将不再保有所有权。
三、最后
具体请看MDN: window.postMessage
Js的iframe相关问题,如何判断当前是否在iframe中,iframe和它的父窗口如何通信的更多相关文章
- iframe中的模态框遮罩父窗口原理
关键点: css的position定位为fixed或absolute css的z-index, 最顶层的值最大如遮罩层为0那么弹出框最好是大于等于1的整数,总之记住弹出层要比遮罩的z-index值大就 ...
- 高并发分布式系统中生成全局唯一(订单号)Id js返回上一页并刷新、返回上一页、自动刷新页面 父页面操作嵌套iframe子页面的HTML标签元素 .net判断System.Data.DataRow中是否包含某列 .Net使用system.Security.Cryptography.RNGCryptoServiceProvider类与System.Random类生成随机数
高并发分布式系统中生成全局唯一(订单号)Id 1.GUID数据因毫无规律可言造成索引效率低下,影响了系统的性能,那么通过组合的方式,保留GUID的10个字节,用另6个字节表示GUID生成的时间(D ...
- JS中iframe相关的window.self,window.parent,window.top
window.self指的是当前窗口:他等价于window,self,window.self window.top指的是最顶层的窗口(有些页面可能会嵌套好几个iframe)如果只有一个窗口,那么就返回 ...
- soso官方:基于相关排序的判断
http://www.wocaoseo.com/thread-186-1-1.html 议程 概述 检索词 用户的信息需求 网页的自有信息 网页的附属信息 相关性的计算框架 概述 相关性的表象 检索词 ...
- JS框架设计之对象类型判断一种子模块
Javascript有两套数据类型,一套是基础数据类型,一套是对象数据类型.基础数据类型包括5种基本数据类型,分别是null,bool,undefined,number,string,也叫简单数据类型 ...
- jquery 实践操作:iframe 相关操作
此篇记录关于HTML 的 iframe 元素 的相关记录 定义:iframe 元素会创建包含另外一个文档的内联框架(即行内框架). 常用的基本 iframe 设置(详细设置属性参考API:http:/ ...
- JS、JQ相关小技巧积攒
JS.JQ相关小技巧积攒,以备不时之需. 1.js 获取时间差:时间戳相减.new Date().getTime() 获得毫秒数,除以(1000*60*60*24) 获得天数. 2.重定向操作:页面 ...
- JS判断网页是否在微信中打开/
JS判断网页是否在微信中打开,代码如下: <script type="text/javascript"> function is_weixn(){ var ua = n ...
- JS读取UserAgent信息并做判断
JS读取UserAgent信息并做判断 userAgent信息可以由navigator.userAgent拿到.例子: <script type="text/javascript&qu ...
随机推荐
- shell 判断大小
test.sh #!/bin/bash read -p "" a read -p "" b if [ $a -eq $b ];then echo "= ...
- MVC框架模式和Javaweb经典三层架构
一.MVC设计模式 1.MVC的概念 首先我们需要知道MVC模式并不是javaweb项目中独有的,MVC是一种软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(Vie ...
- 【CSP膜你赛】大逃亡
题目描述 魔王撒旦为了建立魔物的乐土,率领亚多拉玛雷克.艾谢尔.路西菲尔.以 及马纳果达这四位恶魔大元帅进攻人类世界.然而此时手持圣剑的勇者艾米莉亚出现了. 战败的魔王逃跑时穿越到了地球,以真奥贞夫 ...
- 多浏览器书签同步插件EverSync
有时上网时会遇到浏览器不能正常显示的问题.(比如我的火狐浏览器无法正确显示微信公众号管理后台,在chrome上可以正常显示),所以我的电脑里安装了chrome和firefox两个浏览器.但是时间长了, ...
- 使用Sabaki和Leela Zero配置AI围棋对弈环境
求 李昌镐儿童围棋课堂 的pdf. 一.下载Sabaki和Leela Zero最新版本 二.安装Sabaki 三.安装leela zero 四.Sabaki配置leela zero引擎 五.Sabak ...
- JAVA获取树形结构
package com.nnmzkj.common.dto; import lombok.Data; import java.io.Serializable;import java.util.Arra ...
- PMP 第4章错题总结
变更步骤: 1.配置管理活动:配置识别.配置状态记录.配置核实与审计2.项目章程中记录项目的目的和总体预算3.变更控制系统规定了变更管理流程及批准的权限4.项目章程是授权项目经理动用组织资源的文件5. ...
- ubuntu下编译C++程序
1.CMake 定义:CMake是一个跨平台编译工具,可以用来自动输出makefile文件: 用法:(1)想要自动生成makefile,还需要编写对应的CMakeLists.txt文件: (2)在CM ...
- netty-websocket-spring-boot-starter不同url端口复用
netty-websocket-spring-boot-starter是一个基于netty的websocket服务端,目前笔者使用的版本依托于Springboot.官方网址https://github ...
- EasyDSS高性能RTMP、HLS(m3u8)、HTTP-FLV、RTSP流媒体服务器软件二次开发接口对接说明示列
EasyDSS相关功能 EasyDSS流媒体服务器软件,提供一站式的转码.点播.直播.时移回放服务,极大地简化了开发和集成的工作.其中,点播版本主要包含:上传.转码.分发.直播版本主要包含:直播.录像 ...