394

Traditionally, to call a JavaScript function once the page has loaded, you'd add an onload attribute to the body containing a bit of JavaScript (usually only calling a function)

<body onload="foo()">

When the page has loaded, I want to run some JavaScript code to dynamically populate portions of the page with data from the server. I can't use the onload attribute since I'm using JSP fragments, which have no body element I can add an attribute to.

Is there any other way to call a JavaScript function on load? I'd rather not use jQuery as I'm not very familiar with it.

2
  • Can you either verify that Kevin's edit to your question is still asking the same question, or rephrase it to make sure we understand? (Are you trying to find an alternative to onload?) Commented Oct 1, 2010 at 20:06
  • 1
    Does this answer your question? How to make JavaScript execute after page load? Commented Feb 9, 2021 at 21:08

9 Answers 9

592

If you want the onload method to take parameters, you can do something similar to this:

window.onload = function() {
  yourFunction(param1, param2);
};

This binds onload to an anonymous function, that when invoked, will run your desired function, with whatever parameters you give it. And, of course, you can run more than one function from inside the anonymous function.

Sign up to request clarification or add additional context in comments.

6 Comments

And now when I'm dynamically including a server-generated page and need DOM-readiness, I need to work through this minefield. If only someone would have encouraged properly library user earlier.
I didn't say it was a good idea. Though the lead dev where I work has a strong case of Not Invented Here syndrome, and I haven't been able to convince him to use jquery, outside of a few pages.
Then perhaps you should switch jobs. If the right tool for the job isn't the tool you're using, why beat your head against the wall constantly battling the incompetent?
If another script has already loaded a function on window.onload, this method will override it. This could an issue in some cases. The document.addEventListener approach seems preferable to me.
Just a tip. Document.onload() is used when the DOM is fully loaded, whereas Window.onload() is used when the graphical part is loaded for presentation. Document.onload is pretty much just behind-the-scenes, so I recommend using that if possible, since it uses none of your cpu...or gpu, I don't know, I looked this up.
|
169

Another way to do this is by using event listeners, here's how you use them:

document.addEventListener("DOMContentLoaded", function() {
  your_function(...);
});

Explanation:

DOMContentLoaded It means when the DOM objects of the document are fully loaded and seen by JavaScript. Also this could have been "click", "focus"...

function() Anonymous function, will be invoked when the event occurs.

2 Comments

Note that this will not work in IE 8 and lower. Otherwise this is the best pure JS solution!
This is the correct answer as the accepted answer would lead to conflicts if there's more than one method to be called on load.
77

Your original question was unclear, assuming Kevin's edit/interpretation is correct, then this first option doesn't apply

The typical options is using the onload event:

<body onload="javascript:SomeFunction()">
....

You can also place your JavaScript at the very end of the body; it won't start executing until the doc is complete.

<body>
  ...
  <script type="text/javascript">
    SomeFunction();
  </script>
</body>

Another option is to use a JS framework which intrinsically does this:

// jQuery
$(document).ready( function () {
  SomeFunction();
});

3 Comments

The javascript: in the onload is unnecessary, albeit not harmful.
@STW <script type="text/javascript">LoadResult();</script> gives Uncaught ReferenceError: LoadResult is not defined
where do i write contents of SomeFunction()?
53
function yourfunction() { /* do stuff on page load */ }

window.onload = yourfunction;

Or with jQuery if you want:

$(function(){
   yourfunction();
});

If you want to call more than one function on page load, take a look at this article for more information:

7 Comments

This is not correct, the function will execute and assign whatever it returns to onload. The () should not be there.
If there are other functions that are listening for the onload event this will blow them away. Better to add an event listener rather than assign an event handler directly. Even in this case you would assign it as `window.onload = yourfunction' without the function closure, not the way you have it. Your way seeks to execute yourfunction() at the time of the assignment.
that will assign the return value of the function to window.onload, which will not work, unless the return value is a function.
@epascarello: Good catch, fixed, you see a habit when writing function names. Thanks
window.onload = yourfunction; The problem with this way is that it dosen't accept fucntion parameter !!
|
14

<!DOCTYPE html>
<html>
    <head>
        <title>Test</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <script type="text/javascript">
        function codeAddress() {
            alert('ok');
        }
        window.onload = codeAddress;
        </script>
    </head>
    <body>
    
    </body>
</html>

Comments

8

You have to call the function you want to be called on load (i.e., load of the document/page). For example, the function you want to load when document or page load is called "yourFunction". This can be done by calling the function on load event of the document. Please see the code below for more detail.

Try the code below:

<script src="js/jquery-1.11.0.min.js" type="text/javascript"></script>
<script type="text/javascript">

    $(document).ready(function () {
        yourFunction();
    });
    function yourFunction(){
      //some code
    }
</script>

Comments

5

here's an example with es6 and no jquery:

window.onload = () => {
  foo()
}

see the mdn docs: https://developer.mozilla.org/en-US/docs/Web/API/Window/load_event

1 Comment

Doesn't this have all the problems the top answer has?
4

Here's the trick (works everywhere):

r(function(){
  alert('DOM Ready!');
});
function r(f){
 /in/.test(document.readyState) 
   ? setTimeout('r(' + f + ')', 9)
   : f();
}

3 Comments

Uh. I think this is not a code obfuscation contest.
@abhishek can you explain what your code does? It's unclear, therefore useless.
A few problems: 1) The function names are not good. 2) Don't use setTimeout with a string. 3) It's not clear that you're testing for interactive in the code. 4) Recursively polling is a really awkward way to do this. JavaScript has events for a reason.
1

For detect loaded html (from server) inserted into DOM use MutationObserver or detect moment in your loadContent function when data are ready to use

let ignoreFirstChange = 0;
let observer = (new MutationObserver((m, ob)=>
{
  if(ignoreFirstChange++ > 0) console.log('Element added on', new Date());
}
)).observe(content, {childList: true, subtree:true });


// TEST: simulate element loading
let tmp=1;
function loadContent(name) {  
  setTimeout(()=>{
    console.log(`Element ${name} loaded`)
    content.innerHTML += `<div>My name is ${name}</div>`; 
  },1500*tmp++)
}; 

loadContent('Senna');
loadContent('Anna');
loadContent('John');
<div id="content"><div>

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.