Сообщение от da_ff
|
Как этим можно эмулировать postMessage?
|
Например,
так.
Но суть в том, что родительский фрейм может менять это свойство у другого фрейма, даже если последний загружен с другого домена. Соответственно, фрейм может читать свойство своего окна.
В комментариях к приведённому коду говорится о проблемах безопасности, поэтому значением opener является объект VBScript, который из JS изменять нельзя (несоответствие типов).
Пример простейшей реализации такого объекта:
window.someNS.onMessage = function(){}; // Listener
window.execScript(
'Private onMessage\n' +
'Class PostMsg\n' +
'Public Sub postMessage(data, domain)\n' +
'Call onMessage(data, domain)\n' +
'End Sub\n' +
'End Class\n' +
'Set onMessage = window.someNS.onMessage\n' +
'Set window.someNS.onMessage = New PostMsg'
, 'vbscript');
var IEWindowOpener = window.someNS.onMessage; // Присваевается для contentWindow.opener
delete win.someNS.onMessage;
Во фрейме:
(window.opener || window.top).postMessage(msg, '*')
UPD: первый код только для IE, конечно же. Сперва стоит проверять поддержку postMessage через вызов соответствующего события.