Междоменная связь от родительского к дочернему iFrame с использованием Javascript

Мне нужно передать данные с веб-страницы в iFrame, размещенный на этой веб-странице. Я использовал окно.postMessage. однако iFrame не получает событие.

Вот мой фрагмент кода. Родительская страница:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
    <title>Test event listener</title>
</head>
<body>
<script type="text/javascript">
function SendMsgToIFrame() {
    alert("In Parent window ");
    var myiframe = document.getElementById('myIframe');
    if (myiframe.contentDocument) {
        myiframe.contentDocument.postMessage('Post Message from Parent', '*');
    }
    else if (myiframe.contentWindow) {
        myiframe.contentWindow.postMessage('Post Message from Parent', '*');
    }
</script>
<button type="button" onclick="SendMsgToIFrame()">Push to iframe</button>
<div id="iframeDiv">
<iframe id="myIframe" src="http://localhost:50000/Receiver.htm" width="500" height="200" frameborder=10> 
</iframe>
</div>
</body>
</html>

Фрагмент кода для Receiver.htm:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
    <title>Got Text</title>
</head>
<body>
<script type="text/javascript">
    window.attachEvent("onMessage", myhandler);

    function myhandler(mobj) {
        alert("I am in iFrame");
        var message = mobj.data;

        alert("data: " + message);
    }
</script>
<input type="text" name="text1" id="text1" value="text here" /> 
</body>
</html>

Я запускаю родительскую страницу на Tomcat (localhost:8080). iFrame работает на моем HTTP-сервере, который я создал с помощью httplistener. Когда я запускаю родительскую страницу и нажимаю кнопку, которая генерирует событие, я не получаю предупреждение «Я в iFrame». Похоже, iFrame вообще не получает событие. Что мне здесь не хватает? Любая помощь очень ценится. Спасибо!


person Betty Thomas    schedule 10.05.2013    source источник


Ответы (3)


В вашем коде есть несколько странных частей. Вы используете attachEvent вместо addEventListener, и вам, вероятно, следует публиковать в contentWindow, а не в документе.

person Halcyon    schedule 10.05.2013
comment
Я использую IE8.addEventListener не будет работать с IE8. AttachEvent — правильный метод для IE8. Я отправляю в окно содержимого. Моя точка останова достигает этой строки. - person Betty Thomas; 11.05.2013

Проблема с моим кодом заключалась в следующем: window.attachEvent("onMessage", myhandler)

onmessage должен быть весь в нижнем регистре. Как только я изменил эту строку на приведенную ниже, это сработало.

window.attachEvent("onmessage", myhandler)
person Betty Thomas    schedule 11.05.2013

Я разместил ответ здесь: изменение размера javascript между доменами iframe

И эта ссылка также содержит ссылку на образец рабочего кода на github.

person ppetree    schedule 08.10.2013