ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

修改iframe内部元素的样式

2022-09-05 15:32:31  阅读:206  来源: 互联网

标签:body 跨域 父级 样式 元素 修改 iframe document iframe参数


1. HTMLIFrameElement.contentDocument

使用这个方法获取页面iframe中的dom对象,注意可能会有下面两种结果:

1.1 如果iframe和它的父级在同一个域名下,那么这个方法返回document(是一个嵌套的浏览器上下文环境)

1.2 如果iframe和它的父级不在同一个域名下,那么这个方法返回null

有了上面的这个原则,我们就知道在不跨域的情况下我们能够更容易的修改iframe内部元素的样式,跨域情况则无法获取到iframe内部的元素,只能通过其他方式来达到目的(下面会介绍),首先来看下不跨域是怎样做的

2. 不跨域修改iframe中元素的样式

方式1:直接获取到元素修改

let iframeDocument = document.getElementsByTagName("iframe")[0].contentDocument;

iframeDocument.body.style.backgroundColor = "blue";
// This would turn the iframe blue.

通过上面的操作,把iframe中body的背景色修改为“blue”

方式2:在iframe的head中插入样式表

// 借助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="style.css">')
    );
});

// style.css
body {
    background-color: aqua;
}

这样我们就修改了iframe中body的背景色。

3. 跨域修改iframe中元素的样式

使用到的方法如下:

3.1 Window.postMessage()

3.2. window.addEventListener(“message”,cb())

父级页面中引入了一个不同域名下的iframe,第一,需要在父级页面发送信息,第二,在iframe页面内监听并处理信息,来间接的修改样式。这是为了保证跨域通信的安全,详细内容参考 这里

下面介绍具体做法:
父级页面引入了一个跨域的iframe,id为i3

<iframe id="i3" src="./cross.html" onl oad="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
<!DOCTYPE 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的背景色。并且在这里我们可以做一下是否同源的安全校验。

标签:body,跨域,父级,样式,元素,修改,iframe,document,iframe参数
来源: https://www.cnblogs.com/yejt/p/16658308.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有