js postMessage实现iframe同步滚动对比-CSDN博客

409 阅读1分钟

在这里插入图片描述

注意:不能用绝对路径打开html,否则报错 Failed to execute 'postMessage' on 'DOMWindow': The target origin provided ('null') does not match the recipient window's origin ('null').

1.index.html
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <iframe src="./A.html" frameborder="0" id="myframeA"></iframe>
    <iframe src="./B.html" frameborder="0" id="myframeB"></iframe>
</body>
<script>
    window.addEventListener('message', function(data) {
        var { page, data } = data.data;
        if (page == 'a') {
            document.getElementById("myframeB").contentWindow.postMessage({
                data: data
            }, '*');
        } else if (page == 'b') {
            document.getElementById("myframeA").contentWindow.postMessage({
                data: data
            }, '*');
        }
    })
</script>

</html>
2.A.html
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <p>A1</p>
    <p>A2</p>
    <p>A3</p>
    <p>A4</p>
    <p>A5</p>
    <p>A6</p>
 	...
    <p>A98</p>
    <p>A99</p>
    <p>A100</p>
</body>
<script>
    var a = true //用于避免手动设置scrollTop 时触发scroll事件,整个页面抖动
    window.onscroll = function() {
        if (a) {
            window.parent.postMessage({ page: 'a', data: document.documentElement.scrollTop })
        } else {
            a = true
        }
    }
    window.addEventListener('message', function(data) {
        a = false
        document.documentElement.scrollTop = data.data.data
    })
</script>

</html>
3.B.html
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <p>B1</p>
    <p>B2</p>
    <p>B3</p>
    <p>B4</p>
    <p>B5</p>
    <p>B6</p>
 	...
    <p>B98</p>
    <p>B99</p>
    <p>B100</p>
</body>
<script>
    var b = true //用于避免手动设置scrollTop 时触发scroll事件,整个页面抖动
    window.onscroll = function() {
        if (b) {
            window.parent.postMessage({ page: 'b', data: document.documentElement.scrollTop })
        } else {
            b = true
        }
    }
    window.addEventListener('message', function(data) {
        b = false
        document.documentElement.scrollTop = data.data.data
    })
</script>

</html>