关于javascript:为什么script.onload不能在chrome用户脚本中工作?

Why is script.onload not working in a Chrome userscript?

我想使用用户脚本在站点中加载另一个脚本文件。但是,js.onload事件不能正常工作。

用户脚本文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
// ==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文件:

1
2
3
var A = {
    name:'aa'
}

在chrome中,控制台输出"undefined",但load.js已经完全加载。

我在火狐中测试过,它正确地输出了A


不要从用户脚本中使用.onload.onclick等。(在普通的网页上也是很糟糕的做法)。

原因是用户脚本在沙盒("独立世界")中操作,并且不能在chrome用户脚本或内容脚本中设置或使用页面范围的javascript对象。

总是使用EDCOX1×2(或等效的库函数,如jQuery EDCOX1)3)。此外,在将EDOCX1和5个节点添加到DOM之前,应该设置EDCOX1×4个侦听器。

最后,如果您希望访问页面范围中的变量(在本例中为A),则必须注入这样做的代码。(或者您可以切换到Tampermonkey并使用unsafeWindow,但Chrome27会导致问题。)

使用如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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);
}

或者:

1
2
3
4
5
6
7
8
9
10
11
12
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.
}

... ...