6

我只能看到如何在顶级框架或某个选项卡的所有框架中执行脚本:

chrome.tabs.executeScript(integer tabId, object details, function callback)

where if details.allFramesis truethen 它将在每个子帧中执行,但如果为 false,则只会在顶层帧中执行。我怎样才能提供一个frameId来执行脚本?

4

4 回答 4

5

据我所知,你不能。相反,allFrames: true在内容脚本中设置和编写javascript来检测它是否是正确的框架,如果它不是正确的框架,则不做任何事情就返回。

于 2012-06-27T03:05:19.547 回答
2

这是我解决同样问题的路线:

https://github.com/Rob--W/chrome-api/blob/master/chrome.tabs.executeScriptInFrame/chrome.tabs.executeScriptInFrame.js

function alertCookie(tabId, frameId) {
chrome.tabs.executeScriptInFrame(tabId, {
    frameId: frameId,
    code: '// This code runs in one frame, specified via frameId \n' +
          'alert(location.href);' +
          'document.cookie;'
}, function(results) {
    if (!results) {
        alert('Failed to execute code. See background page for details.');
        return;
    }
    var cookie = results[0];
    alert('Found cookie: ' + cookie);
});

}

于 2014-01-14T06:03:41.897 回答
2

文档

如果 allFrames 为真,则意味着应该将 JavaScript 或 CSS 注入到当前页面的所有框架中。默认情况下,它是 false 并且只注入到顶部框架中。如果设置了 true 和 frameId,则代码将插入所选框架及其所有子框架中。

于 2017-04-09T08:10:32.420 回答
1

Chrome 39 开始,有一个可选参数名为frameId.

chrome.webNavigation.onCompleted.addListener(function(e) {
    chrome.tabs.executeScript(e.tabId, {
        frameId: e.frameId,      // <== LOOK HERE
        code: "console.log('hello');"
    });
});
于 2018-12-11T15:40:38.670 回答