Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 7698927
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 31, 20262026-05-31T22:21:29+00:00 2026-05-31T22:21:29+00:00

With jQuery, we all know the wonderful .ready() function: $(‘document’).ready(function(){}); However, let’s say I

  • 0

With jQuery, we all know the wonderful .ready() function:

$('document').ready(function(){});

However, let’s say I want to run a function that is written in standard JavaScript with no library backing it, and that I want to launch a function as soon as the page is ready to handle it. What’s the proper way to approach this?

I know I can do:

window.onload="myFunction()";

Or I can use the body tag:

<body onload="myFunction()">

Or I can even try at the bottom of the page after everything, but the end body or html tag like:

<script type="text/javascript">
    myFunction();
</script>

What is a cross-browser(old/new)-compliant method of issuing one or more functions in a manner like jQuery’s $.ready()?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-31T22:21:30+00:00Added an answer on May 31, 2026 at 10:21 pm

    The simplest thing to do in the absence of a framework that does all the cross-browser compatibility for you is to just put a call to your code at the end of the body. This is faster to execute than an onload handler because this waits only for the DOM to be ready, not for all images to load. And, this works in every browser.

    <!doctype html>
    <html>
    <head>
    </head>
    <body>
    Your HTML here
    
    <script>
    // self executing function here
    (function() {
       // your page initialization code here
       // the DOM will be available here
    
    })();
    </script>
    </body>
    </html>
    

    For modern browsers (anything from IE9 and newer and any version of Chrome, Firefox or Safari), if you want to be able to implement a jQuery like $(document).ready() method that you can call from anywhere (without worrying about where the calling script is positioned), you can just use something like this:

    function docReady(fn) {
        // see if DOM is already available
        if (document.readyState === "complete" || document.readyState === "interactive") {
            // call on next available tick
            setTimeout(fn, 1);
        } else {
            document.addEventListener("DOMContentLoaded", fn);
        }
    }    
    

    Usage:

    docReady(function() {
        // DOM is loaded and ready for manipulation here
    });
    

    If you need full cross browser compatibility (including old versions of IE) and you don’t want to wait for window.onload, then you probably should go look at how a framework like jQuery implements its $(document).ready() method. It’s fairly involved depending upon the capabilities of the browser.

    To give you a little idea what jQuery does (which will work wherever the script tag is placed).

    If supported, it tries the standard:

    document.addEventListener('DOMContentLoaded', fn, false);
    

    with a fallback to:

    window.addEventListener('load', fn, false )
    

    or for older versions of IE, it uses:

    document.attachEvent("onreadystatechange", fn);
    

    with a fallback to:

    window.attachEvent("onload", fn);
    

    And, there are some work-arounds in the IE code path that I don’t quite follow, but it looks like it has something to do with frames.


    Here is a full substitute for jQuery’s .ready() written in plain javascript:

    (function(funcName, baseObj) {
        // The public function name defaults to window.docReady
        // but you can pass in your own object and own function name and those will be used
        // if you want to put them in a different namespace
        funcName = funcName || "docReady";
        baseObj = baseObj || window;
        var readyList = [];
        var readyFired = false;
        var readyEventHandlersInstalled = false;
    
        // call this when the document is ready
        // this function protects itself against being called more than once
        function ready() {
            if (!readyFired) {
                // this must be set to true before we start calling callbacks
                readyFired = true;
                for (var i = 0; i < readyList.length; i++) {
                    // if a callback here happens to add new ready handlers,
                    // the docReady() function will see that it already fired
                    // and will schedule the callback to run right after
                    // this event loop finishes so all handlers will still execute
                    // in order and no new ones will be added to the readyList
                    // while we are processing the list
                    readyList[i].fn.call(window, readyList[i].ctx);
                }
                // allow any closures held by these functions to free
                readyList = [];
            }
        }
    
        function readyStateChange() {
            if ( document.readyState === "complete" ) {
                ready();
            }
        }
    
        // This is the one public interface
        // docReady(fn, context);
        // the context argument is optional - if present, it will be passed
        // as an argument to the callback
        baseObj[funcName] = function(callback, context) {
            if (typeof callback !== "function") {
                throw new TypeError("callback for docReady(fn) must be a function");
            }
            // if ready has already fired, then just schedule the callback
            // to fire asynchronously, but right away
            if (readyFired) {
                setTimeout(function() {callback(context);}, 1);
                return;
            } else {
                // add the function and context to the list
                readyList.push({fn: callback, ctx: context});
            }
            // if document already ready to go, schedule the ready function to run
            if (document.readyState === "complete") {
                setTimeout(ready, 1);
            } else if (!readyEventHandlersInstalled) {
                // otherwise if we don't have event handlers installed, install them
                if (document.addEventListener) {
                    // first choice is DOMContentLoaded event
                    document.addEventListener("DOMContentLoaded", ready, false);
                    // backup is window load event
                    window.addEventListener("load", ready, false);
                } else {
                    // must be IE
                    document.attachEvent("onreadystatechange", readyStateChange);
                    window.attachEvent("onload", ready);
                }
                readyEventHandlersInstalled = true;
            }
        }
    })("docReady", window);
    

    The latest version of the code is shared publicly on GitHub at https://github.com/jfriend00/docReady

    Usage:

    // pass a function reference
    docReady(fn);
    
    // use an anonymous function
    docReady(function() {
        // code here
    });
    
    // pass a function reference and a context
    // the context will be passed to the function as the first argument
    docReady(fn, context);
    
    // use an anonymous function with a context
    docReady(function(context) {
        // code here that can use the context argument that was passed to docReady
    }, ctx);
    

    This has been tested in:

    IE6 and up
    Firefox 3.6 and up
    Chrome 14 and up
    Safari 5.1 and up
    Opera 11.6 and up
    Multiple iOS devices
    Multiple Android devices
    

    Working implementation and test bed: http://jsfiddle.net/jfriend00/YfD3C/


    Here’s a summary of how it works:

    1. Create an IIFE (immediately invoked function expression) so we can have non-public state variables.
    2. Declare a public function docReady(fn, context)
    3. When docReady(fn, context) is called, check if the ready handler has already fired. If so, just schedule the newly added callback to fire right after this thread of JS finishes with setTimeout(fn, 1).
    4. If the ready handler has not already fired, then add this new callback to the list of callbacks to be called later.
    5. Check if the document is already ready. If so, execute all ready handlers.
    6. If we haven’t installed event listeners yet to know when the document becomes ready, then install them now.
    7. If document.addEventListener exists, then install event handlers using .addEventListener() for both "DOMContentLoaded" and "load" events. The “load” is a backup event for safety and should not be needed.
    8. If document.addEventListener doesn’t exist, then install event handlers using .attachEvent() for "onreadystatechange" and "onload" events.
    9. In the onreadystatechange event, check to see if the document.readyState === "complete" and if so, call a function to fire all the ready handlers.
    10. In all the other event handlers, call a function to fire all the ready handlers.
    11. In the function to call all the ready handlers, check a state variable to see if we’ve already fired. If we have, do nothing. If we haven’t yet been called, then loop through the array of ready functions and call each one in the order they were added. Set a flag to indicate these have all been called so they are never executed more than once.
    12. Clear the function array so any closures they might be using can be freed.

    Handlers registered with docReady() are guaranteed to be fired in the order they were registered.

    If you call docReady(fn) after the document is already ready, the callback will be scheduled to execute as soon as the current thread of execution completes using setTimeout(fn, 1). This allows the calling code to always assume they are async callbacks that will be called later, even if later is as soon as the current thread of JS finishes and it preserves calling order.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

If you view the jquery code below you will see the famous $(document).ready(function(){ that
I know that the live() event handles event bubbling different than all other jQuery
We all know that it's possible to define custom jQuery selectors that start with
As you all know, the $.post function for jQuery is quite awesome, but the
Hello I have this snippet of jQuery code jQuery(document).ready(function($) { $.get(<?echo $site['url'];?>modules/tuitting/tuitting_core/classes/count.php, function (data)
I'm using a jquery ui dialog to let the user know that his request
I am using jquery for all my ajax thing, I don't know if that
I want to use a JQuery check all function in a form like this:
How do I know, using jQuery, if all or none of the following checkboxes
I have been tinkering with javasript (jquery) all day. I want to create a

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.