收听iFrame中的事件

sdv*_*ksv 11 javascript iframe jquery

所以我有一个主页面(a)和一个预览页面(b)通过iframe嵌入主页面.页面(b)触发特殊事件:

$(document).trigger('preview.compiled');
Run Code Online (Sandbox Code Playgroud)

现在我希望主页面(a)收听此事件并执行以下操作:

$('iframe').contents().on('preview.compiled', function() {
    console.log('Success');
});
Run Code Online (Sandbox Code Playgroud)

但是,上面的代码不起作用.有任何想法吗?

Pat*_*ans 5

jQuery trigger()仅触发通过.on()其自己的实例添加的回调。因此,iframe中的jQuery只会触发使用该实例设置的回调,而不会触发通过主页的jQuery实例设置的任何回调。

您可以调用dispatchEvent()自己的事件对象传递

document.dispatchEvent(new Event('preview.compiled'));
Run Code Online (Sandbox Code Playgroud)

或者可以在现代浏览器中使用window.onMessage / window.postMessageBroadcast Channel API

window.onMessage / window.postMessage,检查浏览器支持

//in main window
window.addEventListener('message',function(message){
  if(message.data.type=="preview.compiled"){
    //do something
  }
});

//in iframe
parent.postMessage({
  type:'preview.compiled",
  other:"other data to pass"
},"url of main window");
Run Code Online (Sandbox Code Playgroud)

广播频道API onMessage / postMessage,检查浏览器支持

//Main window
var bc = new BroadcastChannel('preview:compiled');
bc.onmessage = function(message){
   console.log(message.data);
};

//iframe
var bc = new BroadcastChannel('preview:compiled');
bc.postMessage('Some data');
Run Code Online (Sandbox Code Playgroud)