Why is script.onload not working in a Chrome userscript?
我想使用用户脚本在站点中加载另一个脚本文件。但是,
用户脚本文件:
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已经完全加载。
我在火狐中测试过,它正确地输出了
不要从用户脚本中使用
原因是用户脚本在沙盒("独立世界")中操作,并且不能在chrome用户脚本或内容脚本中设置或使用页面范围的javascript对象。
总是使用EDCOX1×2(或等效的库函数,如jQuery EDCOX1)3)。此外,在将EDOCX1和5个节点添加到DOM之前,应该设置EDCOX1×4个侦听器。
最后,如果您希望访问页面范围中的变量(在本例中为
使用如下内容:
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. } ... ... |