Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   opera window.postMessage (https://javascript.ru/forum/misc/26751-opera-window-postmessage.html)

trololo 20.03.2012 19:29

opera window.postMessage
 
есть скрипт, вроде этого
var a={
    ctor:function(){
        a.target=document.getElementById('frame').contentWindow;
        a.send(1);
    },
    target:null,
    send:function(b){
        a.target.postMessage(a,'http://domain2.com')
    }
}
window.load=a.ctor();

send не посылает сообщение на указанный домен, который есть на странице . никаких ошибок нет, вообще ни чего. но вот если перед a.target.postMessage(a,'http://domain2.com') вызвать alert() то всё отлично работает и сообщение отправляется. alert не важно какой. хоть пустой.. что это за баг такой? это наблюдается как в opera так и firefox

Kolyaj 20.03.2012 21:35

Фрейм загрузиться, видимо, не успевает.

trololo 20.03.2012 21:43

Цитата:

Сообщение от Kolyaj (Сообщение 164175)
Фрейм загрузиться, видимо, не успевает.

да, скорее всего это причина. а как проверить перед отправкой, готов ли фрейм? сразу приходит мысль, повесить на фрейм обработчик onload который установит флаг готовности. а перед отправкой запустить вечный цикл который будет завершатся если флаг установлен. если это быдлокод, посоветуйте решение получше..

неее.. вечный цикл это я поспешил.. практически вешает оперу :D

upd: в общем поставил проверку, если флаг установлен отправляем, если нет через setTimeout вызываем себя же через секунду. вроде работает..

Kolyaj 20.03.2012 21:56

JavaScript однопоточный, поэтому вечный цикл не позволит исполнится чему-либо ещё.

Нужно ловить load у фрейма, да.

Цитата:

Сообщение от trololo
window.load=a.ctor();

Это, кстати, не установка события, а просто вызов a.ctor().

trololo 20.03.2012 22:06

Цитата:

Сообщение от Kolyaj (Сообщение 164177)
JavaScript однопоточный, поэтому вечный цикл не позволит исполнится чему-либо ещё.

Нужно ловить load у фрейма, да.


Это, кстати, не установка события, а просто вызов a.ctor().

но вызов происходит после загрузки окна, верно? а если да, то чем это хуже addEventListener?

Kolyaj 20.03.2012 22:59

Нет, вызов происходит в момент присваивания. Вы же вызываете ctor.


Часовой пояс GMT +3, время: 07:57.