通过chrome扩展注入JS

时间:2015-08-30 12:39:09

标签: javascript google-chrome google-chrome-extension

我正在尝试通过chrome扩展将一些JS代码注入给定的网页。

我正在使用这种方法:

var s = document.createElement('script');
// TODO: add "script.js" to web_accessible_resources in manifest.json
s.src = chrome.extension.getURL('script.js');
s.onload = function() {
    this.parentNode.removeChild(this);
};
(document.head||document.documentElement).appendChild(s);

我有一些脚本,我以这种方式加载,除了一个之外它们都很好用。由于某种原因没有正确加载的是kbpgp.js,它是一个浏览器化的nodejs代码(来源:https://raw.githubusercontent.com/keybase/kbpgp/master/browser/kbpgp.js

当我通过扩展程序加载它时,我可以看到正在加载实际文件,因为我可以在资源列表中看到它。

如果我使用<script src="https://raw.githubusercontent.com/keybase/kbpgp/master/browser/kbpgp.js"></script>通过常规html页面获取该代码,我可以看到它暴露了一个名为kbpgp的方法,而当我尝试通过扩展方法加载它时该方法是不可用。

manifest.json

{
  "manifest_version": 2,
  "name": "Getting started example",
  "description": "This extension shows a Google Image search result for the current page",
  "version": "1.0",
  "browser_action": {
    "default_icon": "icon.png",
    "default_popup": "popup.html"
  },
  "permissions": [
    "activeTab",
    "https://ajax.googleapis.com/"
  ],
  "content_scripts": [
    {
      "matches": [
        "https://www.facebook.com/*"
      ],
      "css": [
        "css/style.css"
      ],
      "js": [
        "lib/init.js"
      ],
      "run_at": "document_end"
    }
  ],
  "web_accessible_resources": [
    "lib/kbpgp.js",
    "lib/jquery.js",
    "lib/pgp.js"
  ]
}

init.js

function loadScript(path, callback) {
  console.log('Loading', path);
  var s = document.createElement('script');
  s.src = chrome.extension.getURL(path);
  (document.head || document.documentElement).appendChild(s);
  console.log(s);
  setTimeout(function () {
    callback();
  }, 2000);
}

loadScript('lib/kbpgp.js', function () {
  loadScript('lib/jquery.js', function () {
    loadScript('lib/pgp.js', function () {
      console.log('PGP Extension loaded');
    });
  });
});

(请忽略我loadScript函数的非常难看的实现。)

我可以使用驻留在我的pgp.js文件中的mytest()函数,但不能使用kbpgp()文件中的kbpgp.js方法,即使我可以清楚地看到kbpgp.js在页面内加载。

0 个答案:

没有答案