[removed]how to write $(document).ready like event without jquery

后端 未结 7 1652
醉梦人生
醉梦人生 2020-11-27 04:19

in jquery $(document).ready(function) or $(function) , how could I do the same thing without jquery, and I need browser compatiable, and allow to attach more than one functi

相关标签:
7条回答
  • 2020-11-27 04:36

    This is all you need if you're supporting IE9+ and modern (2013) versions of Chrome, FF, Safari, etc.

    function ready(event) {
        // your code here
        console.log('The DOM is ready.', event);
        // clean up event binding
        window.removeEventListener('DOMContentLoaded', ready);
    }
    
    // bind to the load event
    window.addEventListener('DOMContentLoaded', ready);
    
    0 讨论(0)
  • 2020-11-27 04:36

    Edit

    The DomReady event does not exist nativly in javascript. You can implement your own by following some wonderful work done by people like Dean Edwards here and here with those in place you can perform a similar event attachment process on document instead of window.


    Check out user83421's answer to How do I add an additional window.onload event in Javascript

    To recap here as well.

    if (window.addEventListener) // W3C standard
    {
      window.addEventListener('load', myFunction, false); // NB **not** 'onload'
    } 
    else if (window.attachEvent) // Microsoft
    {
      window.attachEvent('onload', myFunction);
    }
    
    0 讨论(0)
  • 2020-11-27 04:37

    This is the way jQuery wraps the functions you're looking for - the snippet does not need jQuery, and is cross-browser compatible. I've replaced all calls to jQuery.ready() with yourcallback - which you need to define.

    What goes on in here:

    • first, the function DOMContentLoaded is defined, which will be used when the DOMContentLoaded event fires - it ensures that the callback is only called once.
    • a check if the document is already loaded - if yes, fire the callback right away
    • otherwise sniff for features (document.addEventListener / document.attachEvent) and bind the callbacks to it (different for IE and normal browsers, plus the onload callback)

    Lifted from jQuery 1.4.3, functions bindReady() and DOMContentLoaded:

    /*
    * Copyright 2010, John Resig
    * Dual licensed under the MIT or GPL Version 2 licenses.
    * http://jquery.org/license
    */
    // Cleanup functions for the document ready method
    // attached in the bindReady handler
    if ( document.addEventListener ) {
    DOMContentLoaded = function() {
        document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
        //jQuery.ready();
                yourcallback();
    };
    
    } else if ( document.attachEvent ) {
    DOMContentLoaded = function() {
        // Make sure body exists, at least, in case IE gets a little overzealous 
                if ( document.readyState === "complete" ) {
            document.detachEvent( "onreadystatechange", DOMContentLoaded );
            //jQuery.ready();
                        yourcallback();
        }
        };
    }
    
    // Catch cases where $(document).ready() is called after the
    // browser event has already occurred.
    if ( document.readyState === "complete" ) {
        // Handle it asynchronously to allow scripts the opportunity to delay ready
    //return setTimeout( jQuery.ready, 1 );
        // ^^ you may want to call *your* function here, similarly for the other calls to jQuery.ready
        setTimeout( yourcallback, 1 );
    }
    
    // Mozilla, Opera and webkit nightlies currently support this event
    if ( document.addEventListener ) {
        // Use the handy event callback
    document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
    // A fallback to window.onload, that will always work
    //window.addEventListener( "load", jQuery.ready, false );
        window.addEventListener( "load", yourcallback, false );
     // If IE event model is used
     } else if ( document.attachEvent ) {
            // ensure firing before onload,
            // maybe late but safe also for iframes
            document.attachEvent("onreadystatechange", DOMContentLoaded);
    
            // A fallback to window.onload, that will always work
            window.attachEvent( "onload", yourcallback );
    
     }
    

    That's 51 lines of pure JavaScript code, just to register the event reliably. As far as I know, there is no easier method. Goes to show what the wrappers like jQuery are good for: they wrap the capability sniffing and ugly compatibility issues so that you can focus on something else.

    0 讨论(0)
  • 2020-11-27 04:39

    Smallest DOMReady code, ever.

    <html>
      <head>
        <script>
          var ready = function (f) {
            (/complete|loaded|interactive/.test(document.readyState)) ?
                f() :
                setTimeout(ready, 9, f);
          };
        </script>
      </head>
      <body>
        <script>
          ready(function () {
            alert('DOM Ready!');
          });
        </script>
      </body>
    </html>
    
    0 讨论(0)
  • 2020-11-27 04:39

    Here's a method I use that seems to work reliably

    function ready(func) {
      var span = document.createElement('span');
      var ms = 0;
      setTimeout(function() {
        try {
          document.body.appendChild(span);
    
          document.body.removeChild(span);
    
          //Still here? Then document is ready
          func();
        } catch(e) {
          //Whoops, document is not ready yet, try again...
    
          setTimeout(arguments.callee, ms);
        }
      }, ms);
    }
    

    Pretty simple, it just keeps trying to append an empty <span> element to document.body. If the document is not "ready" an exception will be thrown, in which case it tries again with a new setTimeout call. Once no exception is thrown, it calls the callback function.

    I'd be happy to hear if there are any problems with this method. It has worked well for me, but I have not done the extensive testing that would be natural to any popular Javascript framework.

    0 讨论(0)
  • 2020-11-27 04:55

    I've seen lots of different ways of trying to do this. The simplest way (suggested by yahoo initially, I think) is to just call your initializer function after the close body tag, a bit obtrusive, but it's a single line.

    0 讨论(0)
提交回复
热议问题