0

次のように、数秒ごとにiframeから親ページにメッセージを渡したいです。

Iframe Domain = www.abc.com
Parent Domain = www.xyz.com

確認してください:

誰かが私を助けてくれますか?

4

1 に答える 1

1

私は最近、IFrame間でメッセージを渡すという、非常によく似た懸念を持つ別の人を助けました。(IFrameと親の間のクロスドキュメントメッセージングに関する問題を参照してください)。

前述のトピックでsuamikimから借用しているコードの修正バージョンを使用して、タイマーを統合しました。これはあなたにとって良い出発点として役立つはずです。これらの親と子のhtmlページは、Amadanによる上記のコメントで説明されているようにクロスドメインで機能します。完全に別の信頼できないドメインのchild.htmlを指す1つのドメインにparent.htmlを配置することで、テストして確認しました。

parent.html

<html>
<head>
    <script type="text/javascript">
        function parentInitialize() {
            var count = 0;
            window.addEventListener('message', function (e) {
                // Check message origin etc...
                if (e.data.type === 'iFrameRequest') {
                    var obj = {
                        type: 'parentResponse',
                        responseData: 'Response #' + count++
                    };
                    e.source.postMessage(obj, '*');
                }
                // ...
            })
		}
    </script>
</head>
<body style="background-color: rgb(72, 222, 218);" onload="javascript: parentInitialize();">
    <iframe src="child.html" style="width: 500px; height:350px;"></iframe>
</body>
</html>

child.html

<html>
<head>
    <script type="text/javascript">
        function childInitialize() {
            // ...

            try {
                if (window.self === window.top) {
                    // We're not inside an IFrame, don't do anything...
                    return;
                }
            } catch (e) {
                // Browsers can block access to window.top due to same origin policy.
                // See https://stackoverflow.com/a/326076
                // If this happens, we are inside an IFrame...
            }

            function messageHandler(e) {
                if (e.data && (e.data.type === 'parentResponse')) {
                    // Do some stuff with the sent data
                    var obj = document.getElementById("status");
                    obj.value = e.data.responseData;
                }
            }

            window.addEventListener('message', messageHandler, false);

            setInterval(function () {
                window.parent.postMessage({ type: 'iFrameRequest' }, '*');
            }, 1000);
            // ...
        }
    </script>
</head>
<body style="background-color: rgb(0, 148, 255);" onload="javascript: childInitialize();">
    <textarea type="text" style="width:400px; height:250px;" id="status" />
</body>
</html>

幸運を!

于 2016-10-27T17:22:03.833 に答える