是否可以在不重新加载的情况下运行注入的脚本?

时间:2012-07-13 15:02:34

标签: javascript jquery google-chrome-extension

我做了一个简单的自动表单填充,通过从创建的html向后台发送信息,然后发送内容脚本,因此注入的脚本可以更改表单上的信息。

我知道一旦页面加载就会运行内容脚本。我想知道我是否可以再次运行内容脚本,而无需重新加载页面。

我在内容脚本中获得了sendRequest函数,我用它来确保它只在页面准备就绪时获取信息。然后将信息添加到表单中,等待我发送。

在内容脚本中,我添加了一个onRequest,它可以正常运行(它获取信息)。但是,我没有看到表单上的更改,除非我正在对页面进行编码。

我想知道是否可以这样做,如果它确实应该学习哪些科目来实现这一目标。

我是chrome extentions的新手,我还在学习:) 在其中一个页面中,我使用了jQuery,所以jQuery的答案也会很好。

3 个答案:

答案 0 :(得分:2)

我发现如果我们从背景创建chrome.tabs.sendRequest,我们可以使用内容脚本中的 chrome.extestion.onRequest 并且它每次都会执行,因为它们都在同一时间运行。

所以我从背景

做了
  chrome.tabs.query({}, function (tabs) {
        for (var i = 0; i < tabs.length; i++) {
            chrome.tabs.sendRequest(tabs[i].id, {...requests u want to send  }, function (response) {

            });

        }
    });

来自内容脚本

chrome.extension.onRequest.addListener(function (request, sender, sendRespons) {
      //get requested info here
      //call functions.

      sendResponse({}); //send info back to background page.
});

答案 1 :(得分:1)

表单的目标可能是iframe,可以避免页面重新加载。不确定它有多么有用。

答案 2 :(得分:1)

再次执行内容脚本的正确方法是使用chrome.tabs.executeScript方法。它收到两个参数。第一个参数是tabId,可以通过多种方式获得,例如one of the chrome.tabs events。使用null在当前选定的选项卡中执行内容脚本(注意:这也可能是一个活动的开发工具窗口!)。

示例:

// Reloads the current tab
chrome.tabs.executeScript(null, {code:'location.reload();'});

// Executes contentscript.js in the current tab
chrome.tabs.executeScript(null, {file:'contentscript.js'});

// Executes contentscript.js in all frames in the current tab
chrome.tabs.executeScript(null, {file:'contentscript.js', allFrames: true});

// Receives message from content script, and execute a content script:
chrome.extension.onMessage.addListener(function(details) {
    if (details.message === 'load a content script') {
        chrome.tabs.executeScript(details.sender.tab.id, {file: 'a_script.js'});
    }
});
     // The previous one is activated from a content script, as follows:
     chrome.extension.sendMessage('load a content script');

(必须使用onMessagesendMessage代替onRequestsendRequest,因为Chrome 20)