いくつかのこと:
- コードにエラーがあります。
getElementsById
関数ではありません。
- それ以外の場合、ディレクティブが適用される場合、そのコードはGreasemonkey1.0以降で機能します。
@grant none
これについては、以下で詳しく説明します。
- Scriptishの場合、他のすべてのブラウザー、および
@grant none
不可能な場合のGreasemonkeyシナリオ。コードを「注入」する必要があります。これについては、以下で詳しく説明します。
- Jeremy J Starcherが言うよう
eval()
に、可能な限り避けるべきです。 eval()
パフォーマンス、メンテナンス、デバッグ、およびセキュリティがはるかに困難になります。
Greasemonkey 1.0以降の場合:
一部のシナリオでは、Greasemonkeyはを使用しなくなりましたXPCNativeWrapper
。ディレクティブについては、ドキュメントを@grant
参照してください。
つまり、これは、(1)スクリプトがGM_
関数を使用せず、(2)スクリプトがを指定している場合、コードはそのまま実行されることを意味します(タイプミス@grant none
を除く)。getElementsById
他のスクリプトエンジンはこれを行わないことに注意してください。(正当な理由があります。Greasemonkeyの新しい動作@grant
、およびサンドボックスについては、せいぜい物議を醸しています。)
関数を使用する場合GM_
は、iframeコードを挿入する必要があります。次のセクションを参照してください。
Scriptish、Privileged Greasemonkey、Chromeなどの場合:
Scriptish、Sandboxed Greasemonkey、Chromeなどはすべて、それぞれのサンドボックス内からiframeを適切に処理しません。(たとえば、これらのQを参照してください。)
GM /ユーザースクリプトからこの種のコードを実行する唯一の信頼できる方法は、それを挿入することです。そのようです:
function gmMain () {
body = document.getElementsByTagName("body")[0];
fakeConsole = 'window.top._console';
injected = document.getElementById("sandbox") ? true : false;
sandboxframe = injected ? document.getElementById("sandbox") : document.createElement('iframe');
sandbox = null;
if (!injected) {
body.appendChild(sandboxframe);
sandboxframe.setAttribute('id', 'sandbox');
sandboxframe.setAttribute('style', "display:none")
}
var p = sandboxframe.contentWindow.eval('1 + 1');
console.log(p);
}
addJS_Node (null, null, gmMain);
function addJS_Node (text, s_URL, funcToRun, runOnLoad) {
var D = document;
var scriptNode = D.createElement ('script');
if (runOnLoad) {
scriptNode.addEventListener ("load", runOnLoad, false);
}
scriptNode.type = "text/javascript";
if (text) scriptNode.textContent = text;
if (s_URL) scriptNode.src = s_URL;
if (funcToRun) scriptNode.textContent = '(' + funcToRun.toString() + ')()';
var targ = D.getElementsByTagName ('head')[0] || D.body || D.documentElement;
targ.appendChild (scriptNode);
}