2

iframe内で定義されたjavascript関数を親ウィンドウに挿入して、iframeを削除した後でも使用できるようにすることは可能ですか? これが私がしていることです:私が持っているiframeで:

var f = function(){console.log("iframe function")}
window["iframeFunction"] = f;

親は、iframe が使用可能になるまで関数を正常に呼び出すことができます..その後は機能しません。

4

2 に答える 2

0

これがあなたの iframe (ifr.htm) だとします。

<html>
<head>
    <script type="text/javascript">
        function func() {
            window.top.window.f = function() {
                alert('iframe hack');
            }
        }
        window.onload = function() {
            alert('iframe loaded');
            func();
        };
    </script>
</head>
<body>
    this is the test iframe.
</body>
</html>

これが親ウィンドウです。

<html>
<head>
    <script type="text/javascript">
        window.onload = function() {
            i = document.getElementById('iframe'); //remove the iframe
            i.parentNode.removeChild(i);
            window.f(); //you can still call f() method     
        };
    </script>
</head>
<body>
    this is the parent window.
            <iframe src="ifr.htm" id="iframe"></iframe>
</body>
</html>

これは基本的に親を使用してアクセスしtop、関数を追加します。そのため、iframeが DOM から削除されても、関数は親に追加されたまま残ります。

于 2013-03-15T14:51:25.663 に答える
0

ブラウザーのサポート要件によっては、postMessageをお勧めします。利点は次のとおりです。

  1. 親のグローバル名前空間を汚染する必要はありません (競合の可能性が低くなり、目的の範囲外で利用できるようになります)
  2. 親は、新しい機能が利用可能になったことを通知されます (変更を想定またはポーリングするのではなく)

編集: iframe で指定されたラベルを持つ親のグローバル名前空間で関数を使用できるようにしたい場合でも、ポイント 2 が適用されます。

コード:

// In your iframe
var f = function(){console.log("iframe function")}
window.top.postMessage({f:f}, '*');

// In the parent
window.addEventListener('message', function capturePassedFunction(e){
    // If you want to keep this in scope
    var f    = e.data.f;
    // You can still chuck it on the `window` object if you want!
    window.f = e.data.f;
}, false);
于 2013-03-15T14:55:22.423 に答える