Могут ли события, запущенные из iframe, обрабатываться элементами в родительском?

Предположим, что у меня есть страница, расположенная в www.example.com/foo, и она содержит <iframe> с src="http://www.example.com/bar". Я хочу, чтобы можно было запустить событие из /bar, и его можно услышать /foo. Используя библиотеку Prototype, я пробовал сделать следующее без успеха:

Element.fire(parent, 'ns: frob');

Когда я это делаю, в Firefox 3.5 я получаю следующую ошибку:

Node не может использоваться в документе, отличном от того, в котором он был создан "code:" 4 Строка 0

Не уверен, что это связано с моей проблемой. Есть ли какой-либо механизм безопасности, который предотвращает запуск сценариев в /bar событий в /foo?

Ответ 1

Я еще не тестировал этот кросс-браузер, но он работает в FF.

В iFrame вы можете запустить элемент parent.document:

Event.observe(window, 'load', function() {
  parent.document.fire('custom:event');
});

а в родительском фрейме вы можете поймать его:

document.observe('custom:event', function(event) { alert('gotcha'); });

Ответ 2

События могут обрабатываться функцией, определяемой родительским окном, если iframe является страницей из того же домена (см. статью MDC на Одинаковая политика происхождения); однако события не будут пузыряться от iframe до родительской страницы (по крайней мере, не в моих тестах).

Ответ 3

а затем поймать событие на главной странице, вы можете поймать событие в iframe и вызвать функцию на главной странице.

<-- main page -->
function catchIt()
{
 // code here
}


<-- iframe page -->

function doIt()
{
 top.catchIt(); 
}

<a onclick="doIt();">test</a>

Я думаю, что это сработает, но не проверит его