Detect click inside iframe (same domain/sub domain) in Chrome using jQuery

前端 未结 2 494
小蘑菇
小蘑菇 2021-01-16 19:37

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.

2条回答
  •  爱一瞬间的悲伤
    2021-01-16 20:07

    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:

    • XDM tutorial
    • XDM info
    • XDM security #1
    • XDM security #2

提交回复
热议问题