注入的Javascript似乎是异步运行的

注入的Javascript似乎是异步运行的,javascript,html,javascript-injection,Javascript,Html,Javascript Injection,我正在制作Greasemonkey扩展的bookmarklet版本,它在页面主体上附加了两个标记:第一个是较大的库,第二个调用该库中的函数 通常,需要两次或多次尝试(从不尝试一次,有时尝试两次以上)才能正确启动脚本。注入库后直接从控制台运行函数也可以工作。如果我检查我的错误日志,我会得到一条消息,我的注入方法还不存在——因此标题是:尽管JavaScript应该是单线程的,但不知何故,第二个方法标记是在库加载完成之前首先运行的 在缩小之前,bookmarklet代码如下所示: document.b

我正在制作Greasemonkey扩展的bookmarklet版本,它在页面主体上附加了两个
标记:第一个是较大的库,第二个调用该库中的函数

通常,需要两次或多次尝试(从不尝试一次,有时尝试两次以上)才能正确启动脚本。注入库后直接从控制台运行函数也可以工作。如果我检查我的错误日志,我会得到一条消息,我的注入方法还不存在——因此标题是:尽管JavaScript应该是单线程的,但不知何故,第二个方法标记是在库加载完成之前首先运行的

在缩小之前,bookmarklet代码如下所示:

document.body.appendChild(document.createElement('script')).src = "https://my-site-address";

var scrN = document.createElement('script');
var txtN = document.createTextNode("main.Main().main(document.location.href)");
scrN.appendChild(txtN);

document.body.appendChild(scrN);
生成的html非常简单

<script src="https://my-site-address"></script>
<script>main.Main().main(document.location.href)</script>

main.main().main(document.location.href)

使用
脚本
元素的
加载
事件执行其中的函数:

var script = document.createElement("script");
script.onload = function() { main.Main().main(document.location.href); };
script.src = "https://my-site-address";

document.body.appendChild(script);