7

通常どおりjavascriptファイルを含むページhttp://example.com/1.phpがあります。

<script type="text/javascript" src="/util.js?1354729400"></script>

このファイルには、userscriptで使用する必要があるexampleFunctionという名前の関数が含まれています。また、ユーザースクリプトがあります。

// ==UserScript==
// @name          SomeName
// @namespace     http://example.com/userscripts
// @description   Greets the world
// @include       http://example.com/*
// ==/UserScript==
window.onload = function () {
        console.log(exampleFunction);
      alert("LOADED!");
}

これはFirefoxで完全に機能し、Chromeでエラーを返します。

Uncaught ReferenceError: exampleFunction is not defined 

どうすればそれを機能させることができますか?

4

3 に答える 3

9

未定義の理由exampleFunctionは、Chrome のユーザー スクリプトがサンドボックス ( 「孤立した世界」 ) で動作するためです。Greasemonkey スクリプトもサンドボックスで動作することが多いことに注意ください@grant none
スクリプトでGM_関数を使用すると、Firefox でも機能しなくなります。

このスクリプトを両方のブラウザー (およびその他のいくつかのブラウザー) で機能させるには、この回答と同様のスクリプト インジェクション を使用します。

ただし、そのスクリプトは を使用しているため、別の問題がありwindow.onloadます。デフォルトの実行開始モードの Chrome ユーザースクリプトでは、多くの場合、onloadイベントが表示されません。

// @run-at document-endこれを回避するには、メタデータ ブロックに追加します。

したがって、スクリプトは次のようになります。

// ==UserScript==
// @name            SomeName
// @namespace       http://example.com/userscripts
// @description     Greets the world
// @include         http://example.com/*
// @run-at          document-end
// @grant           none
// ==/UserScript==

function GM_main () {
    window.onload = function () {
        console.log(exampleFunction);
        alert("LOADED!");
    }
}

addJS_Node (null, null, GM_main);

//-- This is a standard-ish utility function:
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);
}
于 2012-12-06T00:09:59.750 に答える
3

onLoadページ上のすべての画像が読み込まれるまで起動しない と同等のものが必要な場合// @run-at document-idleは、メタデータ ブロックで使用します。デフォルトの document-end は、DOM がロードされたときに発生します。これは、document.ready と同等です。

于 2016-01-10T02:00:40.450 に答える
1

角かっこで examplefunction を呼び出してみましたか? :) このような:

console.log(exampleFunction());

Chrome コンソールで試す場合は、関数を呼び出すために括弧を追加する必要があります。

于 2012-12-05T20:41:11.247 に答える