2012-03-14 8 views
4

Спектр говорит, что я должен использовать postMessage() для объекта window. Mozilla says, я тоже смогу сделать это в окне open() 'd.Поддерживает ли HTML5 кросс-оконные сообщения?

Тем не менее, я использовал пример postMessage от Robert Nyman и попытался заставить его работать across windows. Однако ни IE10, ни Chrome, похоже, не предоставляют функцию postMessage для недавно открытого окна.

var target = … // original declaration 
popoutbutton.onclick = function(evt) { 
    realWin = window.open(iframeWin.frameElement.src, "window1", "width=600,height=400,status=yes,scrollbars=no,resizable=yes"); 
    target = realWin; 
    target.focus(); 
}; 

// …snip… 

target.postMessage(myMessage.value, expectorigin); // <-- fails because target.postMessage() is undefined 

Я что-то упустил или эта функция просто еще не существует?

- обновление ниже -

Предварительный разработчик просто не кажется, чтобы сделать это. Я попробовал еще раз с предварительного просмотра. IE10 (сборка 8250) нравится в ожидании. Спасибо за вашу помощь!

+1

Ваш пример здесь работает на Opera – Andre

+0

Какую версию оперы вы используете? Окно pop'd out не работает на моей установке версии 11.61. –

+1

Не могли бы вы создать небольшую демонстрационную версию JSFiddle для работы? – Domenic

ответ

0

Я могу заставить его работать в Chrome 15.0.874.121, хотя в вашем примере вы вызываете target.postMessage, прежде чем вы откроете окно, хотя вы пропустили любой исходный код target.

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

В Internet Explorer 10 Я получаю сообщение об ошибке SCRIPT16388: Operation Aborted всякий раз, когда я пытаюсь выполнить сценарий, даже если я жду 10 секунд.

+0

Как я пропустил это раньше? Проверено и работает сейчас в Chrome. –

+0

Я тоже нашел эту ошибку в IE10, и это происходит, когда открытое окно пытается вызвать родителя, и которое это сделает postMessage. Трюк, чтобы исправить это, - это обернуть postMessage в setTimeout 0ms. Я буду следить за Internet Explorer, чтобы узнать, почему это происходит. – jsgoupil

1

Там есть лучший способ, чем PostMessage, увидеть это:

http://carlosaguayo.posterous.com/html5-localstorage-events-cross-window-messag

+0

Это хорошая идея. Однако я не уверен, что это будет лучше, чем отправка сообщений напрямую. –

+1

Это лучше, так как вам не нужно сохранять ссылку на окно. Скажем, что пользователь почему-то обновляет либо окно, либо всплывающее окно, либо родительский элемент, после чего ссылка исчезает, и вся ваша логика ломается. Используя localStorage, вам не нужно отслеживать всплывающие окна. –

+0

Трансформация широковещательной модели открывает мир головных болей. Представьте, что вы слушаете сообщение «Добавить контакт». Теперь представьте, что у вас есть две вкладки, открытые для одной и той же страницы. Если вы не управляете условиями гонки и какая вкладка «хозяин», вы получите дубликаты. Также: Друг не позволяет друзьям использовать всплывающие окна. –

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

  • Нет связанных вопросов^_^