0

我正在开发一个 chrome 扩展程序,它将 HTML 注入到页面中,并对某些按钮具有 onClick 功能。这是示例代码。

命名空间.js

/**
 * Namespace for this content script.
 * @const
 */
var namespace = {};

/**
 * HTML text to be injected.
 */
namespace.HTML = '<input type="text" size="2" placeholder="0.50"' +
                 'onkeyup="namespace.enable(event)" />';

document.body.insertAdjacentHTML('afterbegin', namespace.HTML);

namespace.enable = function() {
  alert('Hello World!')
};

HTML 被正确注入,但命名空间未被识别。这是错误

Uncaught ReferenceError: namespace is not defined 
onkeyup

任何解决方法?

谢谢

4

3 回答 3

0

正如@zhzhour 所提到的,内容脚本在一个孤立的世界中运行,页面中的 JavaScript 无法访问您的内容脚本定义的变量。

如果要执行此操作,则需要在页面中注入 JavaScript 文件,正如我在此处的其他答案中所述:https ://stackoverflow.com/a/13037307/315562

也就是说,使用下面的content.js文件来注入namespace.js.

内容.js

injectScript( chrome.extension.getURL( "/" ), "namespace.js" );
function injectScript ( aBasePath, aScriptURL ) {
  var scriptEl = document.createElement( "script" );
  scriptEl.src = aBasePath + aScriptURL;
  scriptEl.async = false;

  (document.body || document.head || document.documentElement)
  .appendChild( scriptEl );
}

您可以以此为起点。如果您需要与 Chrome 扩展程序通信,那么您需要window.postMessage在注入的 JavaScript 文件中使用来发送消息并在内容脚本中接收它们。

于 2012-10-24T06:17:28.630 回答
0

内容脚本在所谓的孤立世界中运行。它不能

使用由其扩展页面定义的变量或函数

使用由网页或其他内容脚本定义的变量或函数

因此,您可能还需要将命名空间作为另一段 js 注入 HTML 页面。

于 2012-10-24T04:18:00.523 回答
0

它在 Firefox、Chrome 和 IE 9 中运行时调用如下:

window.onload = function() {
  document.body.insertAdjacentHTML('afterbegin', namespace.HTML);
};
于 2012-10-23T23:10:33.720 回答