0

HTML をページに挿入し、いくつかのボタンに onClick 関数を持つクロム拡張に取り組んでいます。これがサンプルコードです。

Namespace.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

Firefox、Chrome、IE 9では、次のように呼び出されたときに機能します。

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

@zhuzhour が述べたように、コンテンツ スクリプトは隔離された世界で実行されており、ページ内の JavaScript はコンテンツ スクリプトによって定義された変数にアクセスできません。

これを行いたい場合は、こちらの他の回答で概説したように、ページに JavaScript ファイルを挿入する必要があります: https://stackoverflow.com/a/13037307/315562

つまり、次のcontent.jsファイルを使用して注入しnamespace.jsます。

content.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

コンテンツ スクリプトは、いわゆる隔離された世界で実行されています。できない

拡張機能のページで定義された変数または関数を使用する

Web ページまたは他のコンテンツ スクリプトによって定義された変数または関数を使用する

そのため、名前空間を別の js として HTML ページにも挿入する必要がある場合があります。

于 2012-10-24T04:18:00.523 に答える