2011-03-18 52 views
5

我有一个延迟加载JavaScript文件,当文件中的类准备好使用时,如何捕获事件?我只需要在特定情况下加载此脚本。因此它不是通过onload加载的,而是在if子句中加载的。JavaScript如何在延迟加载的脚本准备就绪时捕获事件?

延迟加载代码,我从这里拿了:http://friendlybit.com/js/lazy-loading-asyncronous-javascript/

if (externalClassRequired) { 
    var s = document.createElement('script'); 
    s.type = 'text/javascript'; 
    s.async = true; 
    s.src = 'http://yourdomain.com/script.js'; 
    var x = document.getElementsByTagName('script')[0] 
    x.parentNode.insertBefore(s, x); 

    // When do I know when the class named "geo" is available? 
} 

更新:
对不起球员,我完全忘了Ajax的! :)我非常关注我的问题,我没有看到@Tokimon的明显解决方案。通过jQuery最简单的解决方案将是:

$.getScript('http://yourdomain.com/script.js', function() { 
    // callback or use the class directly 
}); 

回答

1

或者你可以通过AJAX拿到剧本。然后你确定当ajax成功事件被触发时脚本被加载:)

+0

忘记了Ajax!谢谢! – powtac 2011-03-19 14:05:12

1

因为它需要一个HTTP请求,你应该可以把一个onload事件。

s.onload = function() { 
    // do something 
} 

在“更快网站”史蒂夫Souders的提供了一个解决方案,由此可以看出here

1
var onloadCallback = function() { 
    alert('onload'); 
} 

var s = document.createElement('script'); 
s.type = 'text/javascript'; 
s.async = true; 
s.onreadystatechange = function() { // for IE 
    if (this.readyState == 'complete') onloadCallback(); 
}; 
s.onload = onloadCallback; // for other browsers 
s.src = 'http://yourdomain.com/script.js'; 
var x = document.getElementsByTagName('script')[0] 
x.parentNode.insertBefore(s, x); 

你也可以使用XMLHttpRequest来加载文件。

+1

Opera将触发两次回调。 – jasssonpet 2011-03-18 16:25:43

3
if (s.readyState) s.onreadystatechange = function() { 
    if (s.readyState === "loaded" || s.readyState === "complete") { 
     s.onreadystatechange = null; 
     callback(); 
    } 
}; else s.onload = function() { 
    callback(); 
}; 
+0

好吧,这意味着“加载”(HTTP = 200)文件中的类已准备好使用? – powtac 2011-03-19 13:57:20

+0

@powtac是的,它意味着下载和解析。分号是有原因的。 – jasssonpet 2011-03-20 13:47:11

相关问题