5

ユーザースクリプトを使用して、サイトに別のスクリプトファイルをロードしたいと考えています。しかし、js.onloadイベントは正しく機能しません。

ユーザースクリプトファイル:

// ==UserScript==
// @name           Code highlight
// @description    Test
// @include        http://localhost/*
// @version        1.0
// ==/UserScript==

var js = document.createElement('script');
    js.src = "http://localhost/test/js/load.js";
    document.getElementsByTagName("head")[0].appendChild(js);
    js.onload = function(){
        console.log(A)
    }

load.js ファイル:

var A = {
    name:'aa'
}


Chrome では、コンソールに「未定義」と出力されますが、load.js は完全にロードされています。

Firefox でテストしたところ、A正しく出力されました。

4

1 に答える 1

10

.onloadユーザースクリプトから、.onclickなどを使用しないでください。 (これは、通常の Web ページでもよくない方法です)。

その理由は、ユーザー スクリプトがサンドボックス ( 「孤立した世界」 ) で動作し、Chrome ユーザー スクリプトまたはコンテンツ スクリプトでページ スコープの JavaScript オブジェクトを設定または使用できないためです。

常にaddEventListener()(または jQuery などの同等のライブラリ関数.on()) を使用します。また、ノードを DOMloadに追加する前にリスナーを設定する必要があります。<script>

A最後に、ページ スコープ (この場合)の変数にアクセスする場合は、そのためのコードを挿入する必要があります。(または、Tampermonkey に切り替えて を使用することもできますがunsafeWindowChrome 27 では問題が発生しています。)

次のようなものを使用します。

addJS_Node (null, "http://localhost/test/js/load.js", null, fireAfterLoad);

function fireAfterLoad () {
    addJS_Node ("console.log (A);");
}

//-- addJS_Node is a standard(ish) 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);
}


多分:

addJS_Node (null, "http://localhost/test/js/load.js", null, fireAfterLoad);

function fireAfterLoad () {
    addJS_Node (null, null, myCodeThatUsesPageJS);
}

function myCodeThatUsesPageJS () {
    console.log (A);
    //--- PLUS WHATEVER, HERE.
}

... ...
于 2013-05-29T05:37:13.537 に答える