6

在为 Chrome 扩展程序创建清单文件时,有一个选项all_frames允许将内容脚本注入顶部框架/iframe,或全部注入。

我希望这种行为停止在某个特定级别(例如 2 )。有没有办法指定它,最好是在清单上?或者至少在实际脚本中有破解?

这个问题可以翻译为:“是否有可能知道一个框架在 HTML 文档中的深度?

4

1 回答 1

6

您不能在清单中指定帧深度。但是,如果 iframe 具有不同的 URL,您可以针对它们运行不同的内容脚本(通过在清单
中的数组中有多个条目)。content_scripts

内容脚本可以使用如下代码以编程方式确定 (i) 帧的深度:

getFrameDepth (window.self);

function getFrameDepth (winToID) {
    if (winToID === window.top) {
        return 0;
    }
    else if (winToID.parent === window.top) {
        return 1;
    }

    return 1 + getFrameDepth (winToID.parent);
}



如果您按如下方式创建扩展,则可以在 jsBin 上针对此页面进行测试:

清单.json:

{
    "manifest_version": 2,
    "content_scripts":  [ {
        "all_frames":       true,
        "js":               [   "iframe foo.js" ],
        "matches":          [   "http://jsbin.com/enivux/*",
                                "http://jsbin.com/anomic/*",
                                "http://jsbin.com/ogaxoq/*",
                                "http://jsbin.com/ihegaq/*"
                            ]
    } ],
    "description":      "Detecting where an iframe is in the hierarchy",
    "name":             "(i)frame Level identification",
    "version":      "   1"
}


iframe foo.js:

var frameDepth  = getFrameDepth (window.self);
var bodyColors  = ["white", "pink", "lime", "cyan"]

document.body.style.background = bodyColors[frameDepth];

function getFrameDepth (winToID) {
    if (winToID === window.top) {
        return 0;
    }
    else if (winToID.parent === window.top) {
        return 1;
    }

    return 1 + getFrameDepth (winToID.parent);
}



请注意,Chrome 扩展程序目前仅在具有src属性的 iframe 上运行,并且仅当 URL 满足清单的匹配和 glob 要求时。

于 2013-04-13T01:11:31.190 回答