从iframe触发的事件是否可以由其父元素中的元素处理?

all*_*ode 12 javascript firefox prototypejs

假设我有位于页面www.example.com/foo,它包含一个<iframe>src="http://www.example.com/bar".我希望能够发起一个事件/bar并让它被听到/foo.使用Prototype库,我尝试了以下操作但没有成功:

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

当我这样做时,在Firefox 3.5中,我收到以下错误:

节点不能用于创建它的文档以外的文档"代码:"4行0

不确定这是否与我的问题有关.是否有一些安全机制阻止脚本启动/bar事件/foo

Jus*_*son 12

如果父窗口iframe是来自同一域的页面,则可以通过定义父窗口的函数来处理事件(请参阅MDC关于同源策略的文章); 但是,事件不会从iframe父页面冒出来(至少在我的测试中没有).

  • 从[规范](http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-flow-bubbling):"传播将继续到包括文档在内." 重要的是要理解iframe有一个自己的文档元素.再次引用[规范](http://www.w3.org/TR/REC-html40/struct/objects.html#idx-document):"嵌入式文档保持独立于主文档" (5认同)

dsl*_*dsl 6

我还没有测试过这个跨浏览器,但它可以在FF中运行.

在iFrame中,您可以触发元素parent.document:

Event.observe(window, 'load', function() {
  parent.document.fire('custom:event');
});
Run Code Online (Sandbox Code Playgroud)

在父框架中,您可以通过以下方式捕获它:

document.observe('custom:event', function(event) { alert('gotcha'); });
Run Code Online (Sandbox Code Playgroud)