关闭一个注入的iframe

时间:2012-09-21 17:19:43

标签: javascript iframe google-chrome-extension

我有一个从我的Chrome扩展程序运行的内容脚本。 此脚本将iframe注入当前页面的主体。 我希望能够在iframe内关闭iframe。 我该怎么做呢? 当我在网上搜索这个问题时,几乎每个解决方案都使用window.parent.document属性,在我的情况下由于某种原因未定义。任何想法?

编辑 - 代码示例:

iframe

的HTML中
<script type="text/javascript">
        function frameClose() {
            var windowFrames = window.parent.frames;
            for (var i = 0; i < windowFrames.length; i++) {
                var aFrame = windowFrames[i];
                if (aFrame.name == 'myFrame') {
                    alert('in frame');
                    // WHAT TO DO HERE?
                    // window.parent.document is undefined
                    // aFrame.parentNode.removeChild(aFrame); - THIS DOES NOT WORK ALSO
                    break;
                }
            }
        }
    </script>

这是我注入iframe

的方式

Extension.js

chrome.browserAction.onClicked.addListener(function(tab) {

    chrome.tabs.executeScript(null, {
        file : "/js/PushIFrame.js"
    }, function() {
        if (chrome.extension.lastError) {
        }
    });
});

PushIFrame.js 我有:

chrome.extension.sendMessage({
    action: "pushFrame",
    source: pushIframe(document)
});

function pushIframe(document) {
    var existingFrame = document.getElementById('bmarkFrame');
    if (existingFrame == null) {
        var temp = document.createElement('iframe');
        temp.id = 'myFrame';
        temp.name = 'myFrame';
        temp.setAttribute('scrolling', 'no');
        temp.setAttribute('allowtransparency', 'true');
        temp.style.border = 'none';
        temp.style.height = '100%';
        temp.style.width = '100%';
        temp.style.position = 'fixed';
        temp.style.zIndex = 99999999;
        temp.style.top = 0;
        temp.style.left = 0;
        temp.style.display = 'block';
        temp.src = 'https://www.mysite.com/';

        document.body.appendChild(temp);
    }
    else {
        existingFrame.style.display = 'block';
    }
}

1 个答案:

答案 0 :(得分:1)

让内容脚本(比如PushIframe.js)将message事件绑定到主框架。然后,只要您想要隐藏iframe,请调用parent.postMessage以通知主框架。内容脚本会收到此消息,您可以从中隐藏框架(在函数pushIframe中定义)。

// PushIframe.js:
addEventListener('message', function(ev) {
    if (ev.data === 'closeIframe') {
        pushIframe(document); // Your code
    }
});

// Iframe:
<script>
function frameClose() {
    parent.postMessage('closeIframe', '*');
}
</script>