修改iframe内部元素的样式
HTMLIFrameElement.contentDocument
使用这个方法获取页面iframe中的dom对象,注意可能会有下面两种结果:
- 如果iframe和它的父级在同一个域名下,那么这个方法返回document(是一个嵌套的浏览器上下文环境)
- 如果iframe和它的父级不在同一个域名下,那么这个方法返回null
有了上面的这个原则,我们就知道在不跨域的情况下我们能够更容易的修改iframe内部元素的样式,跨域情况则无法获取到iframe内部的元素,只能通过其他方式来达到目的(下面会介绍),首先来看下不跨域是怎样做的。
不跨域修改iframe中元素的样式
方式1:直接获取到元素修改
-
let iframeDocument = document.getElementsByTagName("iframe")[0].contentDocument;
-
-
iframeDocument.body.style.backgroundColor = "blue";
-
// This would turn the iframe blue.
或者参考:
-
let iframeDocument = document.querySelector('iframe')
-
iframeDocument.onload = function () {
-
let div = iframeDocument.contentWindow.document
-
div.getElementsByClassName('logo-img')[0].style.fontSize = '20px'
-
}
通过上面的操作,把iframe中body的背景色修改为“blue”
方式2:在iframe的head中插入样式表
-
// 页面上有一个id为i1的iframe,它嵌入的是同源的文件 child.html
-
<iframe id="i1" src="./child.html" frameborder="0" width="100%" height="400"></iframe>
-
-
// 借助jQuery在iframe加载后,向其内部插入style.css
-
$('#i1').load(function () {
-
-
let cssLink = document.createElement("link");
-
cssLink.href = "style.css";
-
cssLink.rel = "stylesheet";
-
cssLink.type = "text/css";
-
$('#i1')
-
.contents().find("head")
-
.append($('<link rel="stylesheet" type="text/css" href="https://blog.csdn.net/helloxiaoliang/article/details/style.css">')
-
);
-
});
-
-
// style.css
-
body {
-
background-color: aqua;
-
}
这样我们就修改了iframe中body的背景色。
跨域修改iframe中元素的样式
使用到的方法如下:
- Window.postMessage()
- window.addEventListener(“message”,cb())
父级页面中引入了一个不同域名下的iframe,第一,需要在父级页面发送信息,第二,在iframe页面内监听并处理信息,来间接的修改样式。这是为了保证跨域通信的安全,详细内容参考 这里。
下面介绍具体做法:
父级页面引入了一个跨域的iframe,id为i3
-
<iframe id="i3" src="./cross.html" onload="load()"></iframe>
-
-
// 在它加载完成后,执行下面的方法
-
function load() {
-
console.log('loaded')
-
activateTheme("light");
-
}
-
-
// 这里我们封装了一个activateTheme方法,方便后边复用,作用是修改iframe内部的主题颜色
-
function activateTheme(theme) {
-
var iframe = document.getElementById("i3");
-
if (iframe && iframe.contentWindow) {
-
iframe.contentWindow.postMessage(theme, "*");
-
}
-
}
当iframe加载完成后,我们向它内部传递了activateTheme(“light”);浅色主题的消息,下面看下它内部如何接收并做出响应:
-
// cross.html
-
-
<html lang="en">
-
<head>
-
<meta charset="UTF-8">
-
<meta http-equiv="X-UA-Compatible" content="IE=edge">
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
-
<title>child</title>
-
<style>
-
body,
-
body.theme-light {
-
background-color: #ededed;
-
padding: 1rem;
-
}
-
-
body.theme-dark {
-
background-color: #444;
-
color: #fff;
-
}
-
</style>
-
</head>
-
<body>
-
<script>
-
window.addEventListener("message",
-
function (event) {
-
if (event.origin === window.location.origin) {
-
console.log(event.data)
-
document.body.classList = []
-
document.body.classList.add(`theme-${event.data}`)
-
}
-
}, false
-
);
-
</script>
-
</body>
-
</html>
可以看出,我们在接收到父级传来的消息,根据消息的内容来修改了cross.html body的背景色。并且在这里我们可以做一下是否同源的安全校验。
到这里我们可以得出一个结论:如果你嵌入的iframe页面和父级不是同一域下,而且当你可以在iframe页面中监听事件,这样你才能修改它内部的样式,否则无法修改。
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgbckei
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01