在特定框架中执行脚本

时间:2012-06-26 16:35:26

标签: google-chrome-extension

我只能看到如何在顶级框架或特定标签的所有框架中执行脚本:

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

如果details.allFramestrue,那么它将在每个子帧中执行,但如果它是假,则它将仅在顶级帧中执行。如何提供frameId来执行脚本?

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分: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);
});

}

答案 2 :(得分:2)

来自documentation

如果allFrames为true,则表示应将JavaScript或CSS注入当前页面的所有帧。默认情况下,它为false,仅注入顶部框架。如果设置为true且设置了frameId,则代码将插入所选框架及其所有子框架中。

答案 3 :(得分:1)

Chrome 39起,有一个名为frameId的可选参数。

chrome.webNavigation.onCompleted.addListener(function(e) {
    chrome.tabs.executeScript(e.tabId, {
        frameId: e.frameId,      // <== LOOK HERE
        code: "console.log('hello');"
    });
});