Javascript 如何将脚本块的执行延迟到外部脚本加载之后?

Javascript 如何将脚本块的执行延迟到外部脚本加载之后?,javascript,Javascript,我试图动态地插入和执行几个脚本,我想我遇到了一个竞争条件,第二个脚本试图在第一个脚本加载之前执行 我正在处理的项目有一个不寻常的要求:我无法修改页面的HTML源。为了本地化的目的,它被编译成了一个应用程序 因此,我无法像通常在JavaScript文件中链接那样插入标记 事实证明,客户端希望使用托管的web字体,因此我决定在已经链接的JavaScript文件中动态构建并附加两个必需的标记 块正确地追加到文档的头,但第二个块中的函数似乎在第一个标记中链接的外部脚本完全加载之前启动,并抛出未定义的错误

我试图动态地插入和执行几个脚本,我想我遇到了一个竞争条件,第二个脚本试图在第一个脚本加载之前执行

我正在处理的项目有一个不寻常的要求:我无法修改页面的HTML源。为了本地化的目的,它被编译成了一个应用程序

因此,我无法像通常在JavaScript文件中链接那样插入
标记

事实证明,客户端希望使用托管的web字体,因此我决定在已经链接的JavaScript文件中动态构建并附加两个必需的
标记

块正确地追加到文档的
,但第二个块中的函数似乎在第一个
标记中链接的外部脚本完全加载之前启动,并抛出
未定义的
错误

以下是相关的代码:

document.getElementsByTagName("head")[0];
var tag = document.createElement('script');
tag.setAttribute("src", "http://use.typekit.com/izj3fep.js");
document.getElementsByTagName("head")[0].appendChild(tag);

try {
        Typekit.load(); // This is executing too quickly!

    } catch(e){
        console.log("Hosted fonts failed to load: " + e);
}
我尝试将
try
块移动到
窗口。onload
事件,但在调用任何代码之前触发

我想我可以动态加载jQuery,然后使用它的
ready
事件,但这似乎相当繁重。我不太愿意在这个项目中引入一个库,因为客户端有很多定制JavaScript,可能会与它发生冲突


我还可以尝试什么?

您可以使用yepnope()加载它。我知道这是一个图书馆,但它很轻(如果您的客户已经在使用Modernizer,则免费)。这很值得。希望客户端没有另一个yepnope函数,您也不必担心冲突。

您需要挂接到脚本元素的
onload
事件,并在那里执行代码:

document.getElementsByTagName("head")[0];
var tag = document.createElement('script');

tag.onload = onTagLoaded;

tag.setAttribute("src", "http://use.typekit.com/izj3fep.js");
document.getElementsByTagName("head")[0].appendChild(tag);

function onTagLoaded() {
    try {
        Typekit.load(); // This is executing too quickly!
    } catch(e){
         console.log("Hosted fonts failed to load: " + e);
    }
}
你在用什么?如果没有,我强烈推荐。这会让你的生活变得更加轻松:

$.getScript('http://use.typekit.com/izj3fep.js', function(data, textStatus){
   try {
        Typekit.load(); //executes properly now!
    } catch(e) {
        console.log("Hosted fonts failed to load: " + e);
    }
});

将脚本组合成一个大的脚本似乎是最简单的解决方案。

不过,要小心,这很奇怪。。。(旧版本的ie似乎使用了onreadystatechange)这在Chrome中起作用。我似乎无法在IE7或IE8中将
标记.onReadyState更改为激发。有什么建议吗?我是如此接近。。。