在为 Chrome 扩展程序创建清单文件时,有一个选项all_frames
允许将内容脚本注入顶部框架/iframe,或全部注入。
我希望这种行为停止在某个特定级别(例如 2 )。有没有办法指定它,最好是在清单上?或者至少在实际脚本中有破解?
这个问题可以翻译为:“是否有可能知道一个框架在 HTML 文档中的深度?
在为 Chrome 扩展程序创建清单文件时,有一个选项all_frames
允许将内容脚本注入顶部框架/iframe,或全部注入。
我希望这种行为停止在某个特定级别(例如 2 )。有没有办法指定它,最好是在清单上?或者至少在实际脚本中有破解?
这个问题可以翻译为:“是否有可能知道一个框架在 HTML 文档中的深度?
您不能在清单中指定帧深度。但是,如果 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 要求时。