繁体   English   中英

触发从 iframe 到父 window 的自定义事件

[英]Trigger custom event from an iframe to parent window

我正在尝试触发自定义事件并将一些数据从 iframe 传递给父 window。 iframe 和父 window 都是不同的域。

下面是我在 iframe 文档中用于触发自定义事件的代码。

var myCustomData = { foo: 'bar' }
var event = new CustomEvent('testevent', { detail: myCustomData })
window.parent.document.dispatchEvent(event)

下面是我在父文档中用于监听自定义事件的代码。

window.document.addEventListener('testevent', handleEvent, false)
function handleEvent(e) {
  console.log(e.detail);
}

但这会导致以下控制台错误:

Uncaught DOMException: Blocked a frame with origin "http://testiframeevent.local" from accessing a cross-origin frame.

有什么解决办法吗?

您需要使用 postMessage 在窗口/框架之间进行通信。 我只需要做同样的事情,所以这是我实现它的方式:

在 iframe 中包含的文档中...

// sendEvent uses postMessage to send a serialized object to the parent window
function sendEvent( status ) {
    var obj = {
        message_type: 'game_status',
        status: status
    };
    window.parent.postMessage( JSON.stringify(obj), 'http://example.net' ); // change to the domain on which the parent window is located
}

// called such as sendEvent('won');

然后在父 window...

// create and add our event listeners
const winEvent = new CustomEvent( 'gameevent', { detail: { game: 'won' } } );
const loseEvent = new CustomEvent( 'gameevent', { detail: { game: 'lost' } } );

document.addEventListener( 'gameevent', function(e) {
    alert('The game was ' + e.detail.game );
} );

// handleMessage is used to receive a message from the iframe
window.addEventListener( 'message', handleMessage, false );

function handleMessage(event) {
    // ensure the message originated from the same domain the iframe is on
    if (event.origin != 'http://example.com' ) {
        return;
    }
    var eventData = JSON.parse( event.data );
    switch( eventData.message_type ) {
        case 'game_status':
            if ( eventData.status == 'won' ) {
                document.dispatchEvent( winEvent );
            } else {
                document.dispatchEvent( loseEvent );
            }
            break;
    }
}

和 iframe 本身......

<iframe width="100%" height="200" src="http://example.com/iframe-content.php">

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM