This question has been asked a lot, and the answers are usually similar.
In basic terms, I need a function to perform when the contents of an iframe are clicked.
Here is an example I've put together on jsFiddle that demonstrates one way to use XDM: This is the demo and it includes this fiddle as a child iframe
HTML (parent):
Parent window
JavaScript (parent):
// parent_on_message(e) will handle the reception of postMessages (a.k.a. cross-document messaging or XDM).
function parent_on_message(e) {
console.log("parent_on_message event fired: ", e);
// You really should check origin for security reasons
// https://developer.mozilla.org/en-US/docs/DOM/window.postMessage#Security_concerns
if (e.origin.search(/^http[s]?:\/\/.*\.jshell\.net/) != -1
&& !($.browser.msie && $.browser.version <= 7)) {
var returned_pair = e.data.split('=');
if (returned_pair.length != 2)
return;
if (returned_pair[0] === 'message-for-parent') {
$("p#parent-message").html(returned_pair[1]);
}
else
console.log("Parent received invalid message");
}
}
jQuery(document).ready(function($) {
// Setup XDM listener (except for IE < 8)
if (!($.browser.msie && $.browser.version <= 7)) {
// Connect the parent_on_message(e) handler function to the receive postMessage event
if (window.addEventListener)
window.addEventListener("message", parent_on_message, false);
else
window.attachEvent("onmessage", parent_on_message);
}
$("button#parent-to-child-button").on("click", function(e) {
console.log("Sending: " + $("input#message-for-child").attr("value"));
$("iframe#child").get(0).contentWindow.postMessage('message-for-child=' + $("input#message-for-child").attr("value"), '*');
});
});
HTML (child):
Child
JavaScript (child):
// child_on_message(e) will handle the reception of postMessages (a.k.a. cross-document messaging or XDM).
function child_on_message(e) {
console.log("child_on_message event fired: ", e);
// You really should check origin for security reasons
// https://developer.mozilla.org/en-US/docs/DOM/window.postMessage#Security_concerns
if (e.origin.search(/^http[s]?:\/\/.*\.jshell\.net/) != -1
&& !($.browser.msie && $.browser.version <= 7)) {
var returned_pair = e.data.split('=');
if (returned_pair.length != 2)
return;
if (returned_pair[0] === 'message-for-child') {
$("p#child-message").html(returned_pair[1]);
}
else
console.log("Child received invalid message");
}
}
jQuery(document).ready(function($) {
// Setup XDM listener (except for IE < 8)
if (!($.browser.msie && $.browser.version <= 7)) {
// Connect the child_on_message (e) handler function to the receive postMessage event
if (window.addEventListener)
window.addEventListener("message", child_on_message , false);
else
window.attachEvent("onmessage", child_on_message );
}
$("button#child-to-parent-button").on("click", function(e) {
console.log("Sending: " + $("input#message-for-parent").attr("value"));
parent.window.postMessage('message-for-parent=' + $("input#message-for-parent").attr("value"), '*');
});
});
Further reading: