2012-04-26 2 views
0

Мне нужно проверить ситуацию, когда у меня есть родительское окно, на котором размещается iframe, который будет пустым. Мне нужно использовать iframe в качестве прокси-сервера между родительским и междоменным ресурсом. Я создал простой jsfiddle, который должен попытаться отправить сообщение от родителя к дочернему iframe.html5 установка обработчика onmessage для iframe в родительском скрипте

Что я пытаюсь сделать в javascript для родителя, есть обработчик для дочернего iframe, но для жизни меня я не могу понять синтаксис, чтобы заставить его работать правильно. Я попытался с помощью помощника addEvent, чтобы получить событие должным образом добавляемые (для IE и всех остальных) из примеров, которые я видел в современной Javascript Разработка и дизайн:

addEvent: function(obj, type, fn) { 
    if (obj && obj.addEventListener) { 
     obj.addEventListener(type, fn, false); 
    } else if (obj && obj.attachEvent) { 
     obj.attachEvent('on' + type, fn); 
    } 
} 

Путь я сейчас пытаюсь настроить в обработчик OnMessage выглядит следующим образом:

document.getElementById("frame1").onmessage = function(e) { 
    alert(e.data); 
}; 

Я также подумал, что, может быть, мне нужно, чтобы получать доступ к contentWindow элемента, но OnMessage, кажется, не существует.

Есть ли свойство или способ доступа к iframe, чтобы он выглядел как окно и имел бы onmessage, который можно было бы обработать?

Update

я могу увидеть значение OnMessage установить на функцию и даже оповещения (...) из значения, чтобы увидеть, что это действительно моя функция предназначена, но я не вижу, что называется когда postMessage вызывается на дочернем iframe.

ответ

0

Неверная реализация postMessage. Событие onmessage должно быть привязано к окну . Поскольку содержимое фрейма происходит от другого источника, это можно сделать только со стороны фрейма. Вы не можете связать это событие со своей страницы, из-за Same origin policy.

Этот код будет работать, при условии, что та же политика происхождения не в аффекте:

// Bind event to the frame's window object 
var frame1_window = document.getElementById("frame1").contentWindow; 
frame1_window.onmessage = function(e) { 
    alert(e.data); 
}; 
frame1_window.postMessage("Hello from same domain", "http://yourdomainhere.com"); 

Пример (домен: jsfiddle.net): http://jsfiddle.net/zTctZ/3/show/
Пример (домен: fiddle.jshell.net): http://jsfiddle.net/zTctZ/4/

+0

Попытка установить свойство onmessage с помощью document.getElementById (...). ContentWindow для iframe никогда не возвращается из моей js-отладки. Я не вижу той же проблемы, когда пытаюсь установить ее на document.getElementById (...). – ShelbyZ

+0

@ShelbyZ Я включил в свой ответ две демонстрации, которые показывают предупреждение. Я также исправил опечатку: 'vat' должен был быть' var'. –

+0

Таким образом, кажется невозможным только с одним родительским окном и 1 iframe не в том же домене, чтобы фактически обрабатывать onmessage ребенка, потому что это будет нарушать одну и ту же политику происхождения. На этом этапе для iframe потребуется включить другой фрейм, домен которого такой же, как и родитель верхнего уровня для работы. – ShelbyZ

Смежные вопросы