How to use JavaScript to access cross domain iFrame content?

后端 未结 6 1306
时光说笑
时光说笑 2021-01-28 16:20

I would like to use this code

window.parent.document.getElementById(\'message\').value  += \"\\r\\n\\r\\n[img]\"+response+\"[/img]\";

It works

相关标签:
6条回答
  • 2021-01-28 16:55

    As stated, this falls under same origin policy, but there are some tricks that allow limited communication with the iframe. Take a look at http://ajaxify.com/run/crossframe/

    0 讨论(0)
  • 2021-01-28 16:59

    Due to same origin policy restrictions this is not allowed.

    0 讨论(0)
  • 2021-01-28 17:00

    You can implement window.postMessage to communicate accross iframes/windows across domains.

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta http-equiv="content-type" content="text/html; charset=utf-8" />
        <title></title>
    
        <!--
        <link rel="shortcut icon" href="/favicon.ico">
    
    
        <link rel="start" href="http://benalman.com/" title="Home">
    
        <link rel="stylesheet" type="text/css" href="/code/php/multi_file.php?m=benalman_css">
    
        <script type="text/javascript" src="/js/mt.js"></script>
        -->
        <script type="text/javascript">
            // What browsers support the window.postMessage call now?
            // IE8 does not allow postMessage across windows/tabs
            // FF3+, IE8+, Chrome, Safari(5?), Opera10+
    
            function SendMessage()
            {
                var win = document.getElementById("ifrmChild").contentWindow;
    
                // http://robertnyman.com/2010/03/18/postmessage-in-html5-to-send-messages-between-windows-and-iframes/
    
    
                // http://stackoverflow.com/questions/16072902/dom-exception-12-for-window-postmessage
                // Specify origin. Should be a domain or a wildcard "*"
    
                if (win == null || !window['postMessage'])
                    alert("oh crap");
                else
                    win.postMessage("hello", "*");
                //alert("lol");
            }
    
    
    
            function ReceiveMessage(evt) {
                var message;
                //if (evt.origin !== "http://robertnyman.com")
                if (false) {
                    message = 'You ("' + evt.origin + '") are not worthy';
                }
                else {
                    message = 'I got "' + evt.data + '" from "' + evt.origin + '"';
                }
    
                var ta = document.getElementById("taRecvMessage");
                if (ta == null)
                    alert(message);
                else
                    document.getElementById("taRecvMessage").innerHTML = message;
    
                //evt.source.postMessage("thanks, got it ;)", event.origin);
            } // End Function ReceiveMessage
    
    
    
    
            if (!window['postMessage'])
                alert("oh crap");
            else {
                if (window.addEventListener) {
                    //alert("standards-compliant");
                    // For standards-compliant web browsers (ie9+)
                    window.addEventListener("message", ReceiveMessage, false);
                }
                else {
                    //alert("not standards-compliant (ie8)");
                    window.attachEvent("onmessage", ReceiveMessage);
                }
            }
        </script>
    
    
    </head>
    <body>
    
        <iframe id="ifrmChild" src="child.htm" frameborder="0" width="500" height="200" ></iframe>
        <br />
    
    
        <input type="button" value="Test" onclick="SendMessage();" />
    
    </body>
    </html>
    

    Child.htm

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta http-equiv="content-type" content="text/html; charset=utf-8" />
        <title></title>
    
        <!--
        <link rel="shortcut icon" href="/favicon.ico">
    
    
        <link rel="start" href="http://benalman.com/" title="Home">
    
        <link rel="stylesheet" type="text/css" href="/code/php/multi_file.php?m=benalman_css">
    
        <script type="text/javascript" src="/js/mt.js"></script>
        -->
    
        <script type="text/javascript">
            /*
            // Opera 9 supports document.postMessage() 
            // document is wrong
            window.addEventListener("message", function (e) {
                //document.getElementById("test").textContent = ;
                alert(
                    e.domain + " said: " + e.data
                    );
            }, false);
            */
    
            // https://developer.mozilla.org/en-US/docs/Web/API/window.postMessage
            // http://ejohn.org/blog/cross-window-messaging/
            // http://benalman.com/projects/jquery-postmessage-plugin/
            // http://benalman.com/code/projects/jquery-postmessage/docs/files/jquery-ba-postmessage-js.html
    
            // .data – A string holding the message passed from the other window.
            // .domain (origin?) – The domain name of the window that sent the message.
            // .uri – The full URI for the window that sent the message.
            // .source – A reference to the window object of the window that sent the message.
            function ReceiveMessage(evt) {
                var message;
                //if (evt.origin !== "http://robertnyman.com")
                if(false)
                {
                    message = 'You ("' + evt.origin + '") are not worthy';
                }
                else
                {
                    message = 'I got "' + evt.data + '" from "' + evt.origin + '"';
                }
    
                //alert(evt.source.location.href)
    
                var ta = document.getElementById("taRecvMessage");
                if(ta == null)
                    alert(message);
                else
                    document.getElementById("taRecvMessage").innerHTML = message;
    
                // http://javascript.info/tutorial/cross-window-messaging-with-postmessage
                //evt.source.postMessage("thanks, got it", evt.origin);
                evt.source.postMessage("thanks, got it", "*");
            } // End Function ReceiveMessage
    
    
    
    
            if (!window['postMessage'])
                alert("oh crap");
            else {
                if (window.addEventListener) {
                    //alert("standards-compliant");
                    // For standards-compliant web browsers (ie9+)
                    window.addEventListener("message", ReceiveMessage, false);
                }
                else {
                    //alert("not standards-compliant (ie8)");
                    window.attachEvent("onmessage", ReceiveMessage);
                }
            }
        </script>
    
    
    </head>
    <body style="background-color: gray;">
        <h1>Test</h1>
    
        <textarea id="taRecvMessage" rows="20" cols="20" ></textarea>
    
    </body>
    </html>
    
    0 讨论(0)
  • 2021-01-28 17:00

    You can if your browser have disabled security, for chrome it's

    "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --disable-web-security
    

    Update: I'm surprised that people keep devoting it because they consider it harmful, so here I add some additional details for peoples who don't know basics of web security and still try to develop for it.

    DON'T use this solution if

    • you are using chrome plugins or apps which are not trusted by you, or

    • you have opened other sites in the chrome, or

    • you have some malicious chrome processes

    • your site is using any external resources.

    To make this solution completely safe, configure your firewall to block all connections except one to which you are making CORS connection.

    Also, don't use this solution if your connection endpoint isn't trusted.

    0 讨论(0)
  • 2021-01-28 17:02

    You can't. This is called the same origin policy, and prevents javascript accessing content across domains.

    0 讨论(0)
  • 2021-01-28 17:14

    Take a look at easyXDM, it's an easy to use library that provides a unified API for several tricks used to enable cross domain messaging, ranging from postMessage to the FIM-trick as a last resort.
    This is what is used by major services such as Twitter and Disqus.

    0 讨论(0)
提交回复
热议问题