6

I have a lazy loading JavaScript file, how can I catch the event when the class in the file is ready for usage? I only need to load this script in a specific case. Therefor it is not loaded via onload but in a if clause.

The lazy loading code I took from here: 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?
}

Update:
Sorry guys, I totally forgot about Ajax! :) I was so focused on my problem that I didn't saw the obviously solution by @Tokimon. The simplest solution via jQuery would then be:

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

5 Answers 5

3
if (s.readyState) s.onreadystatechange = function () {
    if (s.readyState === "loaded" || s.readyState === "complete") {
        s.onreadystatechange = null;
        callback();
    }
}; else s.onload = function () {
    callback();
};
Sign up to request clarification or add additional context in comments.

2 Comments

Ok, that means "loaded" (HTTP = 200) the class in the file is ready for usage?
@powtac Yes, it means downloaded and parsed. The semicolon is there for a reason.
1

Or you could get the script via ajax. Then you are sure that the script is loaded when the ajax succes event is fired :)

Comments

1

If I understand what you want to accomplish correctly. This is why callback methods exist.

Explained pretty well here Getting a better understanding of callback functions in JavaScript

Comments

1

As it requires a HTTP request, you should be able to put an onload event on it.

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

In 'Even Faster Web Sites' Steve Souders offer a solution, which can be seen here.

Comments

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);   

You could also use an XMLHttpRequest to load the file.

1 Comment

Opera will fire the callback twice.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.