iframe内で定義されたjavascript関数を親ウィンドウに挿入して、iframeを削除した後でも使用できるようにすることは可能ですか? これが私がしていることです:私が持っているiframeで:
var f = function(){console.log("iframe function")}
window["iframeFunction"] = f;
親は、iframe が使用可能になるまで関数を正常に呼び出すことができます..その後は機能しません。
iframe内で定義されたjavascript関数を親ウィンドウに挿入して、iframeを削除した後でも使用できるようにすることは可能ですか? これが私がしていることです:私が持っているiframeで:
var f = function(){console.log("iframe function")}
window["iframeFunction"] = f;
親は、iframe が使用可能になるまで関数を正常に呼び出すことができます..その後は機能しません。
これがあなたの 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 から削除されても、関数は親に追加されたまま残ります。
ブラウザーのサポート要件によっては、postMessageをお勧めします。利点は次のとおりです。
編集: 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);